我正在尝试用α-β剪枝实现tic-tac-toe的minimax算法现在我的程序正在运行,但似乎不起作用每当我运行它时,它似乎会在所有的方块中输入垃圾。我已经实现了它,所以我的minimax函数接受一个board状态,并修改该状态,这样当它完成时,board状态包含下一个最佳移动然后,我将“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

最佳答案

你的代码可能有很多问题…你肯定贴了很多因为你在问你的问题,所以你有责任首先尝试你自己能做的一切,然后把你的问题减少到最小的代码量,以澄清正在发生的事情。事实上,我觉得你没有花太多精力去问这个问题。
但也许我还能提供一些帮助:

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

  *this = returnBoard;
}

看看你是怎么说的。
这一定意味着您想从*this = returnBoard中取回一块板。
但是看看miniMax是如何定义的!
int board::miniMax(int alpha, int beta, board childWithMaximum)

它通过pass by value接受miniMax,因此不能以这种方式返回板。
你想说的大概是:
int board::miniMax(int alpha, int beta, board & childWithMaximum)

关于c++ - 井字故障的MiniMax算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21100216/

10-12 18:06