【问题标题】:Tic Tac Toe java draw game井字游戏java抽奖游戏
【发布时间】:2014-04-11 06:43:55
【问题描述】:

所以我为我的班级做了井字游戏。我已经成功地创建了一个简单的井字游戏程序,但不知何故,检查抽签的方法有时并不正确。如果一切都满了,但没有赢家,那就是平局。但是,如果除第 0 行第 1 列之外的所有其他内容都已填充,即使该框仍为空白,它仍将显示“绘制”。如果您不明白我的意思,请尝试填写除顶行中间方框以外的所有内容,但不要中奖,即使最后一个方框未填写,它也会显示“平局”。我的代码做错了什么???这是驱动程序: 导入 javax.swing.JOptionPane;

public class TwoDimensionalArray_Driverr
{
  public static void main(String[]args)
  {
    char player = 'o';
    TwoDimensionalArrayy game = new TwoDimensionalArrayy();

    while (game.checkGame() == "PLAY")
    {
      if (player == 'o') player = 'x';
      else player = 'o';
      System.out.println(game);
      String input = JOptionPane.showInputDialog("Enter Position of Row for player "+ player +" or     press Cancel to exit");
      if (input == null)
        System.exit(0);
      int row = Integer.parseInt(input);

      input = JOptionPane.showInputDialog("Enter Position of Column for player " + player);
      int column = Integer.parseInt(input);

      game.set(row,column,player);
      game.isDraw();
      game.hasWon(row,column,player);
      game.checkGame();
      System.out.println(game.checkGame());
    }
    if (game.checkGame()=="DRAW"){
      System.out.println(game);
      System.out.println("It's a draw.");
    }
    else {
      System.out.println(game);
      System.out.println(player + " has won.");}
  }
}

这里是对象: 公共类二维数组 { 私有字符串 currentState = "GO"; 私人 char[][] 板; 私有静态最终 int ROWS = 3; 私有静态最终 int COLUMNS = 3;

  public TwoDimensionalArrayy(){
  board = new char[ROWS][COLUMNS];

  for(int i=0;i<ROWS;i++) //always do ROWS first!!!!
    for(int j = 0;j<COLUMNS;j++)
    board[i][j]=' ';
  }

  public void set(int i, int j, char player)
  {
    if(board[i][j] != ' ' )
      throw new IllegalArgumentException("Position Occupied");
    board[i][j] = player;
  }

  public String toString()
  {
    System.out.println("This is the board. 3x3");
    System.out.println("Position start @ row[0]col[0],row[0]col[1],row[0]col[2]");
    String dString= "";
    for (int row = 0; row<ROWS; row++)
    {
      if (COLUMNS>0)
      dString += board[row][0];
      for (int col = 1; col<COLUMNS; col++)
      {
        dString+= "|" + board[row][col];
      } //end 2nd for
      dString += "\n";
    }//end first for
    return dString;
  }

  public String checkGame(){
    if (currentState=="Win"){
      return "END";}
    else if (currentState=="Draw"){
      return "DRAW";}
    else return "PLAY";
  }
  public void hasWon(int i,int j,char player){
    if (board[i][0] == player         // 3-in-the-row
                   && board[i][1] == player
                   && board[i][2] == player
              || board[0][j] == player      // 3-in-the-column
                   && board[1][j] == player
                   && board[2][j] == player
              || i == j            // 3-in-the-diagonal
                   && board[0][0] == player
                   && board[1][1] == player
                   && board[2][2] == player
              || i + j == 2  // 3-in-the-opposite-diagonal
                   && board[0][2] == player
                   && board[1][1] == player
                   && board[2][0] == player)
      currentState = "Win";
  }
  public void isDraw(){
     for ( int row = 0; row < ROWS; row++) {
         for (int col = 0; col < COLUMNS; col++) {
            if (board[row][col] == ' ') {
               currentState = "Play";
               break;
            }
            else {currentState = "Draw";} // no empty cell, it's a draw}
         }
      }
   }
}

【问题讨论】:

    标签: java tic-tac-toe


    【解决方案1】:
    public void isDraw(){
      for ( int row = 0; row < ROWS; row++) {
        for (int col = 0; col < COLUMNS; col++) {
          if (board[row][col] == ' ') {
            currentState = "Play";
            break;
          } else {
            currentState = "Draw"; // no empty cell, it's a draw
          } 
        }
      }
    }
    

    这里的break 将转义内部for 循环,但不会转义外部循环。本质上isDraw 只考虑最后一行。您应该尝试改用return

    【讨论】:

    • 我明白了!非常感谢!另外,如果我要使用 return,我会返回什么以及它是如何工作的?我对那部分有点困惑。
    • @user3504731 isDraw 是一个void 方法,所以它没有返回值 - 一个简单的return; 将退出该方法。
    • 噢噢噢。所以如果我把return而不是break,它会退出两个循环吗?我也想过这个,但我想即使我把 return 它仍然会回到所有的事情。非常感谢!
    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多