2016-02-18 32 views
0

我试图做一个tic tac脚趾游戏,并且它在第一个X或O被输入时工作正常,但当第二个输入先前的X或O被删除,新的被放入。我不知道为什么会发生这种情况。在2d阵列中的对象不断重置,我不知道为什么

 import java.util.Scanner; 
    public class Play { 
     public static void main(String[] args){ 
      Scanner kbd=new Scanner(System.in); 
      TicTacToeBoard t=new TicTacToeBoard(3, 3); 
      t.startBoard(); 
      XO xo1=new XO(); 
      xo1.setTurns(1); 
      XO xo2=new XO(); 
      xo2.setTurns(0); 
      System.out.println("Player 1, what is your name?"); 
      String n1=kbd.nextLine(); 
      System.out.println("Player 2, what is your name?"); 
      String n2=kbd.nextLine(); 
      System.out.println(t); 
      while(!t.winner()&&!t.full()){ 
       if(t.getTurnCnt()%2==0){ 
        System.out.println(n1+"(X): "); 
        int x1=kbd.nextInt(); 
        int y1=kbd.nextInt(); 
        t.add(x1, y1, xo1); 
        System.out.println(t); 
       } 
       //this is where the board resets 
       else{ 
        System.out.println(n2+"(O): "); 
        int x2=kbd.nextInt(); 
        int y2=kbd.nextInt(); 
        t.add(x2, y2, xo2); 
        System.out.println(t); 
       } 

TicTacToeBoard类:

 public class TicTacToeBoard extends Board{ 
     private XO[][] board; 
     private int turnCnt; 
     public TicTacToeBoard(int r, int c){ 
      super(r, c); 
      board=new XO[r][c]; 
      turnCnt=0; 
     } 
     public void startBoard(){ 
      for(int i=0;i<3;i++){ 
       for(int j=0;j<3;j++){ 
        board[i][j]=new XO(); 
        board[i][j].setName("-"); 
       } 
      } 
     } 
     public void setTurnCnt(int t){ 
      turnCnt=t; 
     } 
     public XO[][] setBoard(XO[][] b){ 
      return b; 
     } 
     public XO[][] getBoard(){ 
      return board; 
     } 
     public int getTurnCnt(){ 
      return turnCnt; 
     } 
     public boolean add(int x, int y, XO x1){ 
      if(x<=this.getRows()&&y<=this.getCols()&&(board[x-1][y-1].getName().equals("-"))){ 
       board[x-1][y-1].setName(x1.getName()); 
       turnCnt++; 
       return true; 
      } 
      else 
       System.out.println("error"); 
       return false; 
     } 
     public boolean winner(){ 
      boolean t=false; 
      for(int i=0;i<3;i++){ 
       if(board[i][0].equals(board[i][1], board[i][2])||board[0][i].equals(board[1][i], board[2][i])||board[0][0].equals(board[1][1], board[2][2])||board[2][0].equals(board[1][1], board[0][2])) 
        t=true; 
      } 
      return t; 
     } 
     public boolean XWinner(){ 
      boolean t=false; 
      for(int i=0;i<3;i++){ 
       if((board[i][0].equals(board[i][1], board[i][2])&&board[i][1].getName().equals("X"))||(board[0][i].equals(board[1][i], board[2][i])&&board[0][i].getName().equals("X"))||(board[0][0].equals(board[1][1], board[2][2])&&board[0][0].getName().equals("X"))||(board[2][0].equals(board[1][1], board[0][2])&&board[2][0].getName().equals("X"))) 
        t=true; 
      } 
      return t; 
     } 
     public boolean full(){ 
      boolean t=true; 
      for(int r=0;r<3;r++){ 
       for(int c=0;c<3;c++){ 
        if(board[r][c].getName()=="-") 
         t=false; 
       } 
      } 
      return t; 
     } 
     public String toString(){ 
      return "\t\t\tCol\n\t\t1\t2\t3\nRow\t1\t"+board[0][0]+"\t"+board[0][1]+"\t"+board[0][2]+"\n\t2\t"+board[1][0]+"\t"+board[1][1]+"\t"+board[1][2]+"\n\t3\t"+board[2][0]+"\t"+board[2][1]+"\t"+board[2][2]; 
     } 
    } 

XO类:

public class XO { 
     private String name; 
     private int turn; 
     public XO(){ 
      turn=-1; 
     } 
     public int getTurns(){ 
      return turn; 
     } 
     public String getName(){ 
      if(this.getTurns()==1) 
       name="X"; 
      else if(this.getTurns()==0) 
       name="O"; 
      else 
       name="-"; 
      return name; 
     } 
     public void setName(String n){ 
      name=n; 
     } 
     public void setTurns(int t){ 
      turn=t; 
     } 
     public boolean equals(XO x1, XO x2){ 
      if (x1.getName().equals(this.getName())&&x2.getName().equals(this.getName())&&this.getName()!="-") 
       return true; 
      else 
       return false; 
     } 
     public String toString(){ 
      return name; 
     } 
    } 
+0

你可以在你的调试器中检查'board'中的所有元素是不同的吗? –

+0

什么是您的董事会阵列?你可以添加你的全班TicTacToeBoard以及XO吗? –

+0

问题必须在'TicTacToeBoard'中。每当你做一个'setName'时,你可能会重新设置该板。要知道您需要向我们展示您的'TicTacToeBoard'类 – Sachin

回答

0

的问题是你的函数

public String getName(){ 
      if(this.getTurns()==1) 
       name="X"; 
      else if(this.getTurns()==0) 
       name="O"; 
      else 
       name="-"; 
      return name; 
     } 

每次被称为名称字段尽管被更新这是一个getter方法!这不是最佳做法。

让我们一步一步来:

  1. 用户给自己的坐标。
  2. 的名称被设置为正确的值:“X”或
  3. 板印刷(主叫XO.toString“O”(使用名称字段直接 没有通过任何吸气剂
  4. 所述板的状态是使用的getName吸气评估和 现在是当名回来为“ - ”。因为转一直没有 改变

最后,我认为你可以简化XO级转场不添加任何。似乎足以使用名称字段本身,并且if语句是多余的,因为中的布尔表达式方如果只是你想要返回。

class XO { 

    String name="-"; 
public void setName(String name){ 
    this.name=name; 
} 

public String getName(){ 
    return name; 

} 
public boolean equals(XO x1, XO x2){ 
    return(x1.getName().equals(this.getName())&&x2.getName().equals(this.getName())&&this.getName()!="-");    
} 

@Override 
public String toString() { 
    return getName(); 
} 

}

作为一个实例,这可以是最终代码。请注意,可以完成更多的重构,即使用XO状态的枚举。

import java.util.Scanner; 
public class Play { 
    public static void main(String[] args) { 
     Scanner kbd = new Scanner(System.in); 
     TicTacToeBoard t = new TicTacToeBoard(3, 3); 
     t.startBoard(); 
     XO xo1 = new XO(); 
     xo1.setName("O"); 
     XO xo2 = new XO(); 
     xo2.setName("X"); 
     System.out.println("Player 1, what is your name?"); 
     String n1 = kbd.nextLine(); 
     System.out.println("Player 2, what is your name?"); 
     String n2 = kbd.nextLine(); 
     System.out.println(t); 
     while (!t.winner() && !t.full()) { 
      if (t.getTurnCnt() % 2 == 0) { 
       System.out.println(n1 + "(X): "); 
       int x1 = kbd.nextInt(); 
       int y1 = kbd.nextInt(); 
       t.add(x1, y1, xo1); 
       System.out.println(t); 
      } 
      //this is where the board resets 
      else { 
       System.out.println(n2 + "(O): "); 
       int x2 = kbd.nextInt(); 
       int y2 = kbd.nextInt(); 
       t.add(x2, y2, xo2); 
       System.out.println(t); 
      } 
     } 
    } 
} 
    class TicTacToeBoard { 
     private XO[][] board; 
     private int turnCnt; 
     public TicTacToeBoard(int r, int c){ 

      board=new XO[r][c]; 
      turnCnt=0; 
     } 
     public void startBoard(){ 
      for(int i=0;i<3;i++){ 
       for(int j=0;j<3;j++){ 
        board[i][j]=new XO(); 
        board[i][j].setName("-"); 
       } 
      } 
     } 
     public void setTurnCnt(int t){ 
      turnCnt=t; 
     } 
     public XO[][] setBoard(XO[][] b){ 
      return b; 
     } 
     public XO[][] getBoard(){ 
      return board; 
     } 
     public int getTurnCnt(){ 
      return turnCnt; 
     } 
     public boolean add(int x, int y, XO x1){ 
      if(x<=this.getRows()&&y<=this.getCols()&&(board[x-1][y-1].getName().equals("-"))){ 
       board[x-1][y-1].setName(x1.getName()); 
       turnCnt++; 
       return true; 
      } 
      else 
       System.out.println("error"); 
      return false; 
     } 
     public boolean winner(){ 
      boolean t=false; 
      for(int i=0;i<3;i++){ 
       if(board[i][0].equals(board[i][1], board[i][2])||board[0][i].equals(board[1][i], board[2][i])||board[0][0].equals(board[1][1], board[2][2])||board[2][0].equals(board[1][1], board[0][2])) 
        t=true; 
      } 
      return t; 
     } 
     public boolean XWinner(){ 
      boolean t=false; 
      for(int i=0;i<3;i++){ 
       if((board[i][0].equals(board[i][1], board[i][2])&&board[i][1].getName().equals("X"))||(board[0][i].equals(board[1][i], board[2][i])&&board[0][i].getName().equals("X"))||(board[0][0].equals(board[1][1], board[2][2])&&board[0][0].getName().equals("X"))||(board[2][0].equals(board[1][1], board[0][2])&&board[2][0].getName().equals("X"))) 
        t=true; 
      } 
      return t; 
     } 
     public boolean full(){ 
      boolean t=true; 
      for(int r=0;r<3;r++){ 
       for(int c=0;c<3;c++){ 
        if(board[r][c].getName()=="-") 
         t=false; 
       } 
      } 
      return t; 
     } 
     public String toString(){ 
      return "\t\t\tCol\n\t\t1\t2\t3\nRow\t1\t"+board[0][0]+"\t"+board[0][1]+"\t"+board[0][2]+"\n\t2\t"+board[1][0]+"\t"+board[1][1]+"\t"+board[1][2]+"\n\t3\t"+board[2][0]+"\t"+board[2][1]+"\t"+board[2][2]; 
     } 

     public int getRows() { 
      return 3; 
     } 

     public int getCols() { 
      return 3; 
     } 
    } 
    class XO { 

     String name="-"; 

     public void setName(String name){ 
      this.name=name; 
     } 

     public String getName(){ 
      return name; 

     } 
     public boolean equals(XO x1, XO x2){ 
      return(x1.getName().equals(this.getName())&&x2.getName().equals(this.getName())&&this.getName()!="-"); 
     } 

     @Override 
     public String toString() { 
      return getName(); 
     } 
    } 
+0

谢谢!从来没有想过问题是XO方法... –

+0

欢迎来到Stack Overflow。 请注意,在这里说'谢谢'的首选方式是通过 提高投票的好问题和有用的答案(一旦你有足够的声誉这样做),并接受任何 问题最有用的答案,你问(这也给你一个小小的提升,以你的声望 )。 请参阅[关于]页面以及[如何在此提问 ?](http://stackoverflow.com/help/how-to-ask) –

相关问题