处理:井字最小极大值算法

如何解决处理:井字最小极大值算法

我目前正在做一个学校项目。我正在开发经典的Tic-Tac-Toe播放器与处理计算机。

我的问题:我试图声明minimax算法,但是计算机在进行下一步操作而不是寻找最佳操作时仍然遵循循环。 minimax算法在“计算机”类中。

这是我的课程:

Square[][] grid; //field
int row,col,turns;
float h,w,x,y; // used variables in methods
int scoreP = 0; // scorecounter player 1
int scoreC = 0; // scorecounter computer
String[] players = {"X","O"}; 
String winner;
String currentPlayer;
boolean play;
float w_button = 200;            // play again button
float h_button = 40;
float x_button = 200;
float y_button = 650;


void setup(){
  size(602,700);  
  row=3;
  col=3;
  
  grid = new Square[row][col];
  startGame();
  
 }

  void draw(){ 
  textSize(30);
  text("Player: " + scoreP,20,25); 
  fill(255);
  
  textSize(30);
  text("Computer: " + scoreC,400,25); 
  fill(255);
  
  if(play == true) {
     for(int i = 0; i < row; i++){
      for(int j = 0; j < col; j++){
        grid[i][j].drawSymbol();
      }
     }
     checkWinner();
     computerPlays();
     } else {
        playAgainButton();
       if(winner.equals(players[0])) {
         println("You Win");
         fill(0);
         rect(120,30,30);
         scoreP += 1;
         noLoop();
       } else if (winner.equals(players[1])) {
         println("Computer Wins");
         fill(0);
         rect(555,30);
         scoreC += 1;
         noLoop();
       } else if (winner == "") {
         println("tie");
         noLoop();
       }
     }   
}

void mousePressed() {
  for(int i = 0; i < row; i++){
    for(int j = 0; j < col; j++){
      grid[i][j].click();
    }
  }
  
  if (mouseX > x_button && mouseX < x_button + w_button && mouseY > y_button && mouseY < y_button + h_button){
    redraw();
    loop();
    startGame();
  }

}

boolean isEqual(String a,String b,String c){ // checks if 3 fields are equal
  return a == b && b == c && a != ""; 
} 

void checkWinner(){
  
  //horizontal
  for(int i = 0; i < 3; i++){
    if(isEqual(grid[i][0].val,grid[i][1].val,grid[i][2].val)){
      play = false;
      winner = grid[i][0].val;
    }
    
  }
  
  //vertical
  for(int i = 0; i < 3; i++){
    if(isEqual(grid[0][i].val,grid[1][i].val,grid[2][i].val)){
      play = false;
      winner = grid[0][i].val;
    }
  }
  
  //Diagonal
  if(isEqual(grid[0][0].val,grid[1][1].val,grid[2][2].val)){
    play = false;
    winner = grid[0][0].val;
  }

  if(isEqual(grid[2][0].val,grid[0][2].val)){
    play = false;
    winner = grid[2][0].val;
  }
  
  if(turns == 0  && winner.equals("")) {
    play = false;
  }
}

public void startGame() {
  currentPlayer = players[0];
  winner = "";
  play = true;
  turns = 9;
  h = 600/3;
  w = 600/3;
  x = 0;
  y = 35;
  
  background(0);    
  
   for(int i = 0; i < row; i++){
    for(int j = 0; j < col; j++){
      grid[i][j] = new Square(x,y,h);
      x += w;  
    }
    y += h;    
    x = 0;  
   }
  }
  
  void computerPlays() {
    Computer c = new Computer();
    if("O".equals(currentPlayer) &&  turns != 0) {
     Move m = c.findBestMove();
      grid[m.row][m.col].val = "O";
      turns--;
      currentPlayer = "X";
    }
  }
  
  void playAgainButton(){
   fill(200);
   stroke(200);
   rect(x_button,y_button,w_button,h_button); 
   stroke(0);
   fill(0);
   text("PLAY AGAIN",x_button+15,y_button+30);
   fill(255);
 }

计算机课

public class Computer {

    public ArrayList<Move> getAvailableSpace() {
       ArrayList<Move> availableSpace = new ArrayList<Move>();
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
                if (grid[i][j].val == "") {
                    availableSpace.add(new Move(i,j));
                }
            }
        }
        return availableSpace;
    }
    
    public int minimax() { 
      int score;
      if(winner != null) {
        if(winner == "O") {
          score = 1;
          return score;
        } else if (winner == "") {
          score = 0;
          return score;
        } else {
          score = -1;
          return score;
        }
      }
      int computerCount = 0;
      int humanCount = 0;
      
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
              if(grid[i][j].val == "O") {
                computerCount++;
            } else if (grid[i][j].val == "X") {
              humanCount++;
            }
        }
      }
      int bestScore;
      if(humanCount > computerCount) {
        bestScore = -1;
      } else {
        bestScore = 1;
      }
      
      for(Move m : getAvailableSpace()) {
        if(humanCount > computerCount) {
        grid[m.row][m.col].val = "O";
      } else {
        grid[m.row][m.col].val = "X";
      }
      int currentScore = minimax();
      grid[m.row][m.col].val = "";
        if(humanCount > computerCount ? currentScore > bestScore : currentScore < bestScore) {
          bestScore = currentScore;
        }
      }
      return bestScore;
  }
  
  public Move findBestMove() {
    int bestScore = -100;
    Move bestMove = new Move();
    for(Move m : getAvailableSpace()) {
      grid[m.row][m.col].val = "O";
      int score = minimax();
      grid[m.row][m.col].val = "";
      if(score > bestScore) {
        bestScore = score;
        bestMove = m;
      }
    }
   
    return bestMove;

  }
  
}

移动课程:

    public class Move {
  
  int row;
  int col;
  
  public Move() {
  }
  
  public Move(int row,int col) {
    this.row = row;
    this.col = col;
  }
  
}

广场课

    public class Square {
  
  float x,h;
  String val;
  
  public Square(float x,float y,float w,float h) {
    this.h = h;
    this.w = w;
    this.x = x;
    this.y = y;  
    val = "";
  }
  
  void drawSymbol() {
    rect(x,h);
    if("X".equals(val)) {
      line(this.x,this.y,this.x+this.w-1,this.y+this.w-1);
      line(this.x,this.y+this.w-1,this.y);
       
    } else if ("O".equals(val)) {
      noFill();
      ellipse(this.x +  (this.w/2),this.y + (this.h/2),this.w,this.w);
    }
  }
  
  
  void click() {
    if(mouseX > x && mouseX < x + w && mouseY > y && mouseY < y + h) {
      if("".equals(val) && "X".equals(currentPlayer)) {
          val = "X";
          currentPlayer = "O";
          turns--;
        }
    }  
  }
}

我在做什么错了?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-