Modification for reversi

This commit is contained in:
JialianLee 2017-12-22 15:26:47 +08:00
parent d42a76f8f3
commit 511f64b3d6

View File

@ -34,7 +34,6 @@ def calc_flip(pos, own, enemy):
:param enemy: bitboard :param enemy: bitboard
:return: flip stones of enemy when I place stone at pos. :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) f1 = _calc_flip_half(pos, own, enemy)
f2 = _calc_flip_half(63 - pos, rotate180(own), rotate180(enemy)) f2 = _calc_flip_half(63 - pos, rotate180(own), rotate180(enemy))
return f1 | rotate180(f2) 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.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.color = None # 1 for black and -1 for white
self.action = None # number in 0~63 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): def simulate_is_valid(self, board, color):
self.board = board self.board = board
@ -134,18 +140,19 @@ class Reversi:
own, enemy = self.get_own_and_enemy() own, enemy = self.get_own_and_enemy()
mobility = find_correct_moves(own, enemy) mobility = find_correct_moves(own, enemy)
valid_moves = bit_to_array(mobility, 64) valid_moves = bit_to_array(mobility, 64)
valid_moves = np.argwhere(valid_moves)
valid_moves = list(np.reshape(valid_moves, len(valid_moves))) valid_moves = list(np.reshape(valid_moves, len(valid_moves)))
return valid_moves return valid_moves
def simulate_step_forward(self, board, color, vertex): def simulate_step_forward(self, state, vertex):
self.board = board self.board = state[0]
self.color = color self.color = state[1]
self.board2bitboard() self.board2bitboard()
self.vertex2action(vertex) self.vertex2action(vertex)
step_forward = self.step() step_forward = self.step()
if step_forward: if step_forward:
new_board = self.bitboard2board() new_board = self.bitboard2board()
return new_board return [new_board, 0 - self.color], 0
def executor_do_move(self, board, color, vertex): def executor_do_move(self, board, color, vertex):
self.board = board self.board = board
@ -155,13 +162,14 @@ class Reversi:
step_forward = self.step() step_forward = self.step()
if step_forward: if step_forward:
new_board = self.bitboard2board() new_board = self.bitboard2board()
return new_board for i in range(64):
board[i] = new_board[i]
def executor_get_score(self, board): def executor_get_score(self, board):
self.board = board self.board = board
self._game_over() self._game_over()
if self.winner is not None: if self.black_win is not None:
return self.winner, 0 - self.winner return self.black_win
else: else:
ValueError("Game not finished!") ValueError("Game not finished!")
@ -219,6 +227,7 @@ class Reversi:
def _game_over(self): def _game_over(self):
# self.done = True # self.done = True
'''
if self.winner is None: if self.winner is None:
black_num, white_num = self.number_of_black_and_white black_num, white_num = self.number_of_black_and_white
if black_num > white_num: if black_num > white_num:
@ -227,9 +236,12 @@ class Reversi:
self.winner = -1 self.winner = -1
else: else:
self.winner = 0 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): def illegal_move_to_lose(self, action):
logger.warning(f"Illegal action={action}, No Flipped!")
self._game_over() self._game_over()
def get_own_and_enemy(self): def get_own_and_enemy(self):