大西Scratch日記

Scratch初心者です。勉強するためにブログを始めてみます

配列を疑似的に使ってスネークゲームを作る

古典的なスネークゲームを作りましょう。

f:id:onishi:20170514115905j:plain

スネークゲームとは

  • 自分はヘビ。えさを食べると胴が伸びる
  • 壁や自分自身の胴に当たったらゲームオーバー

という簡単なゲームです。誰しも小学生くらいで作りますよね。

スネークゲームの実装も色々ありますが、胴体の座標の配列を持っていて、配列の操作でお尻を消していく、と言うのが一般的だと思います。

Scratchの変数は、スカラと配列というシンプルなものしかありません。今回は、配列に要素を加えていき、奇数要素はX座標、偶数要素はY座標と決め、配列操作は「必ず2つずつ行う」ということで実現してみました。

遊べるものはこちら。


変数

  • 体の長さ
    • 1から始まり、えさを食べると増えます(サンプルでは2つずつ増えます)
  • 移動量X,Y
    • スネークは進み続けます。常にどちらに向いているかを変数に格納しておき、カーソルキーで方向を変えます
  • 速度
    • スネークの一回の移動距離を調整できるように変数にしました。調整しながら作っていくときは、一箇所変えるといろんな場所が書き換わるように変数を活用すると便利ですね
  • スネーク(配列)
    • この配列に、1回移動するごとに前回の座標を格納するようにしました

変数の操作

f:id:onishi:20170514121050j:plain:w300
移動時はこのように、配列の末尾に現在のX,Y座標を格納してから移動します。

f:id:onishi:20170514121102j:plain:w300
尻尾を消す際は、このように配列の先頭(つまりスネークからすると尻尾)からX,Y座標を取り出してから削除します。1つずつやらないとずれるので注意ですね。

f:id:onishi:20170514122031j:plain:w400
配列の長さ、は配列の要素数です。今回は、X,Y座標を格納しているので「配列の長さ/2」が今の胴の実際の長さですね。これと「体の長さ」という変数を比較することで、尻尾を消すかどうかを判定しています。逆にえさを食べた時の処理は「体の長さ」変数に数字を足すだけです。シンプルですね。

f:id:onishi:20170514122243j:plain:w200
スネーク自身に対する処理は「体の長さ」変数に伸ばしたい数字を足すだけ。あとは食べたえさを消す処理と新しいえさを作る処理です。

その他の工夫

カーソル取得だけのループ

f:id:onishi:20170514121336j:plain:w300
メインループとは別にカーソルを取得するだけのループを作りました。
メインループは速度調整のために、大きなループの中で「0.1秒待つ」と入れています。操作を取得する処理をメインループに入れてしまうと、0.1秒待ってる間は操作できず、入力取得漏れが発生するので、こういう際は別ループにすると良いです。
同じようなことは、キャラクターのアニメーションや、BGMを再生する、などの非同期な処理に便利に使えますので、是非使いこなしたいテクニックですね。

スタンプ

蛇の胴体をたくさん置いていく際に、いちいちクローンを作る必要はありません。
処理が不要なものは「スタンプ」機能を作ると、効率の良いプログラムになります。

f:id:onishi:20170514121844j:plain:w200

Scratchはこのように「色」との当たり判定が使えるので、今回は蛇の胴体を描くのも、尻尾を消すのも、コスチュームを変えてスタンプを置くことで実装しました。

何もない空間にえさを出す

f:id:onishi:20170514122458j:plain:w400
否定の演算ブロックと「まで繰り返す」を組み合わせて、何もないところに新しいえさが置かれるようにしています。Scratchにはループを脱出する構文がないので、この「まで繰り返す」のテクニックは必須です。

その他細かく色々やってるので是非中身を見てみてください!enjoy!!
scratch.mit.edu