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

问题描述

我目前正在做一个学校项目。我正在开发经典的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 (将#修改为@)