〇印、あるいは×印が3つ繋がっている場所があるかを確認する勝敗判定処理を実装します。
問題は、どのようにマス目の〇印が3つ繋がっているかを判定するか、です。
まず、縦方向・横方向・斜め方向と、印を確認すべき方向が3種類ありますので、こちらをどのようにして判定していくかを決める必要があります。
今回のゲームではマス目は Grid ゲームオブジェクトを9個利用して作成しており、かつ、この Grid ゲームオブジェクトには
GridController スクリプトがそれぞれにアタッチされていて、マス目の番号を管理している状態になっています。
ゲーム画面
ゲーム内の Grid の番号
この情報を活用していき、縦方向と横方向と斜め方向について、マス目の番号を指定して、判定を行う設計にします。
例えば、横方向であれば、0、1、2 のマス、3、4、5のマス、6、7、8のマスの3つのパターンを判定します。
こちらについては、このパターン通りに3つの情報を if 文の条件式としてもよいですが、非常に長い処理になってしまいますので、
3つのパターンになっている数字を解析して
アルゴリズム(計算方法)を考えてみます。
横方向であれば、1つの行を3回繰り返すことになりますので、こういったケースには3つの数字パターンを検証し、
繰り返しの処理を上手く活用して(for 文と配列の組み合わせ)ロジックを考えてアルゴリズムを作ることが処理の効率化につながります。
繰り返しの処理に配列を組み合わせて利用する理由は、マス目の情報を GridController スクリプトが管理しており(マス目の番号やオーナーシンボルの情報)、
それを管理しているのが、grids 配列になっているためです。
配列の要素番号の指定部分を変数にして、n 番目の配列の要素 = GridController の情報を参照するように設計します。
横方向について1つの行ごとに判定したいマス目の番号をみてみると、前の行の値を3ずつ増やしていけば、
次の行の値として利用できるパターンが浮かびあがってきます。
そしてそれを実際に for 文と配列を使ってロジック化すると、次のような式が作成できます。
<for 文と配列を使った横方向の判定処理のアルゴリズム>
// 横方向
// 0,1,2 || 3,4,5 || 6,7,8 のマスを確認する
for (int x = 0; x < 3; x++) {
if (grids[x * 3] // 左のマスの判定値 x * 3 の結果なので、grids[0(0 * 3)] / grids[3(1 * 3)] / grids [6(2 * 3)] となる
&& grids[x * 3 + 1] // 真ん中のマスの判定値 x * 3 + 1の結果なので、grids[1(0 * 3 + 1)] / grids[4(1 * 3 + 1)] / grids [7(2 * 3 + 1)] となる
&& grids[x * 3 + 2]) // 右のマスの判定値 x * 3 +2 の結果なので、grids[2(0 * 3 + 2)] / grids[5(1 * 3 + 2)] / grids [8(2 * 3 + 2)] となる
{
// 上記の条件をすべて満たせば、3つそろっているので勝ちになる
}
for 文がループするたびに x の値が加算されるため、このロジックを使うことにより、横方向の3パターンについては、すべて確認を行うことが可能になっています。
if 文内の条件式が && でつながっていますので、3つの条件をすべて満たしているかどうかを比較評価しています。
同じ要領で、縦方向と斜め方向についても、調べたいマス目をすべて書き出し、それを繰り返す処理を使ってアルゴリズムを作るにはどうすればいいのかを考えてみてください。
実際の処理は、上記の for 文に手を加えて、Grid のオーナーシンボルの情報を精査します。
その際も、〇と×で処理を分けてしまうと、〇と×以外の判定部分についてはすべて同じ処理を記述しないとならなくなるため、
この部分も for 文を利用し、1つのメソッド内で両方の処理が行えるような設計にします。
ロジックに加えて、アルゴリズムを作ることは非常に難しいですが、テーブルゲームの多くはアルゴリズムを考えることが重要なので、とてもよい頭の体操になります。