続・GMC-4用「宝探しゲーム」
先日書き込んだ「宝探しゲーム」。
作ったときのメモがもう一枚出てきました。二人用に改造したバージョンです。
; 宝探しゲーム 2人プレイ用 ; 出題者がボタン(0〜F)のいずれか1箇所に宝物を埋める。 ; プレイヤーは、埋められている宝を決められた回数以内に掘り当てれば勝ち。 ; ;<ゲーム準備 2人プレイ用> ; 出題者のキー入力(宝を埋める場所の指定)が行われるまで待つ。 ; プレイヤーが間違えても良い回数は3回 L_STDBY: ; キーが押されるまで待ち、入力された値を表示してメモリ5Fに格納する TIY F ; YrにFを代入 L_WAIT: KA ; キー入力した値(0-F)をArに代入 JUMP L_WAIT ; キーが押されていなければL_WAITへ AO ; Arの値を7segLEDに表示 AM ; メモリ50+Yr(F)にArの値を代入する ; メモリ5DにArを2回右シフトした値(埋めた位置のY座標)を代入する CAL SIFT ; Arを右シフト(前がAMなので実行Flag=1) TIY D ; YrにDを代入、実行フラグ=1 CAL SIFT ; Arを右シフト AM ; メモリ50+Y(D)にArの値を代入 ; 間違えても良い回数をArに設定 TIA 3 ; Arに3を代入 ;<以下1P2P共通> ; ここでArの値は間違えても良い回数を示す。 CAL LONS ; Long音を鳴らす(ゲームスタート) L_DSPST: ; 間違えても良い回数を表示 AO ; Arの値を7segLEDに表示 ; Arを各用途に使用するので、Brへ間違えても良い回数を退避 CH ; ArとBrの値を交換、YrとZrの値を交換 ; チェックする場所のキー入力があるまで待つ L_TRY: KA ; キー入力した値(0-F)をArに代入 JUMP L_TRY ; キーが押されていなければL_TRYへ ; メモリ5Eにチェックする場所の値を保管する。 TIY E ; YrにEを代入する AM ; メモリ50+Yr(E)にArの値を代入する ; 完全一致チェック ; 掘った場所と埋めた場所の番地の比較を行う ; 計算の結果、Arには埋めた場所と掘った場所の番地の差が代入される TIY F ; YrにFを代入する M- ; Arに メモリ50+Yr(F)の値-Arの値 を代入 CIA 0 ; Arと0を比較 JUMP L_CHKXY ; 一致しないならL_CHKXYへ ; 正解したのでエンド音を鳴らして後処理へ CAL ENDS ; エンド音を鳴らす JUMP L_FIN ; L_FINへ L_CHKXY: ; XYの一致チェック ; 同じX座標に埋められているかを調べる ; この時点でArは埋めた場所と掘った場所の番地の差なので、 ; Arの下位2bitが00であればX座標が一致している。 ; ワークにメモリ5Cを使って、Arの値を4倍し上位2bitを除外する。 TIY C ; YrにCを代入する AM ; メモリ50+Yr(C)にArの値を代入する M+ ; Arに メモリ50+Yr(C)の値+Arの値 を代入 M+ ; Arに メモリ50+Yr(C)の値+Arの値 を代入 M+ ; Arに メモリ50+Yr(C)の値+Arの値 を代入 ; Arが0ならX座標が一致している。異なっている場合、警告する。 CIA 0 ; Arと0を比較 CAL SHTS ; 一致していないならShort音を鳴らす ; 同じY座標に埋められているかを調べる ; チェックする位置の上位2bitと埋めた位置の下位2bitを比較 ; Arにチェックする位置を代入 TIY E ; YrにEを代入する MA ; Arにメモリ50+Yr(E)の値を代入 ; Arの下位2bitを除外し、メモリ5Dの値から引いた値をArに代入 CAL SIFT ; Arを右シフト(前がAMなので実行Flag=1) TIY D ; YrにDを代入、実行フラグ=1 CAL SIFT ; Arを右シフト M- ; Arに メモリ50+Yr(D)の値-Arの値 を代入 ; Arが0ならY座標が一致している。異なっている場合、警告する。 CIA 0 ; Arと0を比較 CAL SHTS ; 一致していないならShort音を鳴らす ; 正解しなかったので、間違えても良い回数の残りを1減算し ; GameOverしたかを調べる ; 間違えても良い回数はBrに退避していたのでA CH ; ArとBrの値を交換、YrとZrの値を交換 ; 1減算の代わりとしてFを足す AIA F ; ArにFを足す ; 桁上がりしたときは、Fを足す前のArが0でなかったことを意味する JUMP L_DSPST ; 桁上がりなら探索続行、L_DSPSTへ ; 間違えても良い回数を超えても正解しなかったのでGameOver CAL ERRS ; エラー音を鳴らす。 ; 後処理 L_FIN: ; 正解、GameOverいずれの場合も、埋めた場所を確認するため ; メモリ5Fの値を表示 TIY F ; YrにFを代入する MA ; Arにメモリ50+Yr(F)の値を代入 AO ; Arの値を7segLEDに表示 ; 次ゲームの準備 JUMP L_STDBY ; L_STDBYへ
準備部分だけが1人プレイ用と異なります。
探索部分は1人プレイ用、2リプレイ用で共通というところがポイント。
コードは以下のとおり。
探索部分のコードがずれないようにしたので、ダンプ上でも、1人プレイ用と2人プレイ用の違いはメモリ02〜10の内容だけ。
00:A F 0 F 0 2 1 4 08:E 6 A D E 6 4 8 10:3 E A 1 2 0 F 1 18:5 A E 4 A F 7 C 20:0 F 2 9 E 7 F 4 28:9 A C 4 6 6 6 C 30:0 E 9 A E 5 E 6 38:A D E 6 7 C 0 E 40:9 2 9 F F 1 3 E 48:8 A F 5 1 F 0 0
遊び方。
コードを入力したあと、1、RUNでプログラムがスタートします。
最初に、出題者が宝を埋める場所として任意のボタン(0〜F)を押します。
7segLEDに埋めた場所が一旦表示され、Long音がなって探索開始。
(ここまでボタンや表示がプレイヤーに見えないように操作)
探索中は、7SegLEDには残りの間違えてもよい回数が表示されます。
プレイヤーは宝を掘るため、埋まっていると思う場所の数字ボタン(0〜F)を押します。
見事、宝にヒットしたらEnd音が鳴り、探索終了。
間違えた場合、警告音が宝の埋まっている場所のヒントになります。
Short音が1回なら今掘った位置と縦か横が同じ、2回なら縦も横も違います。
間違えるたびに残りの間違えても良い回数が減っていき、
0のときに間違えるとゲームオーバー。エラー音が鳴ります。
ヒットでもゲームオーバーでも、確認のために7segLEDに宝の埋まっていた場所が表示され、最初に戻ります。