【问题标题】:Java Tic Tac Toe Game Confirming WinnerJava井字游戏确认获胜者
【发布时间】:2015-04-01 01:04:35
【问题描述】:

以下是我的井字游戏代码。我遇到了两个问题。一方面,我不确定如何返回哪个玩家获胜(X 或 O),如果有获胜者,我可以返回。同样,当我尝试运行我的程序时,我可能会出现越界错误。我哪里做错了?

我有两个文件,一个是井字游戏,另一个是 TTTBoard。

井字棋.java

import java.util.Scanner;
import java.util.Random;

public class TicTacToe
{
    public static void main(String[]args){
        Scanner reader = new Scanner(System.in);
        TTTBoard board = new TTTBoard();

        System.out.println(board);

        Random gen = new Random();
        char player;
        if(gen.nextInt(2)==1)
            player = 'o';
        else
            player = 'x';
        while(!board.checkWinner() && !board.full()){

            System.out.println(player + " 's turn");
            System.out.println("Enter the row and column [1-3, space, 1-3]: ");
            int row = reader.nextInt();
            int column = reader.nextInt();    
            boolean success = board.placeXor0(player, row, column);
            if(!success)
                System.out.println("Error: cell already occupied!");
            else{
                System.out.println(board);
                if(player == 'x')
                    player = 'o';
                else
                    player = 'x';
                }
            }        
}
}

TTTBoard.java

public class TTTBoard{
    private char[][] board;

    public TTTBoard(){
        board = new char[3][3];
        reset();
    }

    public void reset(){
        for(int row = 0; row < 3; row++)
            for(int column = 0; column < 3; column++)
                board[row][column] = '-';
        }
    public String toString(){
        String result = "\n";
        for(int row = 0; row <3; row++){
            for (int column = 0; column < 3; column++)
                result += board[row][column] + " ";
            result +="\n";
        }
        return result;
    }
    public boolean placeXor0(char player, int row, int column){
        if(board[row -1][column -1]=='-'){
            board[row-1][column-1]= player;
            return true;
        }
        else
            return false;

    }
    public boolean checkWinner(){
        return(checkRowsForWin()||checkColumnsForWin()||checkDiagnalsForWin());
    }

    public boolean full(){
        boolean full = true;
        for(int row = 0; row < 3; row++){
            for(int column = 0; column < 3; column++){
                if(board[row][column] == '-'){
                    full = false;
                }
            }
        }
        return full;
    }
    public boolean checkRowsForWin(){
        for(int row = 0; row < 3; row++){
                if(placeXor0(board[row][0], board[row][1], board[row][2]) == true){
                    return true;
                }
            }

        return false;
    }
    public boolean checkColumnsForWin(){
        for(int column = 0; column < 3; column++){
            if(placeXor0(board[0][column], board[1][column], board[2][column]) == true){
                return true;
                }
            }
        return false;
    }
    public boolean checkDiagnalsForWin(){
        return((placeXor0(board[0][0], board[1][1], board[2][2]) == true) || (placeXor0(board[0][2], board[1][1], board[2][0]) == true));
        }    
}

新代码:

public class TTTBoard{
    private char[][] board;

    public TTTBoard(){
        board = new char[3][3];
        reset();
    }

    public void reset(){
        for(int row = 0; row < 3; row++)
            for(int column = 0; column < 3; column++)
                board[row][column] = '-';
        }
    public String toString(){
        String result = "\n";
        for(int row = 0; row <3; row++){
            for (int column = 0; column < 3; column++)
                result += board[row][column] + " ";
            result +="\n";
        }
        return result;
    }
    public boolean placeXor0(char player, int row, int column){
        if(board[row -1][column -1]=='-'){
            board[row-1][column-1]= player;
            return true;
        }
        else
            return false;

    }
    public boolean checkWinner(){
        return(checkRowsForWin()||checkColumnsForWin()||checkDiagnalsForWin());
    }
    /*public String getWinner(){
        for(int row = 0; row <3; row++){
            for (int column = 0; column < 3; column++)
            }
        }*/
    public boolean full(){
        boolean full = true;
        for(int row = 0; row < 3; row++){
            for(int column = 0; column < 3; column++){
                if(board[row][column] == '-'){
                    full = false;
                }
            }
        }
        return full;
    }
    public boolean checkRowsForWin(){
        for(int row = 0; row < 3; row++){
                if(board[row][0]== board[row][1]&& board[row][0]== board[row][2]){
                    return true;
                }
            }

        return false;
    }
    public boolean checkColumnsForWin(){
        for(int column = 0; column < 3; column++){
            if (board[0][column] == board[1][column] && board[0][column] == board[2][column]) {
                return true;
                }
            }
        return false;
    }
    public boolean checkDiagnalsForWin(){
        return((board[0][0]== board[1][1]&& board[0][0] == board[2][2]) || (board[0][2] == board[1][1] && board[0][2]== board[2][0]));
        }


}

【问题讨论】:

  • 我们需要更多信息。错误的堆栈跟踪如何?
  • @MihirSinghalException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 44 at TTTBoard.placeXor0(TTTBoard.java:26) at TTTBoard.checkRowsForWin(TTTBoard.java:55) at TTTBoard.checkWinner(TTTBoard .java:35) 在 TicTacToe.main(TicTacToe.java:19)
  • @MihirSinghal 我想如果我在 TTTBoard 类中创建一个 getWinner 函数,并将 board.checkWinner() 替换为 board.getWinner(),它应该可以工作(如果播放器,getWinner 的函数会返回X 或 O 是获胜者)。
  • 您的问题与if(placeXor0(board[row][0], board[row][1], board[row][2]) == true) 行有关。第二和第三个数字应该是行号或列号,但您传递的是字符('X''O'
  • @MihirSinghal 我很困惑问题是什么。在 public boolean placeXor0(char player, int row, int column) 行中,我应该使用不同的参数吗?

标签: java arrays java.util.scanner tic-tac-toe


【解决方案1】:

checkRowsForWin 中,您有以下代码行:

if(placeXor0(board[0][column], board[1][column], board[2][column]) == true) {
    return true;
}

您想将其替换为:

if (board[0][column] == board[1][column] && board[0][column] == board[2][column]) {
    return true;
}

checkColumnsForWincheckDiagnalsForWin 做类似的事情

【讨论】:

  • 我更改了所有三个函数,但是现在当我运行程序时,它会跳过其余代码并退出程序。我认为这是因为创建板时每个空格都是“-”,并且由于这些字符在列、行和 diag 中相等,因此将其设置为 true,并退出程序。我想我的下一个问题是如何打印它,以便电路板每隔一次切换它打印的字符。 (例如:现在板的顶部 = --- 而我想要的是 +-+,这样它就不会跳过其余的代码。
  • 或者还有其他原因吗? (我还添加了新代码)
  • 您应该解释哪里出了问题,以及为什么必须完成您建议的事情。
  • @IngoBürk 有没有机会给我一些见解?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多