Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二维数组中的对象不断重置,我不';我不知道为什么_Java_Oop_Multidimensional Array - Fatal编程技术网

Java 二维数组中的对象不断重置,我不';我不知道为什么

Java 二维数组中的对象不断重置,我不';我不知道为什么,java,oop,multidimensional-array,Java,Oop,Multidimensional Array,我正在尝试做一个tic tac toe游戏,当输入第一个X或O时效果很好,但当输入第二个X或O时,前一个X或O会被删除,新的X或O会被放入。我不知道为什么会这样 import java.util.Scanner; public class Play { public static void main(String[] args){ Scanner kbd=new Scanner(System.in); Ti

我正在尝试做一个tic tac toe游戏,当输入第一个X或O时效果很好,但当输入第二个X或O时,前一个X或O会被删除,新的X或O会被放入。我不知道为什么会这样

     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);
                }
TictoeBoard类别:

     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];
        }
    }

问题出在你的功能上

public String getName(){
            if(this.getTurns()==1)
                name="X";
            else if(this.getTurns()==0)
                name="O";
            else
                name="-";
            return name;
        }
每次调用时,名称字段都会更新,尽管它是一个getter方法!这不是最佳做法

让我们一步一步来:

  • 用户给出他的坐标
  • 名称设置为正确的值:“X”或“O”
  • 印制板(调用XO.toString)(使用名称字段直接 没有通过任何getter
  • 使用getName getter和 现在是名称变回“-”的时候了,因为转弯还没有结束 变了
  • 最后,我认为您可以简化XO类。Turn字段没有任何价值。使用name字段本身似乎就足够了。if语句是多余的,因为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();
             }
         }
    
    import java.util.Scanner;
    公演{
    公共静态void main(字符串[]args){
    扫描仪kbd=新扫描仪(System.in);
    TicTacToeBoard t=新的TicTacToeBoard(3,3);
    t、 起始板();
    XO xo1=新的XO();
    xo1.集合名(“O”);
    XO xo2=新的XO();
    xo2.集合名(“X”);
    System.out.println(“玩家1,你叫什么名字?”);
    字符串n1=kbd.nextLine();
    System.out.println(“玩家2,你叫什么名字?”);
    字符串n2=kbd.nextLine();
    系统输出打印ln(t);
    而(!t.winner()&&!t.full()){
    if(t.getTurnCnt()%2==0){
    系统输出打印LN(n1+“(X):”;
    int x1=kbd.nextInt();
    inty1=kbd.nextInt();
    t、 添加(x1,y1,xo1);
    系统输出打印ln(t);
    }
    //这是董事会重置的地方
    否则{
    系统输出打印LN(n2+“(O):”;
    int x2=kbd.nextInt();
    int y2=kbd.nextInt();
    t、 添加(x2,y2,xo2);
    系统输出打印ln(t);
    }
    }
    }
    }
    类TicTacToeBoard{
    私人XO[]董事会;
    私人互联网;
    公共交通线路板(内部r、内部c){
    董事会=新的XO[r][c];
    turnCnt=0;
    }
    公共无效起始板(){
    
    对于(int i=0;我可以在调试器中检查
    板中的所有元素是否不同吗?板阵列是由什么组成的?能否添加整个类TictoeBoard以及XO?问题一定出在
    TictoeBoard
    中。您可能在每次执行
    设置名称时都会重置板。要知道是否存在问题e您需要向我们展示您的
    TictoeBoard
    classI已添加TictoE类和XO类欢迎使用Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票表决好的问题和有用的答案(一旦您有足够的声誉这么做),并接受对您提出的任何问题的最有帮助的答案(这也会给您的声誉带来一点提升)。请查看页面并
    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();
             }
         }