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

Tic-Tac-Toe失效的MiniMax算法

耿弘阔
2023-03-14

我正在尝试用alpha-beta剪枝实现一个用于tic-tac-toe的minimax算法。现在我有程序在运行,但它似乎不起作用。每当我运行它时,它似乎会在所有的方块中输入垃圾。我已经实现了它,所以我的minimax函数接受一个棋盘状态,并修改该状态,以便当它完成时,棋盘状态包含下一个最佳移动。然后,我将“this”设置为与修改后的电路板相等。以下是我的minimax算法函数:

void board::getBestMove() {
  board returnBoard;
  miniMax(INT_MIN + 1, INT_MAX -1, returnBoard);

  *this = returnBoard;
}

int board::miniMax(int alpha, int beta, board childWithMaximum) {
  if (checkDone())
    return boardScore();

  vector<board> children = getChildren();
  for (int i = 0; i < 9; ++i) {
    if(children.empty()) break;

    board curr = children.back();
    if (curr.firstMoveMade) { // not an empty board
      board dummyBoard;
      int score = curr.miniMax(alpha, beta, dummyBoard);

      if (computerTurn && (beta > score)) {
        beta = score;
        childWithMaximum = *this;
        if (alpha >= beta) break;
      } else if (alpha < score) {
        alpha = score;
        childWithMaximum = *this;
        if (alpha >= beta) break;
      }
    }
  }
  return computerTurn? alpha : beta;
}

vector<board> board::getChildren() {
  vector<board> children;

  for (int i = 0; i < 3; ++i) {
    for (int j = 0; j < 3; ++j) {
      if (getPosition(i, j) == '*') { //move not made here
        board moveMade(*this);
        moveMade.setPosition(i, j);
        children.push_back(moveMade);
      }
    }
  }

  return children;
}

如果有人想尝试运行它,这里是我的完整文件:

.cpp:http://pastebin.com/ydG7RFRX .h:http://pastebin.com/94mDdy7x

共有1个答案

融烨磊
2023-03-14

您的代码可能有很多问题。。。你肯定贴了很多。因为你在问你的问题,所以你有责任先尝试你自己能做的一切,然后将你的问题减少到最少的代码量,以澄清正在发生的事情。事实上,我不觉得你在问这个问题上花了太多精力。

但是也许我仍然可以提供一些帮助:

void board::getBestMove() {
  board returnBoard;
  miniMax(INT_MIN + 1, INT_MAX -1, returnBoard);

  *this = returnBoard;
}

看看你是怎么说的*this=returnBoard

这一定意味着你想从MiniMax拿回一块板。

但是看看MiniMax是如何定义的!

int board::miniMax(int alpha, int beta, board childWithMaximum)

它通过pass-by value接受childWithMaximum,因此不能以这种方式返回电路板。

你想说的可能是:

int board::miniMax(int alpha, int beta, board & childWithMaximum)
 类似资料:
  • 所以我在过去的三周里一直在做这个项目。我很早就设法让minimax函数在3x3板上工作,但是当我尝试在4x4板上使用它时,问题开始出现,即Java堆空间错误。从那时起,在Alpha-beta修剪的帮助下,我成功地从aprox中减少了minimax函数中所需的minimax调用的数量。59000到16000到11000,最后是8000次呼叫(这是假设一个插槽已填满的电路板的初始minimax呼叫)。

  • 首先,我是java的初学者,我正在尝试模拟TicTacToe游戏。我想使用游戏树为所有状态创建一个可能的树。树中的每个节点都将代表状态并使用此树来决定下一步要做的事情。我计划按如下方式进行, > 接口类包括表示单个移动所需的信息。 抽象/接口类包括以下方法: a、 返回一个新的状态对象,该对象表示应用该移动后游戏的状态。 B.如果当前状态代表其中一名玩家的胜利,则此游戏的获胜者ID。 c、 返回当

  • 我一直在尝试在我的tic-tac-toe游戏中使用minimax算法,以使我的AI无敌。然而,它并不总是返回最佳移动。 它给出了上面的指数[2]作为正确的最佳移动。 然而,有了下面的棋盘,它给出的答案是索引[3],这将允许人类玩家在轮到它时获胜。 我想知道我的代码出了什么问题。以下是我用作参考的一些网站: http://www.geeksforgeeks.org/minimax-algorithm

  • 我在C和一般编程方面是个新手,我想知道这段代码的性能/复杂性有多好,因为它与我在SO的其他帖子中发现的不同。for循环是否使这变得不必要的复杂?

  • 我该怎么做? 下面是我的代码: