i-school - 2Dまるばつゲーム(三目並べ) 手順7
 引き続き、ゲーム画面にある Grid をクリック(タップ)した際の処理を作成していきます。

 Grid をクリックした際に、Grid の通し番号の情報を GameManager スクリプト側に引数を通じて届くようになりましたので、
次は、この情報を利用してその Grid には○×の印がついているかどうかを判定し、どちらの印もない場合には〇印をつけるようにします。


<実装動画>
動画ファイルへのリンク


 以下の内容で順番に実装を進めていきます。

手順7 ープレイヤーの〇印を配置するー
12.GameManager スクリプトを修正し、配列内の Grid 情報と引数の情報を照合し、○×印がついているかの判定を行う
13.GameManager スクリプトを修正し、○×印がついていない Grid に〇印をつける



 新しい学習内容は、以下の通りです。

 ・配列の情報の利用方法
 ・基礎構文を使ったロジックの組み立て方



12.GameManager スクリプトを修正し、配列内の Grid 情報と引数の情報を照合し、○×印がついているかの判定を行う

1.設計


 Grid をクリックした際に、Grid の通し番号の情報を GameManager スクリプト側に引数を通じて届くようになりましたので、
次は、この情報を利用してその Grid には○×の印がついているかどうかを判定し、どちらの印もない場合には〇印をつけるようにします。

 このページでは、2回の手順に分けて、この処理の実装を考えます。

 まずは、Grid に〇印をつけられるかどうかを判定させる機能を検討します。
この機能が正常に動作することを確認し、その後、クリックした Grid にプレイヤー用の〇印をつける処理を実装します。

 この2つの機能を実装するためには、どのような処理の設計が必要になるかを考えていく必要があります。

 GameManager スクリプトには、全 Grid の情報が GridController 型の配列に代入されて管理されています。
この情報群は、「どの」Grid であるかを調べる際に利用できます。

 ただし、「どの」Grid であるかを調べるためには配列内から Grid を見つけてあげる必要があります。

 この際に、前回の手順で作成した OnClickGrid メソッドの引数の値を利用します。

 クリックした Grid から GridNo の値が OnClickGrid メソッドの引数として届いていますので、
配列内にある Grid を見つける際に利用し、配列内の GridNo 番目の情報を利用する、いう形で活用します。

 実際に処理を書きながら、どんな風に利用しているのかをイメージし、処理を読み解いていってください。
 

2.GameManager スクリプトを修正する


 OnClickGrid メソッド内に処理を追加していきます。今後追加する予定の処理についても TODO を記述しておきます。
どんな処理があれば、考えているイメージを再現することができるかを言語化してみましょう。

 配置した回数をカウントするための変数も追加しておきます。
この情報を活用することにより、引き分けの処理を実装する際に利用します。

 最も重要な処理は配列の活用方法です。設計の部分でもお伝えしたように、配列の要素番号に対して
OnClickGrid メソッドの引数の値を利用することにより、配列内の何番目の Grid であるかを指定して特定しています。

 その後、特定した配列の GridController スクリプトの GridOwnerType 変数の値を確認し、それが None であるか、どうかによって、
○×が記載されている Grid であるかを if 文を利用して、評価判定しています。

 すべて基礎構文の処理なのですが、それらを上手く組み合わせることによって、ロジックを組み立ててイメージしている処理を構築しています。
そのため、基礎学習が大切であるのは、どのような処理になるかを理解した上で、その処理には、どのような活用方法があるか、
応用方法を考えていくことが重要になります。


GameManager.cs

 <= クリックすると開きます。



3.ゲームを実行して動作を確認する


 まずはこの部分までの処理が、どのように動作するのかを確認します。
ゲームを実行し、Grid をクリックしてください。その際に OnClickGrid メソッド内に追記した Debug.Log メソッドが実行されることで
処理の内容を Console ビューにより確認することが出来ます。

 スクリプトの内容は、適宜な位置に Debug.Log メソッドを記述しておくことにより
「処理の流れが見える」ようになりますので、活用する方法を実際に自分で考えていってください。


<実行動画>
動画ファイルへのリンク


 問題なく Debug.Log メソッドが実行されていることが確認できたら、次の手順に移ります。
配列の要素の指定方法についてはしっかりと覚えておく必要がありますので、変数に惑わされないように、処理の内容を理解していくようにしましょう。


13.GameManager スクリプトを修正し、○×印がついていない Grid に〇印をつける

1.設計


 Grid をクリックした際に、Grid の通し番号の情報を元に Grid のオーナーシンボル(○×)の情報を判定できるようになりましたので、
次はどちらの印もない場合には、クリックした Grid に〇印をつけるようにします。

 内容については、OnClickGrid メソッド内の TODO 部分の実装を行います。

 どのような処理があれば、Grid に対して〇印をつける(Text コンポーネントに 〇 と記載する)ように命令を出すことができるかを考えてみてください。



 次回以降ですが、この手順でプレイヤー側の〇印の設置判定と実際に〇印をつける処理を実装し、問題なく動作したら、
次は、〇印が3つ繋がっている場所があるかを確認する勝敗判定処理を実装します。

 そのような手順で実装を進めることにより、プレイヤー側の一連の処理が完成しますので(〇印の配置と勝敗判定)
それを元に、その一連の処理をコンピュータ側の手順として実装します。

 一連の処理の流れを先にプレイヤー側に実装しておくことにより、勝敗判定の処理などがメソッドとして用意できている状態になりますので、
