「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、 横 + 0、 5、 5、 色) 四角を描く(縦 + 0、 横 + 0、 1、 1、 0) 四角を描く(縦 + 4、 横 + 0、 1、 1、 0) 四角を描く(縦 + 0、 横 + 4、 1、 1、 0) 四角を描く(縦 + 4、 横 + 4、 1、 1、 0) 壁に当たった?(縦、 横、 方向) とは 当たった? → 0 方向 ≧ 0 なら 縦 → (縦 + (4 × (方向 = 1))) ÷ 5 横 → (横 + (4 × (方向 = 3))) ÷ 5 メモリ[100 + (20 × 縦) + 横] = 1 なら 当たった? → 1 出力 → 当たった? 迷路内を消す(縦、 横) とは 壁を設定(縦、 横、 0、 0) 迷路内を設定(縦、 横、 色) とは 壁を設定(縦、 横、 色、 1) 壁を設定(縦、 横、 色、 壁) とは 四角を描く((5 × 縦) + 1、 (5 × 横) + 1、 3、 3、 色 × 壁) メモリ[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、 横回数 × 5 + 2、 1、 1、 色) 横回数 → 横回数 + 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]