【问题标题】:How do I design a algorithm to predict the outcome of a game with both players playing optimally?如何设计一种算法来预测两个玩家都玩得最好的游戏结果?
【发布时间】:2022-08-04 18:56:17
【问题描述】:

目前,我正在寻找一种递归解决方案来预测两个玩家都处于最佳状态的游戏结果。游戏在两名玩家之间进行。

我得到了一个数组形式的数字序列,并且总是想从一个边缘侧(即数组的开始或结束)绘制一个数字。根据轮到哪个玩家,计入积分,然后轮到下一个玩家。这个玩家现在还选择了一个数字,它位于数字数组的边缘。最后,总和较大的玩家获胜。

在图中,四个起始数字的所有可能的游戏路线都在二叉树中可视化。我现在想知道如何设计一个递归算法,将所有这些可能的组合考虑在内,如果两个玩家都发挥最佳,最后返回获胜玩家的分数。

  • 这个问题没有包含足够的细节供其他人提供有用的答案。看看\"How do I ask a good question?\"
  • 如果您在谈论nim game,请告诉我,以便我为您提供帮助。
  • 有 n(n+1)/2 个游戏状态,您可以使用动态规划来计算每个状态的值。
  • 您可能对minimax algorithm 感兴趣。如果你查看一片叶子之前的最后一个分支点,玩家将做出哪个动作相对明显;在相应节点上标记最佳移动的结果。然后对倒数第二个分支点执行此操作;等等

标签: java algorithm recursion


【解决方案1】:

当您谈论最佳游戏结果时,我假设玩家总是选择最大的数字。

在这里,您有一个方法可以提供一个包含玩家 A 和玩家 B 结果的数组。

private static int[] optimalGameResults(int[] board) {
        boolean turnA=true;
        int sumA=0,sumB=0;
        Deque<Integer> deque = new ArrayDeque<>();
        for (int n: board) {
            deque.offer(n);
        }
        while (deque.size()>0){
            if(turnA){
                sumA = sumOptimal(sumA, deque);
                turnA=false;
            }else{
                sumB = sumOptimal(sumB, deque);
                turnA=true;
            }
        }
        int[] abResults={sumA,sumB};
        return abResults;
    }

它还需要一个额外的方法来知道删除哪个值(优化)

private static int sumOptimal(int sum, Deque<Integer> deque) {
        if(deque.getFirst()> deque.getLast()){
            sum += deque.removeFirst();
        }else {
            sum += deque.removeLast();
        }
        return sum;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2012-10-30
    相关资源
    最近更新 更多