SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

ダンジョン探索ゲーム(マップ自動生成版)

★すぐに遊べるIchigoJam web版はこちら↓
http://comich.net/ichigojam/dungeon.html

先日作ったダンジョン探索ゲーム
www.ichigojaman.jpを、facebookのIchigoJam-FANグループで公開したのですが、それを改造してくださった方がいました。ゲームバランスを調整すると共に、フロアマップを12個のユニットに分けて短いデータで持つ素晴らしい工夫で、かなり面白くなりました。
そのプログラムをいただいてさらに改造。文字ROMのカタカナ部分のデータを使って、マップをB1F~B25Fまで自動生成するようにしました。
f:id:shiro0922:20211028132059p:plain
全25フロアをクリアするのは果てしない冒険です。
(2時間くらいかかります。途中で勇者の剣や鎧を入手する幸運があれば、早く終わります)

遊び方

  • あなたは勇者になって、地下ダンジョンを探索します。カーソルキー(矢印キー)の上下左右で勇者を操作します。
  • ダンジョンは地下1階(B1F)からスタートします。地下25階(B25F)にある「勇者の印」を手に入れるのが最終目的です。

画面説明

f:id:shiro0922:20211028140901p:plain

  • 「.」…普通の床。
  • 「-」「|」…壁。通り抜けられません。
  • 「#」…廊下。廊下の中は移動できますが、脇へ出ることはできません。
  • 「$」…宝箱。宝箱を取るとアイテムがゲットできます。
    • ほとんどは「薬草」で、勇者のHP(体力)が20ポイント回復します(現在の最大値まで)。
    • 「勇者の剣(つるぎ)」…勇者の攻撃ポイントが2倍になります。
    • 「勇者の鎧(よろい)」…モンスターからの攻撃で受けるダメージを半分にします。
  • 「A」~「Z」…モンスター。「A」が一番弱く、「Z」が一番強いです。モンスターに出会うとバトルとなり、勇者とモンスターがターン制で互いに攻撃します。モンスターのHPを0にすると勝利です。勇者のHPが0になるとゲームオーバーです。
    • モンスターを倒すと勇者の経験値が上がります。強いモンスターを倒すと得られる経験値も増えます。経験値がある程度上がると勇者のレベルが上がり、攻撃力や防御力が上がります。
  • 「<」「>」…階段。「<」は上り階段で、1フロア上へ上ります。「>」は下り階段で、1フロア下へ下ります。フロアを上下移動するとマップが初期化されて、モンスターや宝箱が復活します。
    • 廊下の生成に一部乱数が入っているので、ごくまれに下り階段まで辿り着けないことがあります。その時は上のフロアへ一度戻って、もう一度下のフロアへ下りてください。レベルアップのために何度か往復していればいずれ道が開けます。
  • 「@」…勇者の印。最下層にあります。これをゲットするとゲームクリアです。
  • 画面の下3行はステータス表示で、通常は勇者の状態が表示されます。「[ ]」内はアイテムで、勇者の剣を持っていると「+」、勇者の鎧を持っていると「-」が表示されます。モンスターとのバトルになると、モンスターのHPやバトル勝敗などが表示されます。

プログラム

メインプログラムをファイル0、マップ生成プログラムをファイル1に置いて、ファイル0から実行してください。
※連続したファイル番号であればよいです。0番・1番でなくても構いません。

メインプログラム(ファイル0)

※10/28修正

  • ステータス行を1行上へ変更
  • アイテム出現のバグ修正
1 CLV:F=1:L=1:M=8:H=M
2 BEEP20:C=46:CLS:LRUNFILE()+1
3 GSB25:LC0,21:?CHR$(24):?CHR$(24);
4 W=X-BTN(28)+BTN(29):V=Y-BTN(30)+BTN(31):S=SCR(W,V):CLK
5 IFS=0||S=32||S=45||S=124||S=249GOTO4
6 LCX,Y:?CHR$(C):X=W:Y=V:C=S:LCX,Y:?CHR$(249):WAIT6
7 IFC=36GOTO13
8 IFC=60&&F>1F=F-1:GOTO2
9 IFC=62&&F<25F=F+1:GOTO2
10 IFC=64BEEP10,30:LC0,21:?"*CLEAR":END
11 IFC>64&&C<91GSB18
12 GOTO4
13 LC0,21:?"*";:C=46:R=RND(255)
14 IFR=1&&!O?"ユウシャノ ツルギ";:O=1
15 IFR=2&&!D?"ユウシャノ ヨロイ";:D=1
16 IF!R||R>2?"ヤクソウ";:H=H+20:IFH>MH=M
17 ?"ヲ テニ イレタ":WAIT90:GOTO3
18 LC0,21:?"*BATTLE":R=(C-64):P=R*3:GSB26
19 A=L*4*(O+1)-RND(R*2):A=A*!(A<0):BEEP
20 P=P-A:P=P*!(P<0):GSB26:IFP<1GOTO24
21 A=R*2-RND(L*4*(D+1)):A=A*!(A<0):BEEP30
22 H=H-A:H=H*!(H<0):GSB25:WAIT90:IFH>0GOTO19
23 BEEP30,30:LC0,21:?CHR$(24);"*ユウシャ シス":END
24 BEEP10,30:LC0,21:?CHR$(24);"*モンスターヲ タオシタ":E=E+R:L=L+(E>L*L*8):M=L*8:C=46:WAIT90:GOTO3
25 LC0,20:?"B";F;"F L";L;" H";H;"/";M;" E";E;" [";CHR$(O*43,D*45);"] ":RTN
26 LC0,22:?"モンスター";CHR$(C);" H";P;" ":WAIT90:RTN

