def test_available_moves_with_unusable_dice(self): board = [0] * 26 board[5] = 1 board[7] = -2 board[8] = -2 moves = {tuple(k[0]) for k in utils.available_moves(board, (1, 2), 'w')} self.assertEqual(moves, { ((5, 1), ), })
def test_available_moves(self): board = [0] * 26 board[5] = 2 board[6] = 1 board[7] = -1 board[8] = -2 moves = {tuple(k[0]) for k in utils.available_moves(board, (1, 2), 'w')} self.assertEqual(moves, { ((5, 2), (5, 1), ), ((5, 1), (5, 2), ), ((5, 2), (6, 1), ), ((6, 1), (5, 2), ), ((6, 1), (7, 2), ), })
def maximize(self, board, level=0, previous_value=None): modifier = 1 if level % 2 == 0 else -1 if level == self.levels: return self.evaluate(board) result = 0 for dices in it.combinations_with_replacement(range(1, 7), 2): multiplier = 1/36 if dices[0] == dices[1] else 1/18 max_value = modifier * -2**31 for _, possible_board in available_moves(board, dices, player_from_number(modifier)): possible_board_value = self.maximize(possible_board, level+1, max_value) if modifier * max_value < modifier * possible_board_value: max_value = possible_board_value if previous_value is not None \ and modifier * max_value <= modifier * previous_value: return max_value result += modifier * multiplier * max_value return result