当前位置: 首页 > 知识库问答 >
问题:

TicTacToe问题

翟兴邦
2023-03-14

我被我的tictactoe问题困住了。定义一个称为TicTacToe的calss。TicTacToe类型的对象是TicTacToe的单个游戏。将游戏板存储为一个具有三行三列的基类型char的单个2D数组。包括添加移动、显示棋盘、判断轮到谁、判断是否有胜者、判断谁是胜者以及重新开始游戏的方法。为类编写一个主方法,允许两个玩家在同一键盘上依次输入他们的动作。

我写了一些我的方法,并一直在测试我去。当我测试我的代码时,我要么让它放置一个标记,但也打印出无效的条目,要么它会不断地循环,要求移动,然后说空间被占用了。我不知道该怎么解决。我确信这与我的do while循环以及isEmpty和NotValid的布尔方法有关。此外,我还被困在如何为每个玩家的胜利实现一个计数器。

    public void addMove()
    {
        checkTurn();
        int row, col;
        do
        {
        System.out.println("Enter a row (1-3): ");
        row = in.nextInt() - 1; //Array index starts at 0.
        System.out.println("Enter a column (1-3): ");
        col = in.nextInt() - 1;

        if (row>=0 && row<ROWS)
            if(col>=0 && col<COLUMNS)
                if (playerX)
                    {
                        gameBoard[row][col] = player1Move;
                    }
                    else 
                    {
                        gameBoard[row][col] = player2Move;
                    }
         checkForWin();
         changePlayer();
        }while (notValid(row,col));

            System.out.println("Invaild Entry.");
            //System.exit(0); 

        //checkForWin();
        //changePlayer();
    }
    public boolean notValid(int row, int col)
    {
        if (row < 0 || row > ROWS )
            return true;
        if (col < 0 || col > COLUMNS)
            return true;
        if (!isEmpty(row,col))
            return true;
        return false;
    }
    public boolean isEmpty(int row, int col)
    {
        if(gameBoard[row][col]==' ')
            return true;
        else
        {
            System.out.println("Space is already occupied.");
            return false;
        }
    }
}   

下面是我的测试类:

public class TicTacToe
{

    public static void main(String[] args) 
    {
    TicTacToeClass game = new TicTacToeClass();
    game.addMove();
    game.printBoard();


    }

}

共有1个答案

甄飞飙
2023-03-14

我会让你处理多个游戏部分。这玩一个游戏并退出。

import java.util.Scanner;
public class TicTacToe
{
    private final static int ROWS = 3;
    private final static int COLUMNS = 3;
    private char[][] gameBoard;
    private int player1WinCount = 0;
    private int player2WinCount = 0; 
    private char player1Move = 'X', player2Move = 'O';
    private boolean playerX = true;

    Scanner in = new Scanner(System.in);

    public TicTacToe()
    {
        gameBoard  = new char [ROWS][COLUMNS];
        playerX = true;
        startGame();
    }

    //Initiate the game board with all empty spaces. 
    public void startGame()
    {
        for (int row = 0; row < ROWS; row++) //Loop through rows.
            for(int col = 0; col < COLUMNS; col++) //Loop through columns.
                gameBoard[row][col]= ' ';
    }

    public boolean checkTurn()
    {
        if (playerX)
        {
            System.out.println("Player X's turn.");
        }
        else
        {
            System.out.println("Player O's turn.");
        }
        return playerX;
    }

    public void addMove()
    {
        int row, col;
        do
        {
        checkTurn();
        System.out.println("Enter a row (1-3): ");
        row = in.nextInt() - 1; //Array index starts at 0.
        System.out.println("Enter a column (1-3): ");
        col = in.nextInt() - 1;

        if(notValid(row,col)){
            // do not proceed
            System.out.println("Invalid Entry.");
            continue;
        }

        if (row>=0 && row<ROWS)
            if(col>=0 && col<COLUMNS)
                if (playerX)
                    {
                        gameBoard[row][col] = player1Move;
                    }
                    else 
                    {
                        gameBoard[row][col] = player2Move;
                    }
         boolean hasWon = checkForWin();
         if(hasWon)
         {
             System.out.println("You won");
             if(playerX)
             {
                 player1WinCount++;          
             }
             else
             {
                 player2WinCount++;
             }
             break;
         }
         changePlayer();
        }while (true);
    }

