0

好的,所以我正在写一个井字游戏。我已经编写了整个程序,但我不明白为什么它不能正确显示?

import java.util.Scanner;

public class TicTacToeGame {

        //constants for game options
        static final int STANDARD_GAME = 0;
    static final int QUIT = -1;

    //constants for the number of rows and columns in a standard TicTacToe grid
    static final int STANDARD_GRID_ROWS = 3;
    static final int STANDARD_GRID_COLUMNS = 3;

    //two dimensional array to represent a TicTacToe grid
    static char[][]grid = new char[STANDARD_GRID_ROWS][STANDARD_GRID_COLUMNS];

    //Scanner for input
    static Scanner keyboard = new Scanner(System.in);

//***RUN STANDARD GAME******************************************************

    static void runStandardGame() {

        int position = QUIT;
        char playerChar = 'X';
        boolean isGameOver = false;

        fillPosition();

        System.out.println("Choose a position to play.\n");

        displayGrid();

        do {
            System.out.print("Player " + playerChar +
             " (Enter a position or " + QUIT + " to resign): ");
            position = keyboard.nextInt();

            System.out.println("Choose a position to play.\n");

            displayGrid();

            if(isWin()) {
                System.out.print("\nPlayer " + playerChar +"WINS!!!\n");
                isGameOver = true;
            }
            else if (isTie()) {
                System.out.print("\nTIE.\n");
                isGameOver = true;
            }
            else {
                //switch players because one of the players has just played
                //and not won;, so, it is the other player's turn
                if (playerChar == 'X') {
                    playerChar = 'O';
                }
                else{
                    playerChar = 'X';
                }
            }
           }while(!isGameOver && position != QUIT);

    }//end of runStandardGame

//***PLAY*******************************************************************    

    static void play(int cell, char playerChar) {
        //the player has entered a number 1 through 9 for the position they want
        //to play, so, figure out which row and which column of the array this     is
        //For example, if the player wants to play 'X' in position 7, this means
        //the 'X' must go into row 2, column 0 of the array
        int row = 0;
        int column = 0;

        if (cell > 0 && cell <= (STANDARD_GRID_ROWS * STANDARD_GRID_COLUMNS)){
            row = (cell - 1) / STANDARD_GRID_ROWS;
            column = (cell - 1) % STANDARD_GRID_COLUMNS;
            grid[row][column] = playerChar;
        }
    }

//***IS WIN*****************************************************************    

    static boolean isWin() {
        boolean isWin = false;

        if (isRowWin() || isColumnWin() || isDiagonalWin()){
            isWin = true;
        }

        return isWin;
    }

//***IS TIE*****************************************************************

    static boolean isTie() {
        boolean isTie = false;

                if(!isRowWin() || !isColumnWin() || !isDiagonalWin()){

        int count = 9;                   

        for (int row = 0; row < 3; row ++){

            for (int column = 0; column < 3; column ++){
                if (grid[row][column] == 0)
                    count --;
                }
        }

        if (count == 0)
            {
            System.out.println("\nSorry, this game is tied.  Better luck next time!");
            return true;                
            }
        }
        return isTie;
    }

//***IS ROW WIN**********************************************************

    static boolean isRowWin() {

        boolean isRowWin = false;
        int column = 0 ;

        for (int row = 0;row < STANDARD_GRID_ROWS && !isRowWin; row++) {

            //if the three array elements on the same row are equal, 
            //then one of the players has either three 'X's on that
            //row, or three 'O's, and therefore, has won
            if (grid[row][column] == grid[row][column+1] &&
                grid[row][column+1] == grid[row][column+2]){
                    isRowWin = true;
                }
        }

        return isRowWin;

    }

//***IS COLUMN WIN**********************************************************

    static boolean isColumnWin() {

        boolean isColumnWin = false;

        int row = 0 ;

        for (int column = 0;column < STANDARD_GRID_COLUMNS && !isColumnWin;      column++) {

            //if the three array elements on the same row are equal, 
            //then one of the players has either three 'X's on that
            //row, or three 'O's, and therefore, has won
            if (grid[row][column] == grid[row+1][column] &&
                grid[row+1][column] == grid[row+2][column]){
                    isColumnWin = true;
                }
        }

        return isColumnWin;

    }

//***IS DIAGONAL WIN********************************************************

    static boolean isDiagonalWin() {

        boolean isDiagonalWin = false;
        int row = 0;
        int column = 0;
        if(
                (grid[row][column] == grid[row+1][column+1] &&
            grid[row+1][column+1] == grid[row+2][column+2])||
            (grid[row][column+2] == grid[row+1][column+1] &&
            grid[row+1][column+1] == grid[row+2][column])){
                isDiagonalWin = true;
            }

        return isDiagonalWin;

    }

//***GET USER CHOICE********************************************************

    static int getUserChoice() {
        int choice;

        System.out.print("Please enter your choice: ");
        choice = keyboard.nextInt();

        return choice;

    }

//***FILL POSITIONS*********************************************************

    static void fillPosition(){

        char position = '1';

                for (int row = 0; row < STANDARD_GRID_ROWS; row++) {
                    for (int column = 0; column < STANDARD_GRID_COLUMNS; column++) {
                         grid[row][column] = (char) ('1' + row*STANDARD_GRID_COLUMNS + column);
                    }
                }

        }

//***DISPLAY GRID***********************************************************

    static void displayGrid() {



    System.out.println((grid[0][0]) + " | " + (grid[0][1]) + " | " + (grid[0][2]));
    System.out.println("---------");
    System.out.println((grid[1][0]) + " | " + (grid[1][1]) + " | " + (grid[1][2]));
    System.out.println("---------");
    System.out.println((grid[2][0]) + " | " + (grid[2][1]) + " | " + (grid[2][2]));


    }

//***END********************************************************************

}//end of class

在游戏中,我希望它显示板为:

 1 | 2 | 3
-----------
 4 | 5 | 6
-----------
 7 | 8 | 9

无论我选择什么,无论在哪里,它都会反复要求我做出选择......即使我会故意赢一场,或者让他们打成平局以结束它,它是永无止境的......这是一个逻辑错误吗?

另外,我删除了一些我知道是正确的代码,这样更容易阅读和理解。

4

4 回答 4

3

do-while 循环fillPosition只执行一次。在条件下row<4 && column<4 && position<10,布尔值position<10最初将是false. 因为position是一个char

position < 10

被解释为

(int)position < 10

(int)position = (int)'2' = 49(position'2'第一次循环迭代之后),它不小于10,所以这个条件是false,意味着整个循环条件也是false- 并且因此循环结束。

因此,'1'正确放置了,但没有其他操作(这是一个 do-while 循环,因此无论其条件如何,它都至少执行一次)。

于 2012-11-19T23:38:13.110 回答
2

您正在尝试将 char(列)与数字 10 进行比较,字符 '1' 的 ascii 数字大于那时,因此循环中断

于 2012-11-19T23:35:31.960 回答
1

fillPosition do-loop的退出条件是错误的......

我还建议不要使用字符算术,最好使用 int and Interger.toString(int),但这只是我。

例如,在使用复合for循环填充grid数组时使用循环,外部开始用于行,内部用于列

于 2012-11-19T23:38:29.013 回答
1

你的fillPosition()方法不对。它应该看起来像这样:

    static void fillPosition(){
        for (int row = 0; row < STANDARD_GRID_ROWS; row++) {
            for (int column = 0; column < STANDARD_GRID_COLUMNS; column++) {
                grid[row][column] = (char) ('1' + row*STANDARD_GRID_COLUMNS + column);
            }
        }

    }
于 2012-11-19T23:34:21.207 回答