def move(self, color, position, distance): with self._game_mutex: player = self._active_player board = self._board dice = self._dice if get_winner(board) is not None: self._active_player = None raise Game.LogicError('game has ended') if color != player: raise Game.LogicError('not players turn') if abs(distance) not in dice: raise Game.LogicError('move is invalid') new_board = make_move(board, position, distance, player) if new_board is None: raise Game.LogicError('move is invalid') self._board = new_board dice.remove(abs(distance)) if len(dice) == 0: self._next_player() elif not is_any_legal_move(self._board, self._dice, self._active_player): self._next_player() log.debug("{}: move {} {}".format(color, position, distance)) self.set_changed() self.notify_observers()
def test_make_invalid_move_black(self): player = 'b' start = 1 board_start = config.INIT_BOARD.copy() self.assertEqual(utils.make_move(board_start, start, 1, player), None)
def test_move_into_enemy_door(self): board = [0] * 26 p = copy.deepcopy(board) p[10] = 1 p[14] = -2 self.assertEqual(utils.make_move(p, 10, 4, 'w'), None)
def test_enter_door(self): board = [0] * 26 p = copy.deepcopy(board) p[10] = 1 p[14] = 2 q = copy.deepcopy(board) q[14] = 3 self.assertEqual(utils.make_move(p, 10, 4, 'w'), q)
def test_kill_enemy(self): board = [0] * 26 p = copy.deepcopy(board) p[10] = 1 p[14] = -1 q = copy.deepcopy(board) q[14] = 1 q[25] = -1 self.assertEqual(utils.make_move(p, 10, 4, 'w'), q)
def test_make_move_white(self): player = 'w' start = 1 modifier = utils.player_modifier(player) board_start = config.INIT_BOARD.copy() board_end = config.INIT_BOARD.copy() board_end[start] -= modifier board_end[start + modifier] += modifier self.assertEqual(utils.make_move(board_start, start, 1, player), board_end)