SHIROのIchigoJam日記

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

ダンジョン探索ゲーム

地下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:CLS: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)

キラキラカップ

赤外線人感センサーで人間を検知してフルカラーLEDを光らせるイルミネーション工作です。
IchigoDakeのプログラムで動かすタイプと、遅延電子回路で光らせるタイプがあります。
動画はこちら。

www.youtube.com

外側のプラスチックカップ、オーロラパッキン(透明な梱包材)は100円ショップなどで買えます。
外側のケースは、多くのプラスチックやガラスは赤外線を通さないので、上が開いているカップを使ってセンサーを上に向けるか、ボトルやボールを使う場合は穴を開けてセンサーを外へ通してください。
f:id:shiro0922:20210925170648j:plain
基板や電池ケース(スイッチONの状態にする)をカップに入れて、パッキンで埋めます。LEDはサイドへ向けて、その前方でパッキンを厚くすると良いです。センサーは上の開口部へ向けます。

IchigoDakeタイプ

f:id:shiro0922:20210925170528j:plain
IchigoDakeに拡張基板を差して、フルカラーLEDをプログラムで光らせるタイプです。
電源は単4電池×2本です。

基板

f:id:shiro0922:20210925232724p:plain
f:id:shiro0922:20210925232735p:plain

*同じ基板を6枚割り付けしています。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2021 Shiro Saito (https://www.ichigojaman.jp)

プログラム

赤外線人感センサーで人間を検知すると、フルカラーLEDがランダムな色で約10秒間光ります。

10 @ARUN:'*KIRAKIRA
20 FOR P=2 TO 4
30 OUT P,0
40 NEXT
50 IF !IN(2) CONT
60 CLT
70 FOR P=2 TO 4
80 PWM P,RND(100),100
90 NEXT
100 WAIT 30+RND(30)
110 IF TICK()<600 GOTO 70
120 RUN

電子回路タイプ

f:id:shiro0922:20210925170451j:plain
赤外線人感センサーで人間を検知すると、フルカラーLED(内蔵マイコンで自動で色が変化)が遅延回路で5~6秒間光ります。
電源は単4電池×3本です。

基板

f:id:shiro0922:20210925234003p:plain
f:id:shiro0922:20210925234017p:plain

*同じ基板を4枚割り付けしています。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2021 Shiro Saito (https://www.ichigojaman.jp)

サーボモーター基板

IchigoDyhook+IchigoDake環境でサーボモーターを動かす拡張基板を作りました。
(もちろん通常のIchigoJamでも使えます)

IchigoDyhookからの電源供給では電力不足でサーボモーターを回せないので、単4電池×2本を基板に搭載。
サーボモーターは基板に両面テープで貼り付けています。

f:id:shiro0922:20210917175635j:plain
サーボモーターのアームにストローを差すと、動きがわかりやすいです。

f:id:shiro0922:20210918091608p:plain
サーボモーターはOUT2ポートにつながっていて、PWMコマンドで制御します。
その他、フォトトランジスタをIN2ポートにつないでいます。

基板データ

f:id:shiro0922:20210917230535p:plain

*同じ基板を2枚割り付けしています。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2021 Shiro Saito (https://www.ichigojaman.jp)

プログラム

半分時計


サーボモーターのアームが上向きからスタート。1秒ごとにステップ回転して29秒後に下向きまで行き、30秒で上向きに戻ります。

10 'HALF CLOCK
20 FOR A=230 TO 56 STEP -6
30 PWM 2,A:?A
40 WAIT 60
50 NEXT
60 GOTO 20

駐車場ゲート


プログラムを起動すると、サーボモーターのアームが右向きになります。
フォトトランジスタに指をかざして暗くすると、アームが上へ上がります。指をどけると元に戻ります。

10 'GATE
20 B=ANA(2):?B
30 IF B<200 PWM 2,230 ELSE PWM 2,140
40 WAIT 6
50 GOTO 20

じゃんけん


プログラムを起動して、数字キーの「1」「2」「3」を押すと、サーボモーターのアームが「グー」「チョキ」「パー」を指します。2人で対戦してみましょう。

10 'JANKEN
20 [1]=180:[2]=150:[3]=120
30 K=INKEY():IF !K CONT
40 K=K-48
50 PWM 2,[K]
60 GOTO 30

グー・チョキ・パーの画像素材は、プリントアウトファクトリーのクリップアートを使いました。(ダウンロードには会員登録が必要)
ラベル屋さんで名刺カード台紙に配置して印刷しました。

40 K=RND(3)+1

40行をこのように改造します。何かキーを押すと(Enterキー、スペースキーなど)、IchigoJamがランダムにグー・チョキ・パーを出すようになります。
IchigoJamと対戦してみましょう。