diff --git a/src/go.py b/src/go.py --- a/src/go.py +++ b/src/go.py @@ -1,3 +1,8 @@ +import logging as log + +from gamerecord import GameRecord + + EMPTY=0 BLACK=1 WHITE=-1 @@ -9,6 +14,8 @@ class Go: self.boardSize=boardSize self.board=[[EMPTY]*boardSize for x in range(boardSize)] self._temp=[[EMPTY]*boardSize for x in range(boardSize)] + self.toMove=BLACK + self._record=GameRecord() ## Executes a move. # @@ -17,6 +24,7 @@ class Go: # @param color BLACK or WHITE # @return True on success, False on failure (illegal move) def move(self,color,row,col): + if color!=self.toMove: log.warning("move by %s out of order",color) if self.board[row][col]!=EMPTY: return False self.board[row][col]=color @@ -31,8 +39,17 @@ class Go: if not self._floodFill(color,row,col): self.board[row][col]=EMPTY return False + self._record.move(color,row,col) + self.toMove=-1*color return True + def transitionMove(self,board): + res=transitionMove(self.board,board) + if not res: return res + (r,c,color)=res + return self.move(color,r,c) + + ## Checks for liberties of a stone at given coordinates. # # The stone's group is marked with True in self.temp, ready for capture if needed. Recursively called for stone's neighbors. @@ -57,6 +74,7 @@ class Go: for j in range(self.boardSize): self._temp[i][j]=EMPTY + def exportBoard(board): substitutions={EMPTY:".", BLACK:"X", WHITE:"O"} return "\n".join("".join(substitutions.get(x,"?") for x in row) for row in board) @@ -74,6 +92,24 @@ def isLegalPosition(board): return True +def transitionMove(state1,state2): + moves=[] + for (r,(row1,row2)) in enumerate(zip(state1,state2)): + for (c,(item1,item2)) in enumerate(zip(row1,row2)): + if item1==EMPTY and item2!=EMPTY: + moves.append((r,c,item2)) + + if len(moves)==0: + log.info("no new stone") + return None + elif len(moves)==1: + log.info("new stone: %s",moves[0]) + return moves[0] + else: + log.warning("too many new stones: %s",moves) + return False + + def dfs(stack,board,mask): boardSize=len(board) (r,c)=stack[0]