diff --git a/src/go/core.py b/src/go/core.py --- a/src/go/core.py +++ b/src/go/core.py @@ -62,7 +62,7 @@ class Go: self._fill(EMPTY) def _fill(self,filling): - for (r,c) in self._helper.continuousArea(): + for (r,c) in self._helper.getContinuousArea(): self.board[r][c]=filling diff --git a/src/go/helperboard.py b/src/go/helperboard.py --- a/src/go/helperboard.py +++ b/src/go/helperboard.py @@ -7,31 +7,44 @@ class HelperBoard: self._refBoard=board # Go.board, readonly self._boardSize=len(board) self._board=[[EMPTY]*self._boardSize for i in range(self._boardSize)] - self._usedCoords=[0]*(self._boardSize**2)*2 - self._usedCount=0 + + self._visited=[0]*(self._boardSize**2)*2 + self._visitedCount=0 + self._libs=[0]*(self._boardSize**2)*2 + self._libCount=0 def floodFill(self,filling,r,c,needle=None): if c<0 or c>=self._boardSize or r<0 or r>=self._boardSize: return False # out of range if self._board[r][c]: return False # already visited if self._refBoard[r][c]==needle: return True # found something - if self._refBoard[r][c]!=filling: return False # out of area boundary + if self._refBoard[r][c]!=filling: + if self._refBoard[r][c]==EMPTY: # remember group liberties + self._board[r][c]=True + self._libs[self._libCount*2]=r + self._libs[self._libCount*2+1]=c + self._libCount+=1 + return False # out of area boundary self._board[r][c]=True # set visited - self._usedCoords[self._usedCount*2]=r - self._usedCoords[self._usedCount*2+1]=c - self._usedCount+=1 + self._visited[self._visitedCount*2]=r + self._visited[self._visitedCount*2+1]=c + self._visitedCount+=1 # check neighbors - return self.floodFill(filling,r,c-1) or \ - self.floodFill(filling,r,c+1) or \ - self.floodFill(filling,r-1,c) or \ - self.floodFill(filling,r+1,c) + return self.floodFill(filling,r,c-1,needle) or \ + self.floodFill(filling,r,c+1,needle) or \ + self.floodFill(filling,r-1,c,needle) or \ + self.floodFill(filling,r+1,c,needle) - def continuousArea(self): - for i in range(self._usedCount): - yield (self._usedCoords[i*2],self._usedCoords[i*2+1]) + def getContinuousArea(self): + for i in range(self._visitedCount): + yield (self._visited[i*2],self._visited[i*2+1]) def clear(self): - for i in range(self._usedCount): - (r,c)=(self._usedCoords[i*2],self._usedCoords[i*2+1]) + for i in range(self._visitedCount): + (r,c)=(self._visited[i*2],self._visited[i*2+1]) self._board[r][c]=EMPTY - self._usedCount=0 + self._visitedCount=0 + for i in range(self._libCount): + (r,c)=(self._libs[i*2],self._visited[i*2+1]) + self._board[r][c]=EMPTY + self._libCount=0