このページでは、ゲームの監督スクリプトを記述していきます。ワガハイ式ぷよぷよにおける監督スクリプトの主なお仕事を書き出すと以下のようになります。
・ぷよの落下が完了次第、同色ぷよが4個以上隣り合っているぷよを消滅させる
・ぷよを消した際、左上の「○○個消した」の所の数字を更新
・組ぷよ出現位置にぷよが残っていたらゲームオーバー画面に移行
・ぷよ消滅後、残ったぷよに再落下の指示
細かいことを言うとまだまだあるんですが、主な所はこんな感じです。これから順番に実装していくのですが、まずは一番上のぷよの落下が完了次第、同色ぷよが4個以上隣り合っているぷよを消滅させるのスクリプト文を書いていきます。
ぷよぷよの根幹部分と言っても過言ではないゲームの最重要部分になりますが、実はあること(下で説明します)を知らないとスクリプトに書き下す難易度がとても高くなってしまいます。私ワガハイも最終的にスクリプトは自分で書きましたが、スクリプトを書く上での基本のアイデアについては幾つかのページを参考にしました(現状ワガハイのUnity制作の中で、スクリプトの書き方の方針面でつまづいて色々ネット検索したのは後にも先にもこの部分のみです…)。何でこのゲーム制作を第一号に選んだんや…(絶望)。
とはいえ、結果的には割とスッキリしたスクリプトに纏まりました。一つ一つポイントを押さえていけば難しくありませんので、落ち着いて理解していきましょう!
まずは基本の方向性を決めていきましょう。やることは同色ぷよが4個以上隣り合っているぷよを消滅させる、です。なので、同色ぷよが何個隣り合っているかをカウントする必要があります。このカウントの仕方をどうするかが悩み所になります。
方法は色々あると思いますが、ここでは(おそらく)広く一般的に使われているアルゴリズムを導入します。私ワガハイも本当はオリジナルのアイデアを考えたかったのですが、正直難しくて断念…orz。(ここに書いた方法以外の方法がある方、教えて下さいm(_ _)m)
そして、以下のような手順でカウントしていきます。難しく説明するのは理解する方も大変なので、今回は寸劇方式でいきますね。
監督「では0番のぷよさん、自分の左右上下を確認して下さーい」
0番ぷよ「はーい(^O^)/、右だけ同色の奴がいまーす、2番ぷよでーす」
監督「分かりましたー、では次に2番ぷよさん、自分の左右上下(左の0番除く)を確認して下さーい」
2番ぷよ「はーい(^O^)/、同色の奴は(左の0番以外には)いませーん」
監督「分かりましたー、そしたら0番と2番が隣り合ってて同色ですねー、2個だけのセットになってるんであなた方は消えません!それでは次の1番ぷよさん、自分の左右上下を確認して下さーい」
1番ぷよ「はーい(^O^)/、同色の奴はいませーん」
監督「分かりましたー、そしたら1番ぷよさんはぼっち(1個だけ独立)なので消えません!それでは次の2番ぷよは調査済なので飛ばして、さらにその次の3番ぷよさん、…」
こんな具合で17番ぷよまで調査していきます。そうすると、以下のようなグループ分けが出来ます(1つの{ }内が隣り合った同一色グループになります)。↓↓
{0,2}{1}{3}{4}{5}{6,7,12}{8}{9}{10}{11}{13,14,16,17}
で、一番右のグループだけ4個以上のグループになっていますので消える、という具合になります。
さて、こんな感じでカウントしていくスクリプトを記述したいのですが、その際必要になってくる書き方が、関数(メソッド)の再帰呼び出しという書き方になります。
隣り合う同色ぷよ数をカウントするアルゴリズムは色々なブログにて説明されていますが、ほぼ必ずと言っていい程、「再帰」というキーワードが登場します。私ワガハイも最初は「再帰って何やねん!?」ってなりました(笑)。初めて聞く人もいますよねー。
でも実は、別に難しいことは言ってません。要するに、「ある関数(メソッド)の中で自分自身を呼び出すこと」を再帰呼び出しと言います。そんなこと出来んの!?って思いますけど、実は出来ます。以下に単純な例を示します(Startメソッド中に書いています)。
int sum = 0; for (int i = 0;i < 10 ;i++){ sum += i; } Debug.Log(sum);
基本的なfor文による繰り返しですよね。結果は0~9の総和で45になります。
次に、こんなスクリプトはどうでしょうか。実は下のスクリプトでも、0~9の総和である45を出力してくれます。
int n = 9; int sum = Add(n); Debug.Log(sum); int Add(int i){ int result = 0; if (i > 0) result = i + Add(i - 1); return result; }
確かにAddメソッドの中でAddメソッド(自分自身)を呼び出してますね。それだけ聞くと、無限ループしちゃう気がしますが、ちゃんとループの脱出条件(i=0になったら終了)も作ってありますので、有限回のループで済んでいます。今回の場合は、実際には以下のような処理をします。
sum=Add(9)=9+Add(8)=9+8+Add(7)=9+8+7+Add(6)=…=(0~9総和)=45
よって、0~9の総和45を出力してくれます。確かにfor文と同様に、再帰呼び出しも繰り返し処理をスクリプトで書き下すのに使えそうです(上の例のようにfor文で簡単に書ける繰り返し処理に対して再帰呼び出しはあまり使われないと思いますが…)。
この再帰呼び出しを使って、同色ぷよが何個隣り合っているかをカウントするスクリプトを作っていきます。では、いよいよ書いていきましょう…でも、もう記事が長くなったので、次回にまわします!ごめんなさい!
次回はいよいよスクリプトを書いていきます。何故再帰呼び出しが必要になるか、についても次回の記事でもう少し補足していきたいと思います!