簡體   English   中英

井字游戲在Java中打印錯誤

[英]Tic Tac Toe in Java printing error

我幾乎完成了這項家庭作業,但是輸出出現一些打印錯誤。 游戲功能正常,但是方法printOBoardprintXBoard存在問題, printXBoard在移動時會弄亂游戲板。 游戲持續進行的時間越長,問題就越嚴重。 謝謝你的幫助。

import java.util.Scanner;

public class TicTacToe {

private enum Tiles {
    X, O, EMPTY;
}
public static void main(String[] args) {

    int i;
    int j;
    //initialize 2d array of enum types called "board"
    Tiles[][] board = new Tiles[3][3];
    for (i=0; i<board.length; i++) 
        for (j=0; j<board.length; j++)
            board[i][j] = Tiles.EMPTY;

    //print out an empty board as a 2d array, with each tile set as "EMPTY"
    printBoard(board);
    int row, col;
    int countEmpty=0;

    //initial countEmpty count, if it's less than 1, the board is full and the game is over.
    for (i=0; i<board.length; i++)
        for (j=0; j<board.length; j++)
            if (board[i][j] == Tiles.EMPTY)
                countEmpty++;

    while (countEmpty > 0) {

        //Player O enters the row coordinate
        System.out.println("Player O's turn.");
        System.out.println("Player O:  Enter row (0, 1, or 2):");
        Scanner stdin1 = new Scanner(System.in);
        row = stdin1.nextInt();

        //Player O enters the column coordinate
        System.out.println("Player O:  Enter column (0, 1, or 2):");
        Scanner stdin2 = new Scanner(System.in);
        col = stdin2.nextInt();
        //If the tile is empty, it was a valid move, and an 'O' is placed on the spot.  
        if (board[row][col] == Tiles.EMPTY) {
            board[row][col] = Tiles.O;
            //MOVE FOR O ********************
            printOBoard(board, row, col);
            checkWin(board);
            if (checkWin(board) == 2)
                ;
            else
                break;


        }
        //If the tile is not empty, it was not a valid move, and Player O is prompted to try again.  
        else {
            System.out.println("Space already occupied.  Please choose another.");
            System.out.println("Player O's turn.");
            //Player 0 enters the row coordinate
            System.out.println("Player O:  Enter row (0, 1, or 2):");
            stdin1 = new Scanner(System.in);
            row = stdin1.nextInt();

            //Player O enters the column coordinate
            System.out.println("Player O:  Enter column (0, 1, or 2):");
            stdin2 = new Scanner(System.in);
            col = stdin2.nextInt();
            //ERROR MOVE FOR O********************
            board[row][col] = Tiles.O;
            printOBoard(board, row, col);



            checkWin(board);
            if (checkWin(board) == 2)
                ;
            else
                break;
        }



        //Player X enters the row coordinate
        System.out.println("Player X's turn.");
        System.out.println("Player X:  Enter row (0, 1, or 2):");
        Scanner stdin3 = new Scanner(System.in);
        row = stdin3.nextInt();

        //Player X enters the column coordinate
        System.out.println("Player X:  Enter column (0, 1, or 2):");
        Scanner stdin4 = new Scanner(System.in);
        col = stdin4.nextInt();

        if (board[row][col] == Tiles.EMPTY) {
            board[row][col] = Tiles.X;
        printXBoard(board, row, col);
            //MOVE FOR X *************************************************
        checkWin(board);
        if (checkWin(board) == 2)
            ;
        else
            break;
        }

        else {
            System.out.println("Space already occupied.  Please choose another.");
            System.out.println("Player O's turn.");
            System.out.println("Player O:  Enter row (0, 1, or 2):");
            stdin3 = new Scanner(System.in);
            row = stdin3.nextInt();

            //Player O enters the column coordinate
            System.out.println("Player O:  Enter column (0, 1, or 2):");
            stdin4 = new Scanner(System.in);
            col = stdin4.nextInt();
            board[row][col] = Tiles.O;
            //ERROR MOVE FOR X ****************************************
            printXBoard(board, row, col);
            checkWin(board);
            if (checkWin(board) == 2)
                ;
            else
                break;
        }

        //After both players move, we check to see if the board is full.
        countEmpty = 0;
        for (i=0; i<board.length; i++)
            for (j=0; j<board.length; j++)
                if (board[i][j] == Tiles.EMPTY)
                    countEmpty++;       

    }

}

//method printBoard prints out a grid of EMPTY's and returns nothing
private static void printBoard(Tiles board[][]) {
    int i, j;

    System.out.println(" -----------------------------");
    System.out.println("|         |         |         |");
    for (i=0; i<board.length; i++){
        for (j=0; j<board.length; j++){
            System.out.printf("|  " + board[i][j] + "  ");
        }
        System.out.println("|");
        System.out.println("|         |         |         |");
        System.out.println(" -----------------------------");
        if (i<2)
            System.out.println("|         |         |         |");
    }
    return;
}

//method printXBoard prints out the grid modified with the addition of an X after Player X's turn
private static void printXBoard(Tiles board[][], int curRow, int curCol) {
    int i, j;

    System.out.println(" -----------------------------");
    System.out.println("|         |         |         |");
    for (i=0; i<board.length; i++){
        for (j=0; j<board.length; j++){
            if (i == curRow && j == curCol)
                board[i][j] = Tiles.X;
            else
                ;
            System.out.printf("|  " + board[i][j] + "  ");
        }
        System.out.println("|");
        System.out.println("|         |         |         |");
        System.out.println(" -----------------------------");
        if (i<2)
            System.out.println("|         |         |         |");
    }
    return;
}

//method printOBoard prints out the grid modified with the addition of an X after Player X's turn
private static void printOBoard(Tiles board[][], int curRow, int curCol) {
    int i, j;

    System.out.println(" -----------------------------");
    System.out.println("|         |         |         |");
    for (i=0; i<board.length; i++){
        for (j=0; j<board.length; j++){
            if (i == curRow && j == curCol)
                board[i][j] = Tiles.O;
            else
                ;
            System.out.printf("|  " + board[i][j] + "  ");
        }
        System.out.println("|");
        System.out.println("|         |         |         |");
        System.out.println(" -----------------------------");
        if (i<2)
            System.out.println("|         |         |         |");
    }
    return;
}


//method checkWin checks all possible winning combinations for both players.
private static int checkWin(Tiles board[][]) {
    if (board[0][0] == Tiles.X && board[0][1] == Tiles.X && board[0][2] == Tiles.X){
        System.out.println("Player X wins!");
        return 1;
    }
    else if (board[0][0] == Tiles.X && board[1][1] == Tiles.X && board[2][2] == Tiles.X){
        System.out.println("Player X wins!");
        return 1;
    }
    else if (board[0][0] == Tiles.X && board[1][0] == Tiles.X && board[2][0] == Tiles.X){
        System.out.println("Player X wins!");
        return 1;
    }
    else if (board[1][0] == Tiles.X && board[1][1] == Tiles.X && board[1][2] == Tiles.X){
        System.out.println("Player X wins!");
        return 1;
    }
    else if (board[2][0] == Tiles.X && board[2][1] == Tiles.X && board[2][2] == Tiles.X){
        System.out.println("Player X wins!");
        return 1;
    }
    else if (board[0][1] == Tiles.X && board[1][1] == Tiles.X && board[2][1] == Tiles.X){
        System.out.println("Player X wins!");
        return 1;
    }
    else if (board[0][2] == Tiles.X && board[1][2] == Tiles.X && board[2][2] == Tiles.X){
        System.out.println("Player X wins!");
        return 1;
    }
    else if (board[2][0] == Tiles.X && board[1][1] == Tiles.X && board[0][2] == Tiles.X){
        System.out.println("Player X wins!");
        return 1;
    }

    //check if player O wins
    else if (board[0][0] == Tiles.O && board[0][1] == Tiles.O && board[0][2] == Tiles.O){
        System.out.println("Player O wins!");
        return 0;
    }
    else if (board[0][0] == Tiles.O && board[1][1] == Tiles.O && board[2][2] == Tiles.O){
        System.out.println("Player O wins!");
        return 0;
    }
    else if (board[0][0] == Tiles.O && board[1][0] == Tiles.O && board[2][0] == Tiles.O){
        System.out.println("Player O wins!");
        return 0;
    }
    else if (board[1][0] == Tiles.O && board[1][1] == Tiles.O && board[1][2] == Tiles.O){
        System.out.println("Player O wins!");
        return 0;
    }
    else if (board[2][0] == Tiles.O && board[2][1] == Tiles.O && board[2][2] == Tiles.O) {
        System.out.println("Player O wins!");
        return 0;
    }
    else if (board[0][1] == Tiles.O && board[1][1] == Tiles.O && board[2][1] == Tiles.O) {
        System.out.println("Player O wins!");
        return 0;
    }
    else if (board[0][2] == Tiles.O && board[1][2] == Tiles.O && board[2][2] == Tiles.O){
        System.out.println("Player O wins!");
        return 0;
    }
    else if (board[2][0] == Tiles.O && board[1][1] == Tiles.O && board[0][2] == Tiles.O) {
        System.out.println("Player O wins!");
        return 0;
    }
    else 
        return 2;
}
}

第二次嘗試放置X時出現問題(如果O占用了空間),則從O復制粘貼的代碼,並且沒有更改播放器和圖塊。

System.out.println("Player O's turn.");
board[row][col] = Tiles.O;

閱讀這段代碼很痛苦-_-但最終會變得更好;)。

之所以在將字母打印到板上(我已經在Mac上運行)時發生這種情況的原因是,當您打印字母時,您使用的是println ...,因為您隨附了您應該使用printf的每個塊一定的空間...例如:

System.out.printf("%10s", LetterVariableForTurn);

這將使LetterVariableForTurn可以在其中寫入10個文本空間。

這是一個可以幫助您更多的鏈接: printf

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM