帮助完成tic tac toe赋值

时间:2016-02-18 08:30:01

标签: java arrays validation

我无法让游戏称之为平局或对角赢,我差不多完成了但是我无法理解。我已经尝试了一切。我可以用直线赢得比赛但对角线似乎没有在循环中完成。而且我不确定它是否会到达整个电路板的循环或完成它,即使它应该。

import java.util.Scanner; //Used for player's input in game



public class TicTacToe 
{   
//instance variables
private char[][] board; //Tic Tac Toe Board, 2d array
private boolean xTurn; // true when X's turn, false if O's turn
private Scanner input; // Scanner for reading input from keyboard

//Constants for creation of gameboard
public final int ROWS = 3; //total rows
public final int COLS = 3; //total columns
public final int WIN = 3; //amount needed to win

public TicTacToe()

{
    //creates the board
    board = new char[ROWS][COLS];

    for(int r = 0; r < ROWS; r++)
    {
        for(int c = 0; c < COLS; c++)
        {   
            board[r][c] = ' ';
        }
    }

    //X's turn when game starts
    xTurn = true; 

    //creates our input object for the turn player
    input = new Scanner(System.in);
}

    //shows game board
public void displayBoard()

{   
 int colNum = 0; //number of columns
 int rowNum = 0; //number of rows

//creates column labels
System.out.println(" \n");
System.out.println("     Columns ");
for (int num = 0; num < COLS; num++)
{
    System.out.print("   " + colNum);
    colNum++;
}

//creates vertical columns and spaces between each spot 
System.out.println(" \n");
for (int row = 0; row < ROWS; row++) 
{
    //numbers rows
    System.out.print(" " + rowNum + "  ");
    rowNum++;

    for (int col = 0; col < COLS; ++col) 
    {
        System.out.print(board[row][col]); // print each of the cells
        if (col != COLS - 1) 
        {
            System.out.print(" | ");   // print vertical partition
        }   
    }

    System.out.println();

    //creates seperation of rows
    if (row != ROWS - 1) 
    {
        System.out.println("   ------------"); // print horizontal partition
    }
}

    //labels row
    System.out.println("Rows \n");

}

    //displays turn player
public void displayTurn()
{
    if (xTurn)
    {
        System.out.println("X's Turn");
    }
    else
    {
        System.out.println("O's Turn");
    }
}

    //allows you to make move
public boolean playerMove()
{
    boolean invalid = true;
    int row = 0;
    int column = 0;

    while(invalid)
    {
        System.out.println("Which row (first) then column (second) would you like to \n"
                           + "play this turn? Enter 2 numbers between 0-2 as \n"
                           + "displayed on the board, seperated by a space to \n"
                           + "choose your position.");

        if (input.hasNextInt())
        {
            row = input.nextInt();

            if (row > ROWS - 1|| row < 0)
                {
                    System.out.println("Invalid position");
                    playerMove();
                }

            else if (row >= 0 && row <= ROWS - 1 && column >= 0 && column <= COLS - 1)
            {
                if (board[row][column] != ' ')
                {
                    System.out.println("Spot is taken \n");
                }

                else
                {
                    invalid = false;
                }
            }
            if(input.hasNextInt())
            {
                column = input.nextInt();

                if (column > COLS - 1|| column < 0)
                {
                    System.out.println("Invalid position");
                  playerMove();
                }

                //checks if spot is filled
                else if (row >= 0 && row <= ROWS - 1 && column >= 0 && column <= COLS - 1)
                {
                    if (board[row][column] != ' ')
                    {
                        System.out.println("Spot is taken \n");
                    }
                    else
                    {
                        invalid = false;
                    }
                }    
            }
        }


        //fills spot if not taken
        if (xTurn)
        {
            board[row][column] = 'X';
        }

        else
        {
            board[row][column] = 'O';
        }
    }
        return displayWinner(row,column);       
}

public boolean displayWinner(int lastR, int lastC)
{
    boolean winner = false;
    int letter = board[lastR][lastC];

    //checks row for win
    int spotsFilled = 0;
    for (int c = 0; c < COLS; c++)
    {
        if(board[lastR][c] == letter)
        {
            spotsFilled++;
        }
    }

    if (spotsFilled == WIN)
    {
        winner = true;
    }

    //checks columns for win
    spotsFilled = 0;
    for (int r = 0; r < ROWS; r++)
    {
        if(board[r][lastC] == letter)
        {
            spotsFilled++;
        }
    }

    if (spotsFilled == WIN)
    {
        winner = true;
    }

    //checks diagonals for win
    spotsFilled = 0;
    for (int i = 0; i < WIN; i++)
    {
        if(board[i][i] == letter)
        {
            spotsFilled++;
        }
    }

    if(spotsFilled == WIN)
    {
        winner = true;
    }

    //checks other diagonal
    spotsFilled = 0;
    for(int i = 0; i < WIN; i++)
    {
        if(board[i][COLS - ( i + 1)] == letter)
        {
            spotsFilled++;
        }
    }

    if(spotsFilled == WIN)
    {
        winner = true;
    }

    return winner;
}

//checks if board is full
public boolean fullBoard()
{
    int filledSpots = 0;

    for(int r = 0; r < ROWS; r++)
    {
        for (int c = 0; c < COLS; c++)
        {
            if (board[r][c] == 'X' || board[r][c] == 'O')
            {
                filledSpots++;
            }
        }
    }
    return filledSpots == ROWS*COLS;
}

//plays game
public void playGame()
{
    boolean finish = true;
    System.out.println("Are your ready to start?");
    System.out.println("1 for Yes or 0 for No? : ");

    if (input.hasNextInt())
    {
        int choice = input.nextInt();

        if(choice > 1 || choice < 0)
    {
        System.out.println("Invalid choice");
        playGame();
    }

    else if (choice == 1)
    {
        while (finish)
        {
            displayBoard();
            displayTurn();

            if (playerMove())
            {
                displayBoard();
                if (xTurn)
                {
                    System.out.println("X won");
                    displayBoard();
                }
                else
                {
                    System.out.println("O won");
                    displayBoard();
                }
            }

            else if (fullBoard())
            {
                displayBoard(); 
                System.out.println("Draw");
            }  
            else
            {
                //no winner, switching turns
                xTurn=!xTurn;
            }
        }
    }
}        
    else 
    {   
        System.out.println("Input not valid");

    }
}
}

和测试人员

public class TicTacToeTester {

/**
 * @param 
 * args the command line arguments
 */
public static void main(String[] args) {

    TicTacToe tictactoe = new TicTacToe();

    tictactoe.playGame();
}

}

0 个答案:

没有答案