今日の雑記

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

「Sunabaで作ろうゲームプログラミング」

「某場所」で生放送で作ってみたゲーム。ドットイートゲーム。その名も「パクパクマン」。
全19枠で合計9時間なんだけど、雑談とか色々してたので、実質の作業時間は恐らく7時間程度くらいだと思われる。
一応ゲームの流れは一通り出来てる。モンスターも同時に4体出てくる。簡単なプレイヤー追跡ルーチンも入ってる。それなりに真剣に遊ばないと割りとやられるかな?
相変わらず細かいことを気にし始めるときりが無いんだけど、ステージクリア型で敵が出てくるゲームをSunabaで組んだらこうなるかしら?という程度のサンプルにでもなれば。
以下全ソース。正直整理とかしきれてないのでちょっと雑&長い。全350行。

#
#  「Sunaba」で作ろう。ゲームプログラミング。
#
#     お題「Dot eat game」
#

メモリ[55001] → 1

背景色 → 102090

自機色 → 808020
自機縦 → 4500
自機横 → 5000
自機移動方向 → -1
自機移動速度 → 75

敵色 → 505050
敵移動速度 → 50

敵縦 → 0
敵横 → 0
敵移動方向 → 01

餌色 → 707010

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

待機時間 → 0     # ゲームを始めるまでの待機時間
ゲーム中? → 0   # ゲームをプレイしている状態

壁を描く(背景色)
敵を配置()

1 なかぎり
   ゲーム中? = 0 なら
      メモリ[50009] なら
         # ゲームの初期化
         迷路を設定(乱数種、 背景色、 餌色)
         自機縦 → 4500
         自機横 → 5000
         自機移動方向 → -1
         敵を配置()
         待機時間 → 60
         ゲーム中? → 1
   ゲーム中? なら
      待機時間 なら
         待機時間 → 待機時間 − 1
      待機時間 = 0 なら
         # 自機移動
         自機縦移動 → 0
         自機横移動 → 0
         自機移動方向 → 自機移動する?(自機縦、 自機横、 自機移動方向)
         自機移動方向 ≧ 0 なら
            自機移動方向 ≦ 1 なら
               自機縦移動 → ((2 × 自機移動方向) − 1) × 自機移動速度
            自機移動方向 ≧ 2 なら
               自機横移動 → ((2 × (自機移動方向 − 2)) − 1) × 自機移動速度
         自機縦 → 自機縦 + 自機縦移動
         自機横 → 自機横 + 自機横移動
         壁に当たった?(自機縦 ÷ 100、 自機横 ÷ 100、 自機移動方向) なら
            自機縦 → 自機縦 − 自機縦移動
            自機横 → 自機横 − 自機横移動
         # 敵移動
         敵番号 → 0
         敵番号 < 4 なかぎり
            敵縦移動 → 0
            敵横移動 → 0
            敵縦 → メモリ[1000 + (敵番号 × 3) + 0]
            敵横 → メモリ[1000 + (敵番号 × 3) + 1]
            敵移動方向 → メモリ[1000 + (敵番号 × 3) + 2]
            敵移動方向 ≠ -1 なら
               敵移動方向 ≦ 1 なら
                  敵縦移動 → ((2 × 敵移動方向) − 1) × 敵移動速度
               敵移動方向 ≧ 2 なら
                  敵横移動 → ((2 × (敵移動方向 − 2)) − 1) × 敵移動速度
            敵縦 → 敵縦 + 敵縦移動
            敵横 → 敵横 + 敵横移動
            壁に当たった?(敵縦 ÷ 100、 敵横 ÷ 100、 敵移動方向) なら
               敵縦 → 敵縦 − 敵縦移動
               敵横 → 敵横 − 敵横移動
            敵移動方向 → 敵曲がる?(乱数種、 敵番号、 敵縦、 敵横、 敵移動方向、 自機縦、 自機横)
            メモリ[1000 + (敵番号 × 3) + 0] → 敵縦
            メモリ[1000 + (敵番号 × 3) + 1] → 敵横
            メモリ[1000 + (敵番号 × 3) + 2] → 敵移動方向
            敵番号 → 敵番号 + 1
         # ステージクリア判定
         餌全部食べた?() なら
            迷路を設定(乱数種、 背景色、 餌色)
            自機縦 → 4500
            自機横 → 5000
            自機移動方向 → -1
            敵を配置()
            待機時間 → 60
         # 敵との判定
         敵に当たった?(自機縦、 自機横、 -1) なら
            ゲーム中? → 0
   # ループの終端
   画面を更新(自機縦、 自機横、 自機色、 敵色、 餌色)
   乱数種 → 乱数種 + 1
   乱数種 → 余り(乱数種、 1024)

