2016-02-18 79 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) –

相關問題