from gameconstants import Cells class GameBoard : def __init__(self): ## default board setting self._initial_board = [ [9,9,9,9,9,9,9,9,9,9], [9,0,0,0,0,0,0,0,0,9], [9,0,0,0,0,0,0,0,0,9], [9,0,0,0,0,0,0,0,0,9], [9,0,0,0,1,2,0,0,0,9], [9,0,0,0,2,1,0,0,0,9], [9,0,0,0,0,0,0,0,0,9], [9,0,0,0,0,0,0,0,0,9], [9,0,0,0,0,0,0,0,0,9], [9,9,9,9,9,9,9,9,9,9], ] self._search_vectors = [ [ 0, -1], ## upper [ 1, -1], ## upper right [ 1, 0], ## right [ 1, 1], ## lower right [ 0, 1], ## lower [-1, 1], ## lower left [-1, 0], ## left [-1, -1] ## upper left ] self._board = [] self._board = [row[:] for row in self._initial_board] def init_gameboard(self) : self._board = [row[:] for row in self._initial_board] return def get_gameboard(self) : return self._board def revert_gameboard(self) : self._board = [row[:] for row in self.board_history.pop()] ## return last board status return self._board def get_gameboard_cell(self,posX, posY) : return self._board[posX][posY] def _search_and_reverse(self,chipColor, posX, posY, reverse=False) : counter = 0 if self._board[posX][posY] != Cells.BLANK : return counter for sv in self._search_vectors: locatorX = posX + sv[0] locatorY = posY + sv[1] opponent = Cells.SECOND_CHIP if chipColor == Cells.FIRST_CHIP else Cells.FIRST_CHIP ## If the opponent's cells continue localCounter = 0 while self._board[locatorX][locatorY] == opponent : locatorX += sv[0] locatorY += sv[1] localCounter += 1 ## sandwiched by pieces if (self._board[locatorX][locatorY] == chipColor) and (localCounter != 0) : locatorX -= sv[0] locatorY -= sv[1] ## Reverse over your opponent's pieces counter += localCounter while (locatorX != posX) or (locatorY != posY) : if reverse : self._board[locatorX][locatorY] = chipColor locatorX -= sv[0] locatorY -= sv[1] if (counter != 0) and reverse : self._board[posX][posY] = chipColor return counter def collect_valid_positions(self,chipColor) : poslist=[] for y in range(1, 9): for x in range(1, 9): count = self._search_and_reverse(chipColor, x, y) if count != 0 : poslist.append([x, y, count]) return poslist def put_chip(self,chipColor, posX, posY) : count = self._search_and_reverse(chipColor, posX, posY) if count > 0 : self._search_and_reverse(chipColor, posX, posY, reverse=True) return count