用于井字游戏故障的最小最大算法

MiniMax Algorithm for Tic Tac Toe failure

本文关键字:算法 游戏 故障 用于井      更新时间:2023-10-16

我正在尝试通过 alpha-beta 修剪为井字实现最小最大值算法。现在我正在运行该程序,但它似乎不起作用。每当我运行它时,它似乎都会在所有方块中输入垃圾。我已经实现了它,以便我的 minimax 函数采用板状态并修改该状态,以便在完成后,板状态包含下一个最佳移动。然后,我将"this"设置为等于修改后的电路板。以下是我针对最小最大值算法的函数:

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

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

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

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)

它通过传递值接受childWithMaximum,因此无法以这种方式返回板。

你想说的可能是:

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