口で説明するのが少し難しいのでお手数ですがまずはこのシンプルなコードを見てみてください
C#
1public class Input{ 2 public bool b = false; 3}
C#
1public class Output{ 2 bool b; 3 Input data; 4 void Start(){ 5 data = this.gameObject.getComponent<Input>(); 6 } 7 public void boFalse(){ 8 this.b = data.b; //この時点でthis.b = data.b = false 9 boTrue(); //data.bをtrueに帰るboTrueを呼び出す 10 print(this.b); //この時data.bがboTrueによってtrueとなったのでthis.bもtrueに変わり出力結果はtrue 11 } 12 13 public void boTrue(){ 14 data.b = true; //ここで参照しているdata.bをtrueに 15 } 16} 17
まずこの二つのクラスは同じオブジェクトにアタッチされているのでthis.gameObject.getComponentでdataにInputコンポーネントを代入します。
するとまるで同期したかように、data.bの値を変えるとthis.bの値も同時に変わります。
これを防ぐためにはどうすればいいのでしょうか
具体的には、仮にboTrueを呼び出すともちろんdata.bの値はtrueになりますがthis.bの値は変わらずに最初に参照したfalseのままでいる、ということです。
少し言葉足らずで申し訳ありませんが回答宜しくお願い致します。
以下編集で追加
申し訳ございません、上記のコードはかなり自分なりに簡略化したものでした
ただいまコンピュータを対戦相手とした一人用のオセロを作成していまして、その時に今自分が置いた場所とそれによって石がひっくり返った場所を記憶しておく必要があります。
そこでOzero.cs内のbool[8,8]型変数putSpaceとturnOrNotを利用します。
以下のコードで言うところのozero.putSpaceでおいたところをtrueに、turnOrNotでひっくり返ったところをtrueとするbool[8,8]型がそれに当たります。
ここでやりたいことは、コンピュータ内で2手先までの全ての可能性を読むのですが(木をイメージしてください)、1手目を読んだ時に置いたところとひっくり返ったところを記憶しておきながら2手目で再び同じ動作をしたいです。(evalあたりは今回は関係ないので省略いたしました)
その際に、putSpaceとturnOrNotを二回呼び出さなければいけません。
以下に実際にハマったコードを記載します
c#
1void Start () { 2 ozero = this.gameObject.GetComponent<Ozero> (); 3 undo = this.gameObject.GetComponent<Undo> (); 4 } 5 6 public void minMax(){ //最初のcpuの思考を考える 7 for (int i = 0; i < 8; i++) { 8 for (int j = 0; j < 8; j++) { 9 if (ozero.canPutOrNot(i,j,false,true)) { //cpuがそこに石を置ける時 10 put = ozero.putSpace; //置いたところとturnしたところを記憶 11 turn = ozero.turnOrNot; 12 x = i; y = j; //cpuが最初に置いた時のxyを記憶 13 ozero.checkTurn *= -1; //ターンチェンジしてこれからplayerに 14 //これからplayerのターン(木の真ん中) 15 minMax2 (); //ここで高さ1の要素一つ分を見終える(*64) 16 evalMax (); 17 minScore = System.Int32.MaxValue; //ここで一旦最小値探索リセット 18 undo.back(put,turn); //undoして振り出しに 19 20 } 21 } 22 } 23 } 24 public void minMax2(){ //playerの思考を考える 25 for (int i = 0; i < 8; i++) { 26 for (int j = 0; j < 8; j++) { 27 if (ozero.canPutOrNot (i, j, false, true)) { //playerがそこに石を置ける時 28 ozero.checkTurn *= -1; //ターンチェンジしてこれからcpuに 29 //これからcpuのターン(木の葉の時)評価してundo 30 evalScore (); 31 evalMin (x, y); 32 undo.back (ozero.putSpace, ozero.turnOrNot); //このパターンの探索終了したら一つ戻す(木の真ん中のplayer) 33 34 } 35 } 36 } 37 }
この時、minMax2で最後にozero.backの引数として先ほどの二つを渡しているのですが、この瞬間にozero.putSpaceとozero.turnOrNotが更新されてしまい、最初にputとturnに渡した値が更新されてしまうようです。
これの改善方法はありますでしょうか
宜しくお願い致します

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/28 11:20
2016/09/28 12:16 編集
2016/09/28 15:08