LoginSignup
0
0

More than 1 year has passed since last update.

学研の4ビットマイコンGMC-4で爆弾ゲームを作ってみた。

爆弾ゲーム

爆弾の前にスイッチが何個か並んでいる。
そのうち1個だけ、押すと爆弾が爆発するスイッチがある。

  • 複数人で遊ぶ場合
    • まだ押されていないスイッチを順番に1個ずつ押していく。
    • 爆弾を爆発させた人が負け。
  • 1人で遊ぶ場合
    • スイッチを押していく。
    • 爆弾を爆発させたらゲームオーバー。
    • 爆弾を爆発させずに押していないスイッチを1個だけにできたらクリア。

仕様

実行開始後、何かキーを押すとゲームが開始し、2進LEDが全て点灯する。
ゲーム中、点灯している2進LEDがまだ押されていないスイッチを表す。
0~6の数字キーを押すことで、スイッチを押す。
まだ押されていないスイッチを押したとき、それが爆弾を爆発させるスイッチではなかった場合は、短い音を鳴らす。
爆弾を爆発させるスイッチだった場合は、7セグメントLEDにそのスイッチの番号を表示し、エラー音を鳴らす。

プログラム

以下のプログラムは、MikeAssembler でアセンブルできる。

target gmc4

	; 爆発スイッチの位置をランダムで選ぶため、スタートボタン待機
	TIY 6
start_wait_loop:
	AIY -1
	JUMP random_no_return
	TIY 6
random_no_return:
	KA
	JUMP start_wait_loop
start_release_wait_loop:
	KA
	JUMP start_release_wait_loop_end
	JUMP start_release_wait_loop
start_release_wait_loop_end:
	; 爆発スイッチの位置を[7]に格納する
	CY
	TIY 7
	AM
	; [0]~[6]を「押されていない」に設定し、2進LEDを点灯する
	; (爆発スイッチの位置0~6は、2倍してキャリーが出ない)
led_init_loop:
	AIY -1
	AM
	CAL SETR
	CIY 0
	JUMP led_init_loop
	; メインループ
game_loop:
	KA
	; 範囲外や既に押された所なら、再入力させる
	; 1回押されたら押された所になるので、押し待ち・離し待ちは不要
	; …と思ったが、FX-マイコン シミュレータでは押してなくてもAレジスタが前回入力値になってしまう
	JUMP game_loop
	AIA 0x10 - 7
	JUMP game_loop
	AIA 7
	CY
	MA
	; 0~6(押されていない)の時は飛ばない、F(押された)の時は飛ぶ
	M+
	JUMP game_loop
	; 新しいスイッチが押された
	CY
	TIY 7
	M-
	CIA 0
	JUMP safe_process
	; 押されたのは爆発スイッチだった
	M-
	AO
	CAL ERRS
game_end:
	JUMP game_end
safe_process:
	; 押されたことを記録し、2進LEDを消灯する
	M-
	CY
	TIA 0xF
	AM
	CAL RSTR
	CAL SHTS
	JUMP game_loop

以下は、このプログラムの機械語表現である。

  | 0 1 2 3  4 5 6 7  8 9 A B  C D E F
--+-----------------------------------
0 | A 6 B F  F 0 9 A  6 0 F 0  2 0 F 1
1 | 4 F 0 D  3 A 7 4  B F 4 E  1 D 0 F
2 | 1 8 0 F  2 2 9 9  F 2 2 9  7 3 5 6
3 | F 2 2 3  A 7 7 C  0 F 4 3  7 1 E 8
4 | F 4 0 7  3 8 F 4  E 2 E 9  F 2 2

実行結果

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0