首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中的Tic-Tac-Toe AI极大极小函数

Java中的Tic-Tac-Toe AI极大极小函数
EN

Stack Overflow用户
提问于 2021-01-13 02:12:58
回答 1查看 53关注 0票数 0

这里有我的minimax算法的代码。它似乎做出了明智的决定,但并不总是,这不应该发生,我需要帮助,因为我似乎找不到哪里错了。

代码语言:javascript
运行
复制
private char level2Move() {
  try {
    NBoard game_copy = (NBoard) game.clone();

    int bestScore = Integer.MIN_VALUE;
    char bestMove = '-';

    for (char move: game_copy.getValidMoves()) {
      game_copy.enterMove(move);
      int score = minimax(game_copy, true);
      game_copy.undoMove();
      if (score > bestScore) {
        bestScore = score;
        bestMove = move;
      }
    }

    return bestMove;
  } catch(CloneNotSupportedException e) {
    e.printStackTrace();
  }

  return '-';
}
代码语言:javascript
运行
复制
public int minimax(NBoard game, boolean isMaximizing) {
  int bestScore;

  switch (game.getGameState()) {
  case NBoard.X_WIN:
    return - 10;
  case NBoard.O_WIN:
    return 10;
  case NBoard.DRAW:
    return 0;
  }

  if (isMaximizing) {
    bestScore = Integer.MIN_VALUE;
    for (char move: game.getValidMoves()) {
      if (game.getGameState() == NBoard.ONGOING) {
        game.enterMove(move);
        int score = minimax(game, false);
        game.undoMove();
        bestScore = Math.max(score, bestScore);
      }
    }
  } else {
    bestScore = Integer.MAX_VALUE;
    for (char move: game.getValidMoves()) {
      if (game.getGameState() == NBoard.ONGOING) {
        game.enterMove(move);
        int score = minimax(game, true);
        game.undoMove();
        bestScore = Math.min(score, bestScore);
      }
    }
  }
  return bestScore;
}

板输入(移动)是字母A-I,就像这样...

代码语言:javascript
运行
复制
A|B|C
D|E|F
G|H|I

我似乎还没有使用"score“,正在考虑增加深度,但我想不出这会有什么帮助。

EN

Stack Overflow用户

回答已采纳

发布于 2021-01-19 11:51:03

我修好了。简单地更改了极大极小函数中的布尔值。

代码语言:javascript
运行
复制
private char level2Move() {
  try {
    NBoard game_copy = (NBoard) game.clone();

    int bestScore = Integer.MIN_VALUE;
    char bestMove = '-';

    for (char move: game_copy.getValidMoves()) {
      game_copy.enterMove(move);
      int score = minimax(game_copy, false);       // here
      game_copy.undoMove();
      if (score > bestScore) {
        bestScore = score;
        bestMove = move;
      }
    }

    return bestMove;
  } catch(CloneNotSupportedException e) {
    e.printStackTrace();
  }

  return '-';
}
代码语言:javascript
运行
复制
public int minimax(NBoard game, boolean isMaximizing) {
  int bestScore;

  switch (game.getGameState()) {
  case NBoard.X_WIN:
    return - 10;
  case NBoard.O_WIN:
    return 10;
  case NBoard.DRAW:
    return 0;
  }

  if (isMaximizing) {
    bestScore = Integer.MIN_VALUE;
    for (char move: game.getValidMoves()) {
      if (game.getGameState() == NBoard.ONGOING) {
        game.enterMove(move);
        int score = minimax(game, false);          // here
        game.undoMove();
        bestScore = Math.max(score, bestScore);
      }
    }
  } else {
    bestScore = Integer.MAX_VALUE;
    for (char move: game.getValidMoves()) {
      if (game.getGameState() == NBoard.ONGOING) {
        game.enterMove(move);
        int score = minimax(game, true);           // here
        game.undoMove();
        bestScore = Math.min(score, bestScore);
      }
    }
  }
  return bestScore;
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65689637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档