今日の雑記

生きることでいっぱいいっぱい

今日のSunabaでゲームプログラミング

Game&Watchの「HELMET」簡易版を作ってみた。もちろん完成してない。テスト動画を撮りながら作ったんだが、その動画の趣旨は、

  • プログラムの流れを考えている様と喋りと共にお見せする
  • 目標を設けてそれに向かって作る

の二点。
今回の目標は、

  • ヘルメット君(勝手に命名)を出して左右に動く
  • 物が落ちてくる
  • 右端まで言ったらクリアして再度左端からスタート
  • 落下物に当たったらなんらかしらの処理をする(この時点ではゲームオーバーかどうか決めてなかった)

以上の4点。
とりあえず、ソースをはっつけておく。テキストファイルにコピペして保存して、SunabaにD&Dすれば動く。
開始直後は何も動かないが、リターンキーを押すと始まる。落下物に当たってゲームオーバーになったら動けなくなるが、再度リターンキー押せば開始する。

メモリ[55001] → 1

背景色 → 707070

ヘルメット縦 → 9
ヘルメット横 → 1

落下物存在? → 0
落下物縦 → 0
落下物横 → 0
落下物時間 → 0

ゲーム終わった? → 2
キー押した? → 0
到達した? → 0
待ち時間 → 0

メモリ[0] → 177  # 初期乱数値
乱数種 → 1

背景を書く(背景色)

1 なかぎり
   (ゲーム終わった? = 2) × メモリ[50009] なら
      ヘルメット縦 → 9
      ヘルメット横 → 1
      落下物存在? → 0
      落下物縦 → 0
      落下物横 → 0
      落下物時間 → 0
      ゲーム終わった? → 0
   (ゲーム終わった? = 0) × (到達した? = 0) なら
      # ヘルメット動く
      ヘルメット移動 → 0
      (メモリ[50006] + メモリ[50007]) = 0 なら
         キー押した? → 0
      メモリ[50006] × (キー押した? = 0) なら
         ヘルメット移動 → -2
         キー押した? → 1
         乱数種 → 乱数種 + 7
      メモリ[50007] × (キー押した? = 0) なら
         ヘルメット移動 → 2
         キー押した? → 1
         乱数種 → 乱数種 + 7
      ヘルメット横 → ヘルメット横 + ヘルメット移動
      ヘルメット横 < 1 なら
         ヘルメット横 → ヘルメット横 − ヘルメット移動
      # ヘルメット到達した?
      ヘルメット横 ≧ 11 なら
         到達した? → 1
      # 落下物出す?
      落下物存在? = 0 なら
         落下物存在? → 1
         落下物縦 → 1
         落下物横 → (余り(乱数(乱数種)、 5) × 2) + 1
      # 落下物処理
      落下物存在? = 1 なら
         落下物時間 = 0 なら
            落下物時間 → 30
         落下物時間 > 0 なら
            (落下物縦 = 9) × (ヘルメット横 = 落下物横) なら
               ゲーム終わった? → 1
            落下物時間 → 落下物時間 − 1
            落下物時間 = 0 なら
               落下物縦 → 落下物縦 + 2
               落下物縦 ≧ 11 なら
                  落下物存在? → 0
   # ヘルメット演出
   ヘルメット色 → 0
   (ゲーム終わった? = 1) + (到達した? = 1) なら
      待ち時間 = 0 なら
         待ち時間 → 2 × 60
      待ち時間 > 0 なら
         余り(待ち時間、 30) ≧ 15 なら
            ヘルメット色 → 背景色
         待ち時間 → 待ち時間 − 1
         待ち時間 = 0 なら
            到達した? = 1 なら
               # ヘルメット戻す
               ヘルメット横 → 1
               到達した? → 0
            ゲーム終わった? = 1 なら
               ゲーム終わった? → 2
   #
   画面を更新(ヘルメット縦、 ヘルメット横、 ヘルメット色、 落下物存在?、 落下物縦、 落下物横、 背景色)

画面を更新(ヘルメット縦、 ヘルメット横、 ヘルメット色、 落下物存在?、 落下物縦、 落下物横、 背景色) とは
   落下物を描く(落下物存在?、落下物縦、 落下物横、 0)
   四角を描く(ヘルメット縦 × 8、 ヘルメット横 × 8、 12、 8、 ヘルメット色)
   メモリ[55000] → 1
   落下物を描く(落下物存在?、落下物縦、 落下物横、 背景色)
   四角を描く(ヘルメット縦 × 8、 ヘルメット横 × 8、 12、 8、 背景色)

落下物を描く(存在?、 縦、 横、 色) とは
   存在? = 1 なら
      四角を描く(縦 × 8、 横 × 8、 8、 8、 色)

背景を書く(色) とは
   四角を描く( 0、  0、 100、 100、 色)          # 背景
   四角を描く(86、  0、   2、 100、 604010)      # 地面
   # 家を描く
   四角を描く(52、 94、   4、   6、 0)
   四角を描く(56、 88、   4、  12、 0)
   四角を描く(60、 82、   8、  18、 0)
   四角を描く(68、 84、  18、   2、 0)

四角を描く(縦、 横、 高さ、 幅、 色) とは
   縦回数 → 縦
   縦回数 < (縦 + 高さ) なかぎり
      横回数 → 横
      横回数 < (横 + 幅) なかぎり
         メモリ[60000 + (100 × 縦回数) + 横回数] → 色
         横回数 → 横回数 + 1
      縦回数 → 縦回数 + 1

余り(値、 除数) とは
   出力 → 値 − ((値 ÷ 除数) × 除数)

乱数(種) とは
   メモリ[0] → メモリ[0] + 種 + 115
   メモリ[0] → 余り(メモリ[0]、1024)
   出力 → メモリ[0]

今回は、ゲームの基本的なルール(落下物に当たらないように左端から右端に行く)が実装できた。細かいところで実装できてない点はある。例えば「落下物が複数出てこない」とか「ゴールのドアは開きっぱなし(そもそもドアが無い)」とか「スコアに関するものが何も無い」とか。挙げればきりがないが。
それでも、上記の通りゲーム開始とゲームオーバー&リスタートは実装した。画面に何も出ないので今どういう状態か解らないとは思うが。まあ、「操作できなければゲームオーバー」くらいなら解ってくれるよな。<色々酷い。
今回は目標に掲げてないこともできたのでまあ及第点か。正直な話もう少しがんばれたんだが。
あと、今回は何も考えずに愚直に組んだ。なのでメインループが大変なことになっている。そのままにして出したのもまあわざとだ。今後コレをネタに「綺麗にする」という趣旨のテスト動画とか撮ろうかと思っている。実際にやるかどうかはわからん。というかそろそろ本番公開用の動画を撮ろうかとも思っているんだがなかなか...。
ちなみにコレを組み上げた時間はおよそ1時間40分。