Files
@ 0cb3fbe06b5d
Branch filter:
Location: OneEye/src/go/helperboard.py - annotation
0cb3fbe06b5d
1.7 KiB
text/x-python
Go, Engine: some tests and numerous bugfixes
07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 7f1984280936 7f1984280936 7f1984280936 7f1984280936 07f3fda1cbd7 a98de30efa51 a98de30efa51 07f3fda1cbd7 a98de30efa51 a98de30efa51 0cb3fbe06b5d a98de30efa51 a98de30efa51 | from util import EMPTY
## Utility class for finding continuous regions on a Go.board.
class HelperBoard:
def __init__(self,board):
self._refBoard=board # Go.board, readonly
self._boardSize=len(board)
self._board=[[EMPTY]*self._boardSize for i in range(self._boardSize)]
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:
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._visited[self._visitedCount*2]=r
self._visited[self._visitedCount*2+1]=c
self._visitedCount+=1
# check neighbors
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 getContinuousArea(self):
for i in range(self._visitedCount):
yield (self._visited[i*2],self._visited[i*2+1])
def getLiberties(self):
for i in range(self._libCount):
yield (self._libs[i*2],self._libs[i*2+1])
def clear(self):
for i in range(self._visitedCount):
(r,c)=(self._visited[i*2],self._visited[i*2+1])
self._board[r][c]=EMPTY
self._visitedCount=0
for i in range(self._libCount):
(r,c)=(self._libs[i*2],self._libs[i*2+1])
self._board[r][c]=EMPTY
self._libCount=0
|