SHIROのIchigoJam日記

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

ダンジョン探索ゲーム

※さらに改造して、マップを自動生成するバージョンを作りました。
www.ichigojaman.jp

地下1~3階のダンジョンに潜って探索するRPGです。
その昔のテキストダンジョンゲーム「ローグ」(Rogue)を参考に作りました。
メインプログラムが1kバイト目一杯でこれ以上機能を増やせませんが、結構楽しんで遊べます。
f:id:shiro0922:20211012162923p:plain

遊び方

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

画面表示

f:id:shiro0922:20211012170358p:plain

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

プログラム

ファイル0にメインプログラム、ファイル1~3にマップ3面のデータを入れて、ファイル0から起動してください。

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

1 CLV:N=1:M=3:F=N:L=1:H=50:J=H
2 P=46:CLS:BEEP20:LRUNF
3 GSB27:LC0,22:?CHR$(24):?CHR$(24);
4 U=X-BTN(28)+BTN(29):V=Y-BTN(30)+BTN(31):Q=SCR(U,V)
5 IFQ=0||Q=32||Q=45||Q=124||Q=249GOTO3
6 WAIT6:LCX,Y:?CHR$(P):LCU,V:?CHR$(249):X=U:Y=V:P=Q:CLK
7 IFP=64BEEP10,30:LC0,22:?"*CLEAR* ";:END
8 IFP=36GSB13:WAIT99
9 IFP=60&&F>NF=F-1:GOTO2
10 IFP=62&&F<MF=F+1:GOTO2
11 IFP>64&&P<91GSB17
12 IF!FCLK:ENDELSEGOTO3
13 LC0,22:?"*ゲット:";:P=46:R=RND(200)
14 IFR<2&&!D?"ユウシャノツルギ":D=1:RTN
15 IFR<4&&!E?"ユウシャノヨロイ":E=1:RTN
16 ?"ヤクソウ":H=H+20*(H<J):RTN
17 LC0,22:?"*BATTLE*"
18 I=(P-65)*10+10:B=I
19 GSB29
20 A=RND(10+L*2)*(D+1):BEEP:I=I-A:I=I*!(I<0):GSB29
21 IFI<1GOTO26
22 R=B-L*2:IFR<0R=0
23 A=RND(10+R)/(E+1):BEEP30:H=H-A:H=H*!(H<0):GSB27:WAIT99
24 IFH>0GOTO20
25 BEEP30,30:LC0,22:?CHR$(24);"ユウシャシス...";:F=0:RTN
26 BEEP10,30:LC0,22:?CHR$(24);"モンスターヲタオシタ!";:L=L+1:J=J+5:P=46:RTN
27 LC0,21:?"FL=";F;" LV=";L;" HP=";H;
28 ?" [";CHR$(D*43,E*45);"]  ";:RTN
29 LC0,23:?"モンスター[";CHR$(P);"] HP=";I;"  ";:WAIT99:RTN

ファイル1:フロア1のマップ

100 'FL-1
101 ?"   -------"
102 ?"   |..A..|"
103 ?"   |.....#######"
104 ?"   |..$..|     #"
105 ?"   |.....|     #"
106 ?"   -------     #"
107 ?"               #"
108 ?"           ----#----"
109 ?"           |$....$.|"
110 ?"           |.......|"
111 ?"     #######.......|"
112 ?"     #     |.......|"
113 ?"     #     ------#--"
114 ?"     #           #"
115 ?"-----#---        #"
116 ?"|.......|        #    ---------"
117 ?"|.....$.|        #    |$....$.|"
118 ?"|.$.....|        ######....C..|"
119 ?"|...B...|             |......>|"
120 ?"---------             ---------"
200 X=15:Y=10
201 LRUN 0,3

ファイル2:フロア2のマップ

100 'FL-2
101 ?"-------"
102 ?"|<....|"
103 ?"|.....#######"
104 ?"|..$..|     #    --------------"
105 ?"|.....|     ######............|"
106 ?"-------          |..$.........|"
107 ?"                 |............|"
108 ?"      ############L........$..|"
109 ?"      #          |............|"
110 ?"      #          --------------"
111 ?"  ----#---"
112 ?"  |......|"
113 ?"  |.$....|"
114 ?"  |......|"
115 ?"  |.....M######"
116 ?"  --------    #   -----------"
117 ?"              #   |..$......|"
118 ?"              #####.........--"
119 ?"                  |....$...N>|"
120 ?"                  ------------"
200 X=2:Y=2
201 LRUN 0,3

ファイル3:フロア3のマップ