マップ生成プログラム(ファイル1)

※10/28修正

  • ユニットのループをシンプルにしてバイト数を削減
  • B3F・B4F・B8Fを例外処理して、下り階段のルームへ廊下を確実に接続
  • ユニット8(左下)のルームが孤立しやすいので、廊下をつなげる例外処理
  • 以上の対策で、下り階段へ辿り着けなかったり、孤立したルームや廊下があるフロアはほぼ無くなるはず
1 T=(F-1)*12+177*8
2 FORY=0TO2:V=Y*6:FORX=Y%2TO3STEP2:W=X*6+3
3 Z=X+Y*4:Q=PEEK(T+Z):U=16*(Q>15):IFQ&10U=15
4 IFZ=0U=17
5 IFX=2&&Y=2U=18+(F=25)
6 IFU>15GSB22
7 IFU=15GSB18:GSB19:GSB20:GSB21
8 [Z]=U:NEXT:NEXT
9 FORY=0TO2:V=Y*6:FORX=1-Y%2TO3STEP2:W=X*6+3
10 Z=X+Y*4:U=0
11 IFZ=9&&(F=3||F=4||F=8)GSB19:GSB20
12 IFX>0Q=Z-1:GSB33:IFAOR[Q]&2>0GSB18:[Q]=[Q]+32
13 IFX<3Q=Z+1:GSB33:IFAOR[Q]&1>0GSB19:[Q]=[Q]+32
14 IFY>0Q=Z-4:GSB33:IFAOR[Q]&8>0GSB20:[Q]=[Q]+32
15 IFY<2Q=Z+4:GSB33:IFAOR[Q]&4>0GSB21:[Q]=[Q]+32
16 [Z]=U:NEXT:NEXT
17 X=6:Y=2:LRUNFILE()-1,3
18 LCW,V+3:?"####":U=U|1:RTN
19 LCW+3,V+3:?"####":U=U|2:RTN
20 FORI=0TO3:LCW+3,V+I:?"#":NEXT:U=U|4:RTN
21 FORI=3TO6:LCW+3,V+I:?"#":NEXT:U=U|8:RTN
22 LCW,V:?"-------":FORI=1TO5:LCW,V+I:?"|.....|":NEXT:LCW,V+6:?"-------"
23 LCW+1,V+3:GSB29:LCW+5,V+3:GSB29:LCW+3,V+1:GSB29:LCW+3,V+5:GSB29
24 LCW+3,V+3
25 IFU=17?"<"
26 IFU=18?">"
27 IFU=19?"@"
28 RTN
29 R=RND(3)
30 IFR=1?"$"
31 IFR=2?CHR$(64+F+RND(2))
32 RTN
33 A=!RND(1+[Q]/32*2)*[Q]+(Q>7)*[8]:RTN

フロアユニット配列[0]~[11]の値は以下のようになっています。

  • ルームなし=0
  • 廊下←=+1
  • 廊下→=+2
  • 廊下↑=+4
  • 廊下↓=+8
  • ルーム通常=16
  • ルーム<=17
  • ルーム>=18
  • ルーム@=19
  • 廊下接続=+32×本数

攻略作戦

勇者のレベル(L*)は、同じ階層(B*F)のモンスターを倒せる程度だと思ってください。フロア階層と同等のレベルになるように、フロアを上下に往復してレベルを上げていってください。途中で勇者の剣や鎧が手に入れば、もっと低いレベルでも攻略できます。

IchigoJam web版

IchigoJam webで遊べるようにしました。画面に「Loaded ○byte」を表示しないように対策しています。
http://comich.net/ichigojam/dungeon.html