    public boolean notValid(int row, int col)
    {
        if (row < 0 || row > (ROWS - 1))
            return true;
        if (col < 0 || col > (COLUMNS - 1))
            return true;
        if (!isEmpty(row,col))
            return true;
        return false;
    }

    public boolean isEmpty(int row, int col)
    {
        if(gameBoard[row][col]==' ')
            return true;
        else
        {
            System.out.println("Space is already occupied.");
            return false;
        }
    }
    public void changePlayer()
    {
        if (playerX)
        {
            playerX = false;
        }
        else
        {
            playerX = true;
        }
    }
    public void printBoard()
    {
        for (int row = 0; row < ROWS; row++){
            for (int col = 0; col < COLUMNS; col++)
            {        
                System.out.print("" + gameBoard[row][col]);
                if(col == 0 || col == 1)
                    System.out.print("|");

            }
            if (row ==0 || row ==1)
            System.out.print("\n-----\n");
        }   
    }
    /**
     * This method checks to see if a winner.
     * return true is there is a winner. 
     */
    public boolean checkForWin()
    {
        //checks rows for win
        for(int row = 0; row < ROWS; row ++)
        {
            if (gameBoard[row][0] == gameBoard[row][1] && gameBoard[row][1]==gameBoard[row][2] && gameBoard[row][0]!= ' ')
            return true;    
        }       
        //checks columns for wins.
        for (int col = 0;  col < COLUMNS; col++)
        {   
            if (gameBoard[0][col] == gameBoard[1][col]&& gameBoard[1][col]==gameBoard[2][col] && gameBoard[0][col]!= ' ')
            return true;
        }
        //check the diagonals for wins.
        if (gameBoard[0][0] == gameBoard[1][1] && gameBoard[1][1] == gameBoard[2][2] && gameBoard[0][0]!= ' ')
            return true;
        if (gameBoard[2][0] == gameBoard[1][1] && gameBoard[1][1] == gameBoard[0][2] && gameBoard[0][2]!= ' ')
            return true;

        return false; 
    }

    public static void main(String args[])
    {
        TicTacToe game = new TicTacToe();
        game.addMove();
        game.printBoard();
    }
}
 类似资料:
  • 我需要创建一个方法来检查tictactoe游戏是否在玩、DRAW、XWIN或owin。然而,我很难编写代码来检查X或O是否获胜,因为游戏板的大小和获胜所需的大小(sizeWin)会根据用户的输入而改变。我被迫使用一维阵列的游戏板。我根本不知道从这里到哪里去。我最近的想法是使用嵌套的for循环来检查是否按行、列或对角线获得胜利,但我不确定如何实现它。如果有人对如何处理这个问题有任何提示,或者有任何其

  • 我是Java的新手,我正在尝试构建一个简单的TicTactoE-game。我创建了checkforWin方法来检查棋盘上不同组合的胜者,它似乎很管用,但似乎很麻烦,我不确定它是否被认为是“好的编码”。这是我的代码: 问题是将checkforWin方法拆分为两个方法是否更好,一个用于播放机,一个用于计算机。此外,我不知道使用和if-else语句来检查板子上的对角线胜利是否是个好主意,开始两个检查中心

  • 我是Java的新手,我正在尝试构建一个简单的TicTactoE-game。我创建了checkforWin方法来检查棋盘上不同组合的胜者,它似乎很管用,但似乎很麻烦,我不确定它是否被认为是“好的编码”。这是我的代码: 问题是将checkforWin方法拆分为两个方法是否更好,一个用于播放机,一个用于计算机。此外,我不知道使用和if-else语句来检查板子上的对角线胜利是否是个好主意,开始两个检查中心

  • 我被要求将我的玩家与玩家的打球游戏改进为玩家与电脑对抗的AI打球游戏:为此,我需要编写两个函数:一个获取棋盘和当前玩家的符号,并返回所有可能的未来棋盘列表-每个未来棋盘都是一个包含两个元素的列表:一个是放置符号的位置另一个是放置符号后的板-一圈后的板(我使用的是嵌套的列表板,如下面的代码所示(我在这里收到了帮助) 我需要的第二个函数是计算机转动的函数——它使用第一个函数并通过以下方式之一选择最佳移

  • 当我编译时,我得到了这个错误:TicTacToe.java:110:error:TicTacToe类中的方法addMove不能应用于给定的类型;if(addMove()){^required:int,int found:无参数原因:实际和正式参数列表长度不同1错误 我怎么才能修好这个?