質問編集履歴

2

誤字

2016/09/28 11:35

投稿

sakas1231
sakas1231

スコア42

test CHANGED
File without changes
test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  ただいまコンピュータを対戦相手とした一人用のオセロを作成していまして、その時に今自分が置いた場所とそれによって石がひっくり返った場所を記憶しておく必要があります。
86
86
 
87
- そこでOzero.cs内のメソッドputSpaceとturnOrNotを利用します。
87
+ そこでOzero.cs内のbool[8,8]型変数putSpaceとturnOrNotを利用します。
88
88
 
89
89
  以下のコードで言うところのozero.putSpaceでおいたところをtrueに、turnOrNotでひっくり返ったところをtrueとするbool[8,8]型がそれに当たります。
90
90
 

1

説明不足のため

2016/09/28 11:35

投稿

sakas1231
sakas1231

スコア42

test CHANGED
File without changes
test CHANGED
@@ -67,3 +67,121 @@
67
67
 
68
68
 
69
69
  少し言葉足らずで申し訳ありませんが回答宜しくお願い致します。
70
+
71
+
72
+
73
+
74
+
75
+ **以下編集で追加**
76
+
77
+
78
+
79
+
80
+
81
+ 申し訳ございません、上記のコードはかなり自分なりに簡略化したものでした
82
+
83
+
84
+
85
+ ただいまコンピュータを対戦相手とした一人用のオセロを作成していまして、その時に今自分が置いた場所とそれによって石がひっくり返った場所を記憶しておく必要があります。
86
+
87
+ そこでOzero.cs内のメソッドputSpaceとturnOrNotを利用します。
88
+
89
+ 以下のコードで言うところのozero.putSpaceでおいたところをtrueに、turnOrNotでひっくり返ったところをtrueとするbool[8,8]型がそれに当たります。
90
+
91
+
92
+
93
+ ここでやりたいことは、コンピュータ内で2手先までの全ての可能性を読むのですが(木をイメージしてください)、1手目を読んだ時に置いたところとひっくり返ったところを記憶しておきながら2手目で再び同じ動作をしたいです。(evalあたりは今回は関係ないので省略いたしました)
94
+
95
+ その際に、putSpaceとturnOrNotを二回呼び出さなければいけません。
96
+
97
+ 以下に実際にハマったコードを記載します
98
+
99
+
100
+
101
+ ```c#
102
+
103
+ void Start () {
104
+
105
+ ozero = this.gameObject.GetComponent<Ozero> ();
106
+
107
+ undo = this.gameObject.GetComponent<Undo> ();
108
+
109
+ }
110
+
111
+
112
+
113
+ public void minMax(){ //最初のcpuの思考を考える
114
+
115
+ for (int i = 0; i < 8; i++) {
116
+
117
+ for (int j = 0; j < 8; j++) {
118
+
119
+ if (ozero.canPutOrNot(i,j,false,true)) { //cpuがそこに石を置ける時
120
+
121
+ put = ozero.putSpace; //置いたところとturnしたところを記憶
122
+
123
+ turn = ozero.turnOrNot;
124
+
125
+ x = i; y = j; //cpuが最初に置いた時のxyを記憶
126
+
127
+ ozero.checkTurn *= -1; //ターンチェンジしてこれからplayerに
128
+
129
+ //これからplayerのターン(木の真ん中)
130
+
131
+ minMax2 (); //ここで高さ1の要素一つ分を見終える(*64)
132
+
133
+ evalMax ();
134
+
135
+ minScore = System.Int32.MaxValue; //ここで一旦最小値探索リセット
136
+
137
+ undo.back(put,turn); //undoして振り出しに
138
+
139
+
140
+
141
+ }
142
+
143
+ }
144
+
145
+ }
146
+
147
+ }
148
+
149
+ public void minMax2(){ //playerの思考を考える
150
+
151
+ for (int i = 0; i < 8; i++) {
152
+
153
+ for (int j = 0; j < 8; j++) {
154
+
155
+ if (ozero.canPutOrNot (i, j, false, true)) { //playerがそこに石を置ける時
156
+
157
+ ozero.checkTurn *= -1; //ターンチェンジしてこれからcpuに
158
+
159
+ //これからcpuのターン(木の葉の時)評価してundo
160
+
161
+ evalScore ();
162
+
163
+ evalMin (x, y);
164
+
165
+ undo.back (ozero.putSpace, ozero.turnOrNot); //このパターンの探索終了したら一つ戻す(木の真ん中のplayer)
166
+
167
+
168
+
169
+ }
170
+
171
+ }
172
+
173
+ }
174
+
175
+ }
176
+
177
+ ```
178
+
179
+
180
+
181
+
182
+
183
+ この時、minMax2で最後にozero.backの引数として先ほどの二つを渡しているのですが、この瞬間にozero.putSpaceとozero.turnOrNotが更新されてしまい、最初にputとturnに渡した値が更新されてしまうようです。
184
+
185
+ これの改善方法はありますでしょうか
186
+
187
+ 宜しくお願い致します