自機移動する?(縦、 横、 方向) とは
   縦 → 縦 ÷ 100
   横 → 横 ÷ 100
   (余り(縦、 5) = 0) × (余り(横、 5) = 0) なら
      餌を食べる(縦、 横)
      メモリ[50004] なら
         壁に当たった?(縦 − 5、 横、 方向) = 0 なら
            方向 → 0
      メモリ[50005] なら
         壁に当たった?(縦 + 5、 横、 方向) = 0 なら
            方向 → 1
      メモリ[50006] なら
         壁に当たった?(縦、 横 − 5、 方向) = 0 なら
            方向 → 2
      メモリ[50007] なら
         壁に当たった?(縦、 横 + 5、 方向) = 0 なら
            方向 → 3
   出力 → 方向

敵を配置() とは
   メモリ[1000 + (0 × 3) + 0] → 500   # 縦座標
   メモリ[1000 + (0 × 3) + 1] → 500   # 横座標
   メモリ[1000 + (0 × 3) + 2] → 1     # 方向
   メモリ[1000 + (1 × 3) + 0] → 8500  # 縦座標
   メモリ[1000 + (1 × 3) + 1] → 8500  # 横座標
   メモリ[1000 + (1 × 3) + 2] → 0     # 方向
   メモリ[1000 + (2 × 3) + 0] → 500   # 縦座標
   メモリ[1000 + (2 × 3) + 1] → 8500  # 横座標
   メモリ[1000 + (2 × 3) + 2] → 2     # 方向
   メモリ[1000 + (3 × 3) + 0] → 8500  # 縦座標
   メモリ[1000 + (3 × 3) + 1] → 500   # 横座標
   メモリ[1000 + (3 × 3) + 2] → 3     # 方向

敵に当たった?(自機縦、 自機横、 番号) とは
   当たった? → 0
   敵番号 → 0
   自機縦 → 自機縦 ÷ 100
   自機横 → 自機横 ÷ 100
   (敵番号 < 4) × (敵番号 ≠ 番号) × (当たった? = 0) なかぎり
      敵縦 → メモリ[1000 + (敵番号 × 3) + 0] ÷ 100
      敵横 → メモリ[1000 + (敵番号 × 3) + 1] ÷ 100
      (敵縦 ≦ (自機縦 + 2)) × ((敵縦 + 4) ≧ (自機縦 + 2)) なら
         (敵横 ≦ (自機横 + 2)) × ((敵横 + 4) ≧ (自機横 + 2)) なら
            当たった? → 1
      敵番号 → 敵番号 + 1
   出力 → 当たった?

敵曲がる?(種、 番号、 敵縦、 敵横、 敵方向、 自機縦、 自機横) とは
   敵縦 → 敵縦 ÷ 100
   敵横 → 敵横 ÷ 100
   自機縦 → 自機縦 ÷ 100
   自機横 → 自機横 ÷ 100
   縦方向 → 0
   横方向 → 0
   (余り(敵縦、 5) = 0) × (余り(敵横、 5) = 0) なら
      方向転換 → 0
      余り(乱数(種)、 100) ≧ 50 なら
         方向 → 自機追跡(敵縦、 敵横、 敵方向、 自機横、 自機縦)
         敵方向 ≠ 方向 なら
            敵方向 → 方向
            方向転換 → 1
      # 正面が壁だったら
      方向転換 = 0 なら
         縦方向 → 0
         横方向 → 0
         敵方向 = 0 なら
            縦方向 → -5
         敵方向 = 1 なら
            縦方向 → 5
         敵方向 = 2 なら
            横方向 → -5
         敵方向 = 3 なら
            横方向 → 5
         壁に当たった?(敵縦 + 縦方向、 敵横 + 横方向、 敵方向) なら
            (方向転換 = 0) × (敵方向 = 0) なら
               敵方向 → 2
               方向転換 → 1
            (方向転換 = 0) × (敵方向 = 1) なら
               敵方向 → 3
               方向転換 → 1
            (方向転換 = 0) × (敵方向 = 2) なら
               敵方向 → 1
               方向転換 → 1
            (方向転換 = 0) × (敵方向 = 3) なら
               敵方向 → 0
               方向転換 → 1
      敵に当たった?(敵縦 × 100、 敵横 × 100、 番号) なら
         敵方向 ≦ 1 なら
            敵方向 → 1 - 敵方向
         敵方向 ≧ 2 なら
            敵方向 → 2 + (敵方向 = 2)
   出力 → 敵方向

