監督スクリプトを記述しよう(ぷよ消滅の仕組み作成4)
このページでも、前回に引き続き、監督スクリプトの仕事の一つである、ぷよの落下が完了次第、同色ぷよが4個以上隣り合っているぷよを消滅させるのスクリプト文を書いていきます。
前回、同色ぷよが何個隣り合っているかをカウントするスクリプトが大体書けましたね!ただ、前回のラストのスクリプトではまだ不十分な所がありますので、もう少し補強して、バグの無いスクリプトを作っていきましょう!
さらにスクリプトを補強していこう
前回、最後にちょっとマズいコメントを書いてしまいました…orz コレです↓
一旦落ち着いて…Check(i=0)メソッドが寸劇の内容を再現出来ているか、ご自身で確かめてみて下さい。
だって、前回のスクリプトのままでは、寸劇の内容が再現出来ないんだもの…。こんなん書いたら怒られそうですが…。
実際、前回のスクリプトでCheck(i=0)メソッドを愚直に試すとどうなるでしょう?
Check(i=0):0番ぷよの右に同色の2番ぷよ→Check(i=2):2番ぷよの左に同色の0番ぷよ→Check(i=0):0番ぷよの右に同色の2番ぷよ→Check(i=2):2番ぷよの左に同色の0番ぷよ→Check(i=0):0番ぷよの右に同色の2番ぷよ→Check(i=2):2番ぷよの左に同色の0番ぷよ→…
ええそうです。再帰呼び出しを使っている時に一番気を付けないといけない、無限ループに見事はまってしまいます…。ということで、本記事ではまずそこの修正から始めていきます。
調査済の場合Checkメソッドを再帰呼び出ししない
実は制作手順5-1で書きました寸劇ではこの無限ループにはまらないように、とある一言がさらっと入れてあります。↓の赤字です。
監督「分かりましたー、では次に2番ぷよさん、自分の左右上下(左の0番除く)を確認して下さーい」
2番ぷよ「はーい(^O^)/、同色の奴は(左の0番以外には)いませーん」
2番ぷよの左右上下を確認する際は、0番はもう調査済だから、調べなくて良いよね!っていう話です。よって、スクリプトにも同様の仕掛けを実装してあげましょう。
前回記事の最初に、各ぷよに4種類の変数を定義しましたが、実はまだ1種類定義しただけで何も使っていない変数がありました。checks[i]という奴です。この変数のルールを、デフォルトはchecks[i]=0で、i番ぷよの左右上下の確認が終わったらchecks[i]=1にすると決めます。要するに、checks[i]=1ならCheckメソッドを再帰呼び出ししない、としてしまえば良いのです。スクリプトはこんな感じになります(Checkメソッド周辺は特にいじりません)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public void Check (int i) { this.samecolorset.Add(i) ; //元からchecks[i]=1ならi番ぷよは調査済なので確認しない if(this.checks[i]==1) return ; this.checks[i]=1 ; //これからi番ぷよを調査するので0→1に直しておく for(int j = 0 ; j < this.puyos.Length ; j++) { if(this.puyox[i] == this.puyox[j] && this.puyoy[i] == this.puyoy[j] + 1.0f && this.puyos[i].transform.name == this.puyos[j].transform.name && this.checks[j] ==0){ // <span class="crayon-c">下(j番ぷよ:未調査)と自分自身(i番ぷよ)が同色</span> Check(j); } if(this.puyox[i] == this.puyox[j] && this.puyoy[i] == this.puyoy[j] - 1.0f && this.puyos[i].transform.name == this.puyos[j].transform.name && this.checks[j] ==0){ // <span class="crayon-c">上(j番ぷよ:未調査)と自分自身(i番ぷよ)が同色</span> Check(j); } if(this.puyox[i] == this.puyox[j] + 1.0f && this.puyoy[i] == this.puyoy[j] && this.puyos[i].transform.name == this.puyos[j].transform.name && this.checks[j] ==0){ // <span class="crayon-c">左(j番ぷよ:未調査)と自分自身(i番ぷよ)が同色</span> Check(j); } if(this.puyox[i] == this.puyox[j] - 1.0f && this.puyoy[i] == this.puyoy[j] && this.puyos[i].transform.name == this.puyos[j].transform.name && this.checks[j] ==0){ // <span class="crayon-c">右(j番ぷよ:未調査)と自分自身(i番ぷよ)が同色</span> Check(j); } } return; } |
Checkメソッドの最初の方に2行追加し、そして各方向のぷよ色を確認する4つのif文の条件式に、さらに1つずつ条件を追加しました(前回の記事では条件3つだったのが、更に1つ追加されて4つになりました、長い…(笑))。これで、本記事最初に書きました無限ループは発生しません。それでは改めて、Check(i=0)メソッドが寸劇の内容を再現出来ているか、ご自身で確かめてみて下さい。今度は大丈夫ですよー(笑)。
ワガハイ式ぷよぷよの最大の難関である、同色ぷよが何個隣り合っているかをカウントするスクリプトがこれで書けました。ここまで来れば、もう山は乗り切ったと言っても過言ではありません。監督スクリプトの仕事は、ぷよの落下が完了次第、同色ぷよが4個以上隣り合っているぷよを消滅させるなので、残りはぷよ消滅の手順になります!
ぷよ消滅のスクリプトを書こう
ここまでで同色ぷよが何個隣り合っているかをカウントするスクリプトが完成しました。このスクリプトにより、i番ぷよの隣接同色ぷよ数カウント結果をsamecolornums[i]に入れました。ってことは、samecolornums[i]が4以上ならぷよオブジェクトを削除すれば良いだけです。オブジェクト削除は"Destroy(オブジェクト名)"なので…
1 2 3 4 5 6 7 |
i = 0; foreach (GameObject puyo in this.puyos) { if(this.samecolornums[i]>=4) { Destroy(puyo); } i++ ; } |
これで、監督スクリプト1つ目のお仕事である、ぷよの落下が完了次第、同色ぷよが4個以上隣り合っているぷよを消滅させるのスクリプトがやっと完成しました。監督スクリプトのお仕事は主に4つありました(制作手順5-1のページの最初参照)が、まだ1つ目って…、という感じかもしれませんが、残り3つのお仕事をスクリプトに書き下すのはそこまで難しくありませんのでご安心下さい。次回、一気に書き上げていきます!!