コンピュータ側の処理は、用意されているメソッドを利用しつつ、足りない部分だけを補っていくことで実装が可能になるためです。


2.GameManager スクリプトを修正する


 新しくオーナーシンボル(今回は〇印)をつける処理をまとめた SetOwnerTypeOnGrid メソッドを作成します。

 この SetOwnerTypeOnGrid メソッドの最大のポイントは、引数にオーナーシンボルの情報が提供されている部分です。
 
 引数に〇か×の情報が届くことで、1つのメソッドでありながら、〇と×の両方の文字列の処理に自動的に対応させています
つまり、〇用のメソッド、×用のメソッドと分けて処理を作成する必要がなく、処理の効率化を図ることができています。
よって、先々の手順で作成していくコンピュータ側の×印をつけていく処理についても、この SetOwnerTypeOnGrid メソッドを利用することで処理をつくることが出来ます。

 繰り返し利用したい処理や、一部の情報だけが異なるものの、それ以外は同じ内容になっている処理をつくりたい場合には、
今回のように引数のあるメソッドを作成しておきます。プログラミングはこういった処理が得意であり、重複した処理を書かなくて済むので、
メソッドを活用することが大きなメリットになります。



 SetOwnerTypeOnGrid メソッドでは、クリックした Grid に対して、GameManager スクリプト側から命令を出します。

 よって、ここまでの一連の処理としては、クリックしたら、GridController スクリプトから GameManager スクリプトの OnClickGrid メソッドが実行されて、
最後には、GameManager スクリプトから GridController スクリプトの .UpdateGridData メソッドが実行されることになります。

 この際、UpdateGridData メソッドには引数として、オーナーシンボルの情報と○×の文字列の2つの情報が提供されますので、
それを GridController スクリプト側が活用して、ゲーム画面に〇印を表示する処理を行う、というロジックになっています。


GameManager.cs

 <= クリックすると開きます。



3.処理の流れを把握する


 ここまでの処理の流れを振り返ってみてください。

 ここに説明を記述しておきますが、ご自分の中でも同じイメージで処理が動いているかどうか、確認しておきましょう。
理解が難しい場合には、再度、処理の読み返しや、書き直しを行い、理解を深めてから先に進むようにしてください。


<1.Grid をクリックしたら>
 GridController スクリプト内で Grid ゲームオブジェクトの Button コンポーネントに登録した GameManager スクリプトにある OnClickGrid メソッドを実行する
       ↓
 処理が GameManager スクリプトに移り、GameManager スクリプトの OnClickGrid の引数に、GridController スクリプトの gridNo 変数の情報が届く

 その後、その gridNo 変数を girds 配列変数の要素番号として利用し、クリックした Grid の○×の状態を CurrentGridOwnerType 変数の値で確認します。
特にこの if 文内おける、配列による評価処理が読み解けるかどうかが重要です。配列の要素番号が変数になっており、その番号のを読み解く必要があります。

  grids[no].CurrentGridOwnerType

 grids[no] とは、GridController 型の配列の no 番目の要素を利用する、つまり、no 番目の GridController の情報を利用する、という内容になります。
そして、GridController スクリプトにある CurrentGridOwnerType 変数の値が None である場合、○×のない Grid となりますので、
if 文内の処理に移り、GameManager スクリプトの SetOwnerTypeOnGrid メソッドが実行されます。


<2.Grid に〇印をつける>
 GameManager スクリプトの SetOwnerTypeOnGrid メソッドの中で、GridController スクリプトにある UpdateGridData メソッドを実行する
      ↓
 処理が、GridController スクリプトに移り、GridController スクリプトにある UpdateGridData メソッドの引数に、GridOwnerType の値(Player)と 〇 の文字列が届く
 その情報を、GridController スクリプトが、変数に適用し、ゲーム画面に〇印が表示される

 処理が読み解けるようになれば、上記のような形で自分で処理の流れが説明できるようになります。
このようにプログラムの内容を言語化できるようにがんばっていきましょう。


4.ゲームを実行して動作を確認する


 処理が完成しましたので、最初から今回学習した内容を振り返り、処理の内容の理解を深めてください。

 ゲームを実行して、Grid をクリックしてみてください。
先ほど Debug.Log メソッドで実行していた部分で、今回からは〇印を記述するメソッドを実行することになっていますので、
クリックした Grid に〇印が表示されるようになります。

 また、すでに〇印がある Grid をクリックした場合には、OnClickGrid メソッドの最初ある if 文の評価が false になりますので、
else 文の中に書いてある処理が実行されることになって、Console ビューに配置できないという文字列が表示されます。


<実装動画>
動画ファイルへのリンク



 以上でこの手順は完成です。

 説明でも書きましたが、ここまでの処理はすべて基礎構文によって出来ています
つまり、基礎構文をいかにうまく組み立てていくことが出来るか、そのイメージを作っていくことができるか、がとても重要なスキルになります。

 if 文ではどういったことができる、配列はどういった機能がある、ということを知識として持っているだけではなくて、
それらはどのように使っていけば処理として活用できるのか、処理と処理を組み合わせることでロジックを組み立てていけるのか、を考えていく必要があります。

 これは繰り返し、処理を考えて記述することでしか養うことが出来ません。
たくさん処理を書いて、トライ&エラーを繰り返してスキルアップを図ってください。

 次は 手順8 −勝敗判定機能を実装する− です。