Files @ f9ab2070bd69
Branch filter:

Location: OneEye/src/go/helperboard.py

Laman
Engine: more tests and fixes
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