100 'FL-3
101 ?"----------"
102 ?"|<....$..|"
103 ?"|........|"
104 ?"|..$.....|"
105 ?"|........|"
106 ?"|...$...X#####   --------------"
107 ?"----------   #   |.....$......|"
108 ?"             #####.........$..|"
109 ?"                 |............|"
110 ?"                 |....$.......|"
111 ?"                 |Y...........|"
112 ?"                 -#------------"
113 ?"                  #"
114 ?" ##################"
115 ?" #"
116 ?"-#----------------------------"
117 ?"|.....$......................|"
118 ?"|...................$.......Z@|"
119 ?"|....$.........$.............|"
120 ?"------------------------------"
200 X=2:Y=2
201 LRUN 0,3

攻略作戦

フロアの階を移動するとマップが初期化されることを利用して、最初はフロア1と2を往復してひたすらレベルを上げましょう。フロア2をクリアするにはレベル30くらい、フロア3までオールクリアするにはレベル70くらいが必要です。フロア2をクリアする頃には、勇者の剣と勇者の鎧も確実に揃うでしょう。

プログラムの改造

  • ファイル1~3のマップは、ただPRINT命令(?)で20行分のマップを表示しているだけなので、好きなように改造できます。200行のXとYの値は、勇者の初期位置です。普通の床「.」の位置に設定してください。201行「LRUN 0,3」の1番目の数字は、メインプログラムのファイル番号です。メインプログラムの保存番号を変えた時は、この数字を変えてください。
  • メインプログラム1行目の「N=1:M=3」はマップファイル番号の開始値と終了値です。EEPROMなどを使ってマップのファイル番号を変えたり数を増やしたりした時は、この設定を変えてください。例えばファイル101~105にマップを保存した時は「N=101:M=105」にしてください。
  • 子ども向けプログラミング教室のネタとしては、メインプログラムをいじるのは難しいので、それぞれでマップを作って、EEPROMでみんなのマップをつなげて「大ダンジョン!」なんてやると面白いんじゃないでしょうか。今のマップはそれほど難しくないので、強いモンスターを多数配置するなど冒険しがいのあるマップをぜひ作ってみてください。

(10/13追記)メインプログラムVer.2

内部で経験値の概念を導入。弱いモンスターを倒してもなかなかレベルが上がりませんが、強いモンスターを倒すとレベルが上がりやすくなります(その分ゲームオーバーするリスクと引き替え)。
オリジナルバージョンよりハードで、攻略時間がかかるので、教室よりも自分1人で遊ぶ時に向いています。

1 CLV:CLS:N=1:M=3:F=N:L=50:H=50:J=H
2 P=46:CLS:BEEP20:LRUNF
3 GSB25:LC0,22:?CHR$(24):?CHR$(24);
4 U=X-BTN(28)+BTN(29):V=Y-BTN(30)+BTN(31):Q=SCR(U,V)
5 IFQ=0||Q=32||Q=45||Q=124||Q=249GOTO3
6 WAIT6:LCX,Y:?CHR$(P):LCU,V:?CHR$(249):X=U:Y=V:P=Q:CLK
7 IFP=64BEEP10,30:LC0,22:?"*CLEAR* ";:END
8 IFP=36GSB13:WAIT99
9 IFP=60&&F>NF=F-1:GOTO2
10 IFP=62&&F<MF=F+1:GOTO2
11 IFP>64&&P<91GSB17
12 IF!FCLK:ENDELSEGOTO3
13 LC0,22:?"*ゲット:";:P=46:R=RND(999)
14 IFR=1&&!D?"ユウシャノツルギ":D=1:RTN
15 IFR=2&&!E?"ユウシャノヨロイ":E=1:RTN
16 ?"ヤクソウ":H=H+20*(H<J):RTN
17 LC0,22:?"*BATTLE*":I=(P-65)*10+10:B=I:GSB27
18 A=RND(10+L/25)*(D+1):BEEP:I=I-A:I=I*!(I<0):GSB27
19 IFI<1GOTO24
20 R=B-L/25:IFR<0R=0
21 A=RND(R)/(E+1):BEEP30:H=H-A:H=H*!(H<0):GSB25:WAIT99
22 IFH>0GOTO18
23 BEEP30,30:LC0,22:?CHR$(24);"ユウシャシス";:F=0:RTN
24 BEEP10,30:LC0,22:?CHR$(24);"モンスターヲタオシタ!";:L=L+B/2:J=J+B/10:P=46:RTN
25 LC0,21:?"FL=";F;" LV=";L/50;" HP=";H;
26 ?" [";CHR$(D*43,E*45);"]  ";:RTN
27 LC0,23:?"モンスター[";CHR$(P);"] HP=";I;"  ";:WAIT99:RTN

(10/13追記)教室向けプログラミングテキスト

プログラミングテキスト(PDF)