From 511f64b3d6ada98d4fe0e04215eea93d690f56a4 Mon Sep 17 00:00:00 2001 From: JialianLee Date: Fri, 22 Dec 2017 15:26:47 +0800 Subject: [PATCH] Modification for reversi --- AlphaGo/reversi.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/AlphaGo/reversi.py b/AlphaGo/reversi.py index 49d0e9a..cba91d9 100644 --- a/AlphaGo/reversi.py +++ b/AlphaGo/reversi.py @@ -34,7 +34,6 @@ def calc_flip(pos, own, enemy): :param enemy: bitboard :return: flip stones of enemy when I place stone at pos. """ - assert 0 <= pos <= 63, f"pos={pos}" f1 = _calc_flip_half(pos, own, enemy) f2 = _calc_flip_half(63 - pos, rotate180(own), rotate180(enemy)) return f1 | rotate180(f2) @@ -125,7 +124,14 @@ class Reversi: self.board = None # 8 * 8 board with 1 for black, -1 for white and 0 for blank self.color = None # 1 for black and -1 for white self.action = None # number in 0~63 - self.winner = None + # self.winner = None + self.black_win = None + + def get_board(self, black=None, white=None): + self.black = black or (0b00001000 << 24 | 0b00010000 << 32) + self.white = white or (0b00010000 << 24 | 0b00001000 << 32) + self.board = self.bitboard2board() + return self.board def simulate_is_valid(self, board, color): self.board = board @@ -134,18 +140,19 @@ class Reversi: own, enemy = self.get_own_and_enemy() mobility = find_correct_moves(own, enemy) valid_moves = bit_to_array(mobility, 64) + valid_moves = np.argwhere(valid_moves) valid_moves = list(np.reshape(valid_moves, len(valid_moves))) return valid_moves - def simulate_step_forward(self, board, color, vertex): - self.board = board - self.color = color + def simulate_step_forward(self, state, vertex): + self.board = state[0] + self.color = state[1] self.board2bitboard() self.vertex2action(vertex) step_forward = self.step() if step_forward: new_board = self.bitboard2board() - return new_board + return [new_board, 0 - self.color], 0 def executor_do_move(self, board, color, vertex): self.board = board @@ -155,13 +162,14 @@ class Reversi: step_forward = self.step() if step_forward: new_board = self.bitboard2board() - return new_board + for i in range(64): + board[i] = new_board[i] def executor_get_score(self, board): self.board = board self._game_over() - if self.winner is not None: - return self.winner, 0 - self.winner + if self.black_win is not None: + return self.black_win else: ValueError("Game not finished!") @@ -219,6 +227,7 @@ class Reversi: def _game_over(self): # self.done = True + ''' if self.winner is None: black_num, white_num = self.number_of_black_and_white if black_num > white_num: @@ -227,9 +236,12 @@ class Reversi: self.winner = -1 else: self.winner = 0 + ''' + if self.black_win is None: + black_num, white_num = self.number_of_black_and_white + self.black_win = black_num - white_num def illegal_move_to_lose(self, action): - logger.warning(f"Illegal action={action}, No Flipped!") self._game_over() def get_own_and_enemy(self):