teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

誤字や文法の修正を行いました。

2018/04/05 11:46

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -3,8 +3,10 @@
3
3
  Python3.6.4でリバーシのプログラムを作成しています。GUI部分はtkinterで実装し、Threadingとソケット通信を使用して非同期処理でAI同士で対局を行わせるプログラムを作成しております。
4
4
  今回、新しい機能として「戻る」「進む」ボタンをクリックすることで対局中でもボードの状態を遡れるような機能を実装しようとしています。
5
5
 
6
- ボードの状態は辞書型のrecordという変数で管理し、具体的なコードでは以下のようにrecordに毎ターンボードの状態を追加していこうと考えております。
6
+ ボードの状態は辞書型のrecordという変数で管理し、具体的なコードではサーバーの処理側で、以下のようにrecordに毎ターンボードの状態を追加していこうと考えております。
7
7
 
8
+ > board.record[board.turn_count] = {'board':copy.deepcopy(board.discs), 'newest_place':board.newest_place}
9
+
8
10
  しかし、毎回17手目でプログラムが停止してしまい例外もキャッチできないため、解決方法が分からず困っております。
9
11
  以下のソースコードのBoardクラスのself.recordという変数で、BoardクラスのreverseDiscという関数内でrecordに要素を追加していっております。
10
12
 
@@ -65,6 +67,8 @@
65
67
  if(board.reverseDisc(player_turn, placeloc) == True):
66
68
  board.newest_place = placeloc # last placed disc
67
69
 
70
+ board.record[board.turn_count] = {'board':copy.deepcopy(board.discs), 'newest_place':board.newest_place}
71
+
68
72
  # draw game info on the listbox
69
73
  gui.addList(player_turn, board.turn_count, placeloc)
70
74
  board.turn_count += 1
@@ -139,145 +143,9 @@
139
143
  main()
140
144
  ```
141
145
 
146
+ ボードクラスやAIクラスも実装しておりますが、文字数の関係で記載することができなかったため、下記のGithubのリンクを参照していただければ幸いです。
142
147
 
143
- Boardクラス(ボードの状態やターンの管理、石をひっくり返す処理等を行っております)
144
- ```python
145
- #!/usr/bin/python3
146
- # -*- coding: utf8 -*-
147
- import tkinter as tk
148
- import copy
149
148
 
150
-
151
- class Board(object):
152
-
153
- def __init__(self, ):
154
- self.discs = [] # disc on the board
155
- self.turn = 'Black' # game turn
156
- self.pass_count = 0 # pass count
157
- self.turn_count = 1 # game count
158
- self.newest_place = -1 # last placed disc index
159
-
160
- # Initialize the board
161
- self.Initialize()
162
-
163
- # Record the board.
164
- self.record = {}
165
- self.record[0] = {'board':copy.deepcopy(self.discs), 'newest_place':copy.deepcopy(self.newest_place)}
166
-
167
-
168
- # Initialize the board
169
- '''
170
- Ban : out of the board.
171
- Space : Free space on the board.
172
- Black : Place where black disc is placed.
173
- White Place where white disc is placed.
174
- CanPlace : Place where player can place disc on this turn.
175
- '''
176
- def Initialize(self, ):
177
- for i in range(100):
178
- self.discs.append('Space')
179
-
180
- for i in range(0, 10):
181
- self.discs[i] = 'Ban'
182
- self.discs[i + 90] = 'Ban'
183
- for i in range(10, 81, 10):
184
- self.discs[i] = 'Ban'
185
- self.discs[i + 9] = 'Ban'
186
- for i in range(0, 90):
187
- if(int(i / 10) == 0 or int(i % 10) == 0 or int(i % 10) == 9):
188
- continue
189
- else:
190
- self.discs[i] = 'Space'
191
-
192
- self.discs[45] = 'Black'
193
- self.discs[54] = 'Black'
194
- self.discs[44] = 'White'
195
- self.discs[55] = 'White'
196
- self.discs[34] = 'CanPlace'
197
- self.discs[43] = 'CanPlace'
198
- self.discs[56] = 'CanPlace'
199
- self.discs[65] = 'CanPlace'
200
-
201
-
202
- # if place index is valid, reverseDisc and return True. else return False
203
- def reverseDisc(self, turn, index):
204
-
205
- if(self.discs[index] != 'CanPlace'):
206
- return False
207
-
208
- list_reverse = []
209
- direction = [-11, -10, -9, -1, +1, +9, +10, +11] # 8 direction search
210
- myDisc = "Black" if (turn == "Black") else "White"
211
- yourDisc = "Black" if (turn == "White") else "White"
212
-
213
- for d in direction:
214
- j = index + d
215
- while(True):
216
- if(self.discs[j] == yourDisc):
217
- list_reverse.append(j)
218
- elif(self.discs[j] == myDisc):
219
- for rev in list_reverse:
220
- self.discs[rev] = myDisc
221
- break
222
- elif(self.discs[j] == "Space" or self.discs[j] == "CanPlace" or self.discs[j] == "Ban"):
223
- list_reverse = []
224
- break
225
- j+= d
226
-
227
- self.discs[index] = myDisc
228
-
229
- self.record[self.turn_count] = {'board':copy.deepcopy(self.discs), 'newest_place':copy.deepcopy(self.newest_place)}
230
-
231
- return True
232
-
233
-
234
- # switch game turn
235
- def switch_turn(self, ):
236
- if(self.turn == 'Black'):
237
- self.turn = 'White'
238
- elif(self.turn == 'White'):
239
- self.turn = 'Black'
240
-
241
-
242
- # Return a list of places you can place after marking on the board
243
- def getCanPlace(self, turn):
244
-
245
- # delete all mark
246
- for index, disc in enumerate(self.discs):
247
- if(disc == "CanPlace"):
248
- self.discs[index] = "Space"
249
-
250
- list_canplace = []
251
- direction = [-11, -10, -9, -1, +1, +9, +10, +11] # 8 direction search
252
- myDisc = "Black" if (turn == "Black") else "White"
253
- yourDisc = "Black" if (turn == "White") else "White"
254
-
255
- for index, disc in enumerate(self.discs):
256
- if (disc == "Space"):
257
- for d in direction:
258
- if (self.discs[index + d] == yourDisc):
259
- k = index + d * 2
260
- while(True):
261
- if(self.discs[k] == "Ban" or self.discs[k] == "Space" or self.discs[k] == "CanPlace"):
262
- break
263
- elif(self.discs[k] == myDisc):
264
- self.discs[index] = "CanPlace"
265
- list_canplace.append(index)
266
- break
267
- k += d
268
- return list_canplace
269
-
270
-
271
- # return disc number
272
- def getDiscNum(self, turn):
273
- number = 0
274
- for disc in self.discs:
275
- if(disc == turn):
276
- number += 1
277
- return number
278
- ```
279
-
280
-
281
149
  # 補足情報(FW/ツールのバージョンなど)
282
150
 
283
151
  プログラムはPython3.6.4で実装しており、今回の機能を実装していないバージョンを[Github](https://github.com/Vimmer-Yamagen/TCPVimRev)で公開しております。