Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算跳棋中的最佳移动_Java - Fatal编程技术网

Java 计算跳棋中的最佳移动

Java 计算跳棋中的最佳移动,java,Java,我创建了一个棋盘格游戏,我想让计算机计算出最佳的移动。 以下是我迄今为止所做的工作: public BoardS calcNextMove(BoardS bs) { ArrayList<BoardS>options = calcPossibleOptions(bs); int max = -1; int temp; int bestMove = 0; for(int k=0;k<options.size();k++) {

我创建了一个棋盘格游戏,我想让计算机计算出最佳的移动。 以下是我迄今为止所做的工作:

public BoardS calcNextMove(BoardS bs)
{
    ArrayList<BoardS>options = calcPossibleOptions(bs);
    int max = -1;
    int temp;
    int bestMove = 0;

    for(int k=0;k<options.size();k++)
    {
        temp = calculateNextMove2(options.get(k));
        if(max<temp)
        {
            max = temp;
            bestMove = k;
        }
    }
    return options.get(bestMove);
}

public int calculateNextMove2(BoardS bs)
{
    int res = soWhoWon(bs);

    if(res == 2) //pc won(which is good so we return 1)
        return 1;
    if(res == 1)
        return 0;

    ArrayList<BoardS>options = calcPossibleOptions(bs);

    int sum = 0;
    for(int k=0;k<options.size();k++)
    {
        sum += calculateNextMove2(options.get(k));
    }
    return sum;
}
public BoardS calcNextMove(BoardS-bs)
{
ArrayListoptions=calcPossibleOptions(bs);
int max=-1;
内部温度;
int-bestMove=0;

对于(int k=0;k你需要找到MinMax的替代品,即使是alpha-beta修剪也是如此,因为电路板太大,可能会产生太多的移动和反向移动。这会导致堆栈溢出

我很惊讶地看到,为Tic-Tac-Toe制定完整的决策树并没有让我感到意外,但恐怕我对人工智能规划或其他解决这些问题的算法了解不够,无法帮助您解决这些问题。

关于“calculateNextMove2()的递归将运行得太深,这就是为什么会出现堆栈溢出。如果您希望游戏运行到最后(除非相对接近实际胜利),这可能确实需要很长时间。例如国际象棋(我有更多的经验)一个引擎可能会走20步深,然后你才有可能走到目前为止的发现。如果你从一场国际象棋游戏开始就运行它…它可以在当前技术上运行100年(但仍然不能真正说出获胜的第一步是什么)。也许只是尝试10或20步深?(这仍然会打败大多数人,并且可能仍然会被归类为“最佳棋”)。与国际象棋一样,你将很难评估一个位置的好坏以使其发挥作用(通常计算为物质优势和位置优势的组合)注:奇努克项目已经完成了你想要实现的目标——它已经“击败”了跳棋游戏(国际象棋编辑还没有这样的东西:马格纳斯·卡尔斯伦已经“解除”了游戏的所有意图和目的:D)

见: (这可能会有所帮助)

还有一篇关于这个主题的(旧)论文:

(可能有用)


还要注意的是,返回第一个导致“胜利”的招式是“幼稚的”——因为这可能是一个完全不可能的招式,如果对手没有在一个非常特别的胜利中出局,他们将获得优势——例如,在国际象棋中为愚人伙伴或学者伙伴出局……(快速但非常受惩罚)

checkers和checker是同一回事吗?对不起,我很抱歉,我会更新。也许“calculateNextMove2”中的递归太深了?你知道在结束条件出现之前通常会调用多少次吗(我想说很多…)当然,这是一个跳棋游戏。我能做什么?我不能在游戏中间停下来。我必须一直玩到最后,看看这条路是否会赢或输。你有什么建议吗?我试着用一次迭代来运行递归循环。“KWELL,实际上你需要在某个时候停止……就像下棋一样。(我有更多的经验)一个引擎通常会走20步深。如果你从一盘国际象棋开始就运行它……它在目前的技术上可以运行100年(但仍然无法真正说出获胜的第一步是什么)。也许只是尝试10步或20步深?(这仍然会打败大多数人——并且可能仍然被归类为“最佳动作”)与国际象棋一样,你将很难评估一个位置的好坏,以使其发挥作用。这是一个棘手的部分。假设我在20步后停止,现在我如何知道谁处于更好的位置?我应该返回什么?我知道最大/阿尔法贝塔的混合,但正如你所看到的,我甚至不使用游戏树。我更喜欢x步深入研究,但它再次让我想到了我上面写的,这正是你现在面临的问题…严肃地说。这是现在最大的挑战。也许刚开始,你可以看到谁是判断一个位置最重要的“向上”的人——即开始移动x(不管之后的移动)玩家在一个y步之后往往是两个棋子…并且没有其他的开始移动会产生这样的“优势”。而且即使是20步也可能很高…计算出实际的移动可能性有多少。(可能是(4*2)^20-或2^22-相当大的数字)