当前位置: 首页 > 知识库问答 >
问题:

阿尔法测试跳棋 - 同一个玩家总是赢

荣俊杰
2023-03-14

我正在使用alphabeta(minimax)搜索实现一个简单的检查器AI,并完成了实现。我有两个玩家,1和2,但无论我使用什么深度进行搜索(即使1是深度

Board是一个具有Board属性的类,该属性是一个8x8整数数组。0个空白空间

1 件白色

2块红色的

3白色国王

4红色国王

class Player:
    def __init__(self, id, depth):
        self.id = id
        self.depth = depth

    def board_eval(self, board):
        if len(board.get_moves(self.id)) == 0:
            return float('inf')*-1
        else:
            red = 0
            redK = 0
            white = 0
            whiteK = 0
            for r in range(len(board.board[0])):
                for c in range(len(board.board[0])):
                    if board.board[r][c]>0:
                        if board.board[r][c]==1:
                            white+=1
                        elif board.board[r][c]==2:
                            red+=1
                        elif board.board[r][c]==3:
                            whiteK+=1
                        elif board.board[r][c]==4:
                            redK+=1
            if self.id == 1:
                return white+whiteK-red-redK
            else:
                return red+redK-white-whiteK

    def minimax (self, board, depth, alpha, beta, player):
        board_value = self.board_eval(board)
        if depth == 0 or board_value == float('inf') or board_value == float('inf')*-1:
            return board_value
        if self.id == player:
            for poss_board in board.get_moves(player):
                alpha = max(alpha, self.minimax(poss_board, depth - 1, alpha, beta, (player%2)+1))
                if (alpha >= beta):
                    break
            return alpha
        else:
            for poss_board in board.get_moves(player): #TODO: should this be the other player? pretty sure no
                beta = min(beta, self.minimax(poss_board, depth - 1, alpha, beta, (player%2)+1))
                if (beta <= alpha):
                    break
            return beta


    def update_board(self, board):
        best_move = None
        best_score = float('inf') * -1
        for poss_move in board.get_moves(self.id):
            alpha = self.minimax(poss_move, self.depth-1, best_score, float('inf'), (self.id%2)+1)
            if best_move is None or alpha > best_score:
                best_move = poss_move
                best_score = alpha
            elif alpha == best_score and random.random() <= 0.3: #arbitrary randomness if multiple best moves
                best_move = poss_move
        return best_move

class Game:
    def __init__(self):
        self.board = Board()
        self.p1 = Player(1, 4) #id, depth
        self.p2 = Player(2, 2) 
        self.height=800
        self.width=800
        self.win= GraphWin("Checkerboard", self.width, self.height)
        self.lag_win = GraphWin("Prev Board", self.width, self.height)
        self.lag_board = copy.deepcopy(self.board)
        self.cell_size = 50     # Height and width of checkerboard squares.
        self.offset_x = (self.width - 8*self.cell_size) / 2
        self.offset_y = (self.height - 8*self.cell_size) / 2

    def play(self):
        while True:
            self.board = self.p1.update_board(self.board)
            if self.board is None: #print("Game over, player 2 wins\n")
                return 2
            self.board = self.p2.update_board(self.board)
            if self.board is None: #print("Game over, player 1 wins\n")
                return 1

game = Game()
winner = game.play()

共有1个答案

彭弘方
2023-03-14

您的board_eval似乎返回了相对于玩家的分数,但代码的最小值部分似乎假定了绝对分数。如果在board_eval中删除,而仅

 类似资料:
  • 5.31 14:00提问问题如下: 1⃣️ 介绍一下自己 2⃣️为什么选择测试 3⃣️对未来职业规划 4⃣️对于测试的理解 5⃣️考虑在北京工作吗 6⃣️工作后如果预期和实际有差距你会怎么办 7⃣️给你一个矿泉水瓶你会怎么测试 8⃣️还有什么要问我的吗? 整个过程还算比较愉快的,HR也不错声音好听,一直让我问他问题😅面试时长大约三十分钟。 6.7 14:00 海尔智家二面 1⃣️对于软件测试是否

  • 笔试:常规题,难度不大 hr电话:了解基本情况 一面:技术面,自我介绍+根据简历提问,一共30分钟,面试官自己输出了有15分钟,哈哈哈哈哈哈,我全程像个捧哏的,不怎么难,感觉更倾向于有过深度学习算法经历和有项目落地,体验感还不错 hr面:也没说啥,问了一下地方是否能接受,能否提前去实习,对于测试的理解 后续:收到意向

  • 我正在做一个平台游戏,玩家有一把剑。我希望玩家只能在他下面有地面的时候攻击(所以他不能在空中攻击)。所以我实现了这段代码: 但是.. 每次返回零。虽然如果我将添加到测试玩家是否在地面的部分,它仍然存在!(虽然接地仍然等于零) 以下是完整的代码: 有人能帮忙吗?:)

  • 考虑下面这个游戏。有一组正数。每个玩家依次移除一个切片(连续的元素序列),这样它的和就是偶数。输的玩家是不能移动的玩家。对于< code>[4,5,3,7,2]示例,获胜策略(对于第一个玩家)是移除< code>[5,3]切片。您需要确定第一个玩家是否有赢棋(如果有,返回< code>slice_start和< code>slice_end索引)。 时间/空间复杂度:< code>O(n) 我想到

  • 我试图实现一个带有alpha beta修剪的国际象棋游戏。以下几乎可以工作,但它返回错误的动作。 例如,可以出现以下情况。 白色(用户)移动,白色国王位置-a1/黑色(计算机),黑色国王位置-h1 白色从a1-a2移动其国王,然后黑色返回移动g2-g1??? 计算机似乎返回了错误节点的移动(电路板表示),就好像给定电路板位置的最佳评估没有一直传播到树的后面。因此,在探索的一个模拟位置中,计算机“想

  • 问题内容: 这是我的第一个前端测试经验。在这个项目中,我正在使用jest快照测试,并且组件内部出现错误。 我浏览了一些有趣的文档,发现“手动模拟”部分,但是我还不知道该如何做。 问题答案: 开玩笑的文档现在有一个“官方”解决方法: JSDOM中未实现的模拟方法