自機追跡(敵縦、 敵横、 敵方向、 自機横、 自機縦) とは
   縦方向 → 0
   横方向 → 0
   方向 → 0
   # 自機と縦軸が合った?
   (敵縦 − 自機縦) = 0 なら
      (敵横 < 自機横) なら
         方向 → 3
      (敵横 > 自機横) なら
         方向 → 2
      方向 = 2 なら
         横方向 → -5
      方向 = 3 なら
         横方向 → 5
      壁に当たった?(敵縦 + 縦方向、 敵横 + 横方向、 方向) = 0 なら
         敵方向 → 方向
   # 自機と横軸が合った?
   (敵横 − 自機横) = 0 なら
      (敵縦 < 自機縦) なら
         方向 → 1
      (敵縦 > 自機縦) なら
         方向 → 0
      方向 = 0 なら
         縦方向 → -5
      方向 = 1 なら
         縦方向 → 5
      壁に当たった?(敵縦 + 縦方向、 敵横 + 横方向、 方向) = 0 なら
         敵方向 → 方向
   出力 → 敵方向

自機を描く(自機縦、 自機横、 自機色) とは
   キャラを描く(自機縦、 自機横、 自機色)

敵を描く(色) とは
   番号 → 0
   番号 < 4 なかぎり
      縦 → メモリ[1000 + (番号 × 3) + 0]
      横 → メモリ[1000 + (番号 × 3) + 1]
      キャラを描く(縦、 横、 色)
      番号 → 番号 + 1

キャラを描く(縦、 横、 色) とは
   縦 → 縦 ÷ 100
   横 → 横 ÷ 100
   四角を描く(縦 + 0、 横 + 055、 色)
   四角を描く(縦 + 0、 横 + 0110)
   四角を描く(縦 + 4、 横 + 0110)
   四角を描く(縦 + 0、 横 + 4110)
   四角を描く(縦 + 4、 横 + 4110)

壁に当たった?(縦、 横、 方向) とは
   当たった? → 0
   方向 ≧ 0 なら
      縦 → (縦 + (4 × (方向 = 1))) ÷ 5
      横 → (横 + (4 × (方向 = 3))) ÷ 5
      メモリ[100 + (20 × 縦) + 横] = 1 なら
         当たった? → 1
   出力 → 当たった?

迷路内を消す(縦、 横) とは
   壁を設定(縦、 横、 00)

迷路内を設定(縦、 横、 色) とは
   壁を設定(縦、 横、 色、 1)

壁を設定(縦、 横、 色、 壁) とは
   四角を描く((5 × 縦) + 1、 (5 × 横) + 133、 色 × 壁)
   メモリ[100 + (20 × 縦) +  横] → 壁

餌を食べる(縦、 横) とは
   縦 → 縦 ÷ 5
   横 → 横 ÷ 5
   メモリ[100 + (20 × 縦) + 横] → 0

餌全部食べた?() とは
   食べきった? → 1
   縦回数 → 1
   縦回数 < 18 なかぎり
      横回数 → 1
      横回数 < 18 なかぎり
         メモリ[100 + (20 × 縦回数) + 横回数] = 2 なら
            食べきった? → 0
         横回数 → 横回数 + 1
      縦回数 → 縦回数 + 1
   出力 → 食べきった?

餌を描く(色) とは
   縦回数 → 1
   縦回数 < 18 なかぎり
      横回数 → 1
      横回数 < 18 なかぎり
         メモリ[100 + (20 × 縦回数) + 横回数] = 2 なら
            四角を描く((5 × 縦回数) + 2、 横回数 × 5211、 色)
         横回数 → 横回数 + 1
      縦回数 → 縦回数 + 1

壁を描く(背景色) とは
   回数 → 0
   回数 < 19 なかぎり
      壁を設定(回数、    0、 背景色、 1)
      壁を設定(回数、   18、 背景色、 1)
      壁を設定(   0、 回数、 背景色、 1)
      壁を設定(  18、 回数、 背景色、 1)
      回数 → 回数 + 1

壁にする?(縦、 横、 種) とは
   壁? → 1
   余り(縦、 2) なら
      壁? → 0
   (横 = 1) + (横 = 10) + (横 = 17) なら
      壁? → 0
   (余り(乱数(種)、 100) < 25) なら
      壁? → 0
   出力 → 壁?

迷路を設定(種、 背景色、 餌色) とは
   縦回数 → 1
   縦回数 < 18 なかぎり
      横回数 → 1
      横回数 < 18 なかぎり
         迷路内を消す(縦回数、 横回数)
         壁? → 壁にする?(縦回数、 横回数、 種)
         壁? なら
            迷路内を設定(縦回数、 横回数、 背景色)
         壁? = 0 なら
            メモリ[100 + (20 × 縦回数) +  横回数] → 2
         横回数 → 横回数 + 1
      縦回数 → 縦回数 + 1
   餌を描く(餌色)

画面を更新(自機縦、 自機横、 自機色、 敵色、 餌色) とは
   餌を描く(餌色)
   敵を描く(敵色)
   自機を描く(自機縦、 自機横、 自機色)
   メモリ[55000] → 0   # 画面に反映
   餌を描く(0)
   敵を描く(0)
   自機を描く(自機縦、 自機横、 0)

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

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

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