Changeset - a98de30efa51
[Not reviewed]
default
0 2 0
Laman - 7 years ago 2017-12-08 00:59:02

HelperBoard remembers group liberties
2 files changed with 30 insertions and 17 deletions:
0 comments (0 inline, 0 general)
src/go/core.py
Show inline comments
 
@@ -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
 

	
 

	
src/go/helperboard.py
Show inline comments
 
@@ -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
0 comments (0 inline, 0 general)