jeudi 22 novembre 2018

Tic Tac Toe Ai Player is bugged

I recently made a Tic Tac Toe game in java for a school assignment and it works good for the most part....

In the Example below the first move was made by the player and the 2nd by the AI The issue as you can see is that the Ai just placed a marker on the where the player previously placed their marker. This issue is of random occurrence and I dont know where the bug in the code is.

you entered Row: 3 and Column: 3

| X | | O | | O |

| 4 | | O | | 6 |

| X | | X | | O |


| X | | O | | O |

| 4 | | O | | 6 |

| X | | X | | X |

You lost to a computer! Would you like to play again? Type 1 for yes or 2 to quit

The code is below from the 5 classes: Main Class

public static void main(String[] args) {



    System.out.println("Welcome to Tick Tac Toe. You will be playing versus a Super Computer!!!");
    System.out.println();


    boolean playAgain = true;

    Scanner s = new Scanner(System.in);



    //************ Java Creates the player Objects************//
    HumanPlayer human = new HumanPlayer();
    Computer computer = new Computer();

    while(playAgain){
        //**************The Board gets setup and the player picks their marker*************//
        SetUp Setup = new SetUp();

        Setup.createBoard();
        Setup.printBoard();

        System.out.println("Please choose your marker");
        System.out.println("Type 1 for 'X' or 2 for '0'");

        //set markers
        if(s.nextInt() == 1){
            // create player objects
            human.setMarker("X");
            computer.setMarker("O");
            System.out.println("You are now X");
            System.out.println("The computer is O");
        } 
        else
        {
            human.setMarker("O");
            computer.setMarker("X");
            System.out.println("You are now O");
            System.out.println("The computer is X");

        }


        //*************Randomly Choose a number from 0 to 1*********************//
        Random rn = new Random();
        int first = rn.nextInt(2);


        boolean won = false;
        int turns = 0;

        //*********************If you go FIRST**********************//
        if(first == 0){
            System.out.println("You go First!");
            System.out.println();
            while(!won){
                human.takeTurn(Setup.getBoard());
                turns++;
                Setup.printBoard();
                if(Setup.hasWon(Setup.getBoard())){
                    won = true;
                    System.out.println("Congrats you won!");
                }
                 if (turns == 9){
                    System.out.println("Its a draw!");
                    break;
                }

                 if(!won){
                    computer.takeTurn(Setup.getBoard(), human);
                    turns++;
                    System.out.println();
                    Setup.printBoard();
                    System.out.println();
                    if(Setup.hasWon(Setup.getBoard())){
                        won = true;
                        System.out.println("You lost to a computer!");
                    }
                    if(turns == 9){
                        System.out.println("Its a draw!");
                        break;
                    }
                }

            }  
        }
        //*******************If the computer goes FIRST******************//
        else {

            System.out.println("Computer goes first!");
            System.out.println();
            while(!won){
                computer.takeTurn(Setup.getBoard(), human);
                turns++;
                Setup.printBoard();
                if(Setup.hasWon(Setup.getBoard())){
                    won = true;
                    System.out.println("You lost to a computer!");
                }
                 if(turns == 9){
                    System.out.println("Its a draw!");
                    break;
                }
                if(!won){
                    human.takeTurn(Setup.getBoard());
                    turns++;
                    System.out.println();
                    Setup.printBoard
    ();
                    System.out.println();
                    if(Setup.hasWon(Setup.getBoard())){
                        won = true;
                        System.out.println("You are victorious!");
                    }
                     if(turns == 9){
                        System.out.println("Its a draw!");
                        break;
                    }
                }



            }  

        }
        //********************* Asks the user if they want to play again or quit**************************//
        System.out.println("Would you like to play again? Type 1 for yes or 2 to quit");
        System.out.println();
        if(s.nextInt() == 2){
            playAgain = false;
        }
    }
  }



    }

Setup Class

public class SetUp extends Player{
// setup variables default board size and board
private int Y = 3;
public String[][] board = new String [Y][Y];

public boolean hasWon (String [] [] board){
    //horizontal 
    for(int i = 0; i<3; i++){
        if(board[i][0].equals(board[i][1]) && board[i][1].equals(board[i][2])){
            return true;
        }
    }
    //vertical
    for(int i = 0; i<3; i++){
        if(board [0][i].equals(board[1][i]) && board[1][i].equals(board[2][i])){
            return true;
        }
    }
    //diagonal
    if(board[0][0].equals(board[1][1]) && board[1][1].equals(board[2][2]) || board[2][0].equals(board[1][1]) && board[1][1].equals(board[0][2]))
        return true;
    return false;
}


int x = 1;

public void createBoard(){

    for(int i = 0; i < board.length; i++){
        for(int j = 0; j < board.length; j++){
            board[i][j] = "" + (x) + "";
            x++;
        }
    }
}

public void printBoard(){

    for(int i = 0; i < board.length; i++){
        for(int j = 0; j < board.length; j++){
            System.out.print("| " + board[i][j] + " |" + " ");

        }
        System.out.println();
    }

}



public String[][] getBoard(){

    return board;

}



}

Player Class

 public class Player {
 public String Player;

// set marker method

public void setMarker(String marker){

    Player = marker;

}

//get marker method 

public String getMarker(){

    return Player;

}

}

HumanPlayer Class

class HumanPlayer extends Player {

public HumanPlayer(){

}


public void takeTurn(String[][] board) {

Scanner s = new Scanner(System.in);

boolean turn = true;

while(turn){
    System.out.println("Please enter row #");
    int row = s.nextInt();
    System.out.println("Please enter column #");
    int col = s.nextInt();
    System.out.print("you entered Row: "+row+" and Column: "+col);
    System.out.println();
    if(board[row - 1][col - 1] != "X" && board[row - 1][col - 1] != "O"){
        board[row - 1][col - 1] = Player;
        turn = false;
    } 
    else {
        System.out.println("Someone already placed a marker in this location. Pick another location");
    }
} 
} 

} 

Computer Class:

class Computer extends Player {

public Computer(){

}

int boardsize = 3;


public void takeTurn(String[][] board, HumanPlayer human) {


boolean mademove = false;


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

    if(board[0][i].equals(board[1][i]) && board[0][i].equals(Player)){

        if(board[2][i] != human.getMarker() && board[2][i] != Player){
            board[2][i] = Player;
            mademove = true;
            return;
        }

    }

}

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

    if(board[2][i].equals(board[1][i]) && board[2][i].equals(Player)){

        if(board[0][i] != human.getMarker() && board[0][i] != Player){
            board[0][i] = Player;
            mademove = true;
            return;
        }

    }


}




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

    if(board[i][0].equals(board[i][1]) && board[i][0].equals(Player)){

        if(board[i][2] != human.getMarker() && board[i][2] != Player){
            board[i][2] = Player;
            mademove = true;
            return;
        }

    }

}

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

    if(board[i][2].equals(board[i][1]) && board[i][2].equals(Player)){

        if(board[i][0] != human.getMarker() && board[i][0] != Player){
            board[i][0] = Player;
            mademove = true;
            return;
        }

    }

}





if(board[0][0].equals(board[1][1]) && board[0][0].equals(Player)){

    if(board[2][2] != human.getMarker() && board[2][2] != Player){
        board[2][2] = Player;
        mademove = true;
        return;
    }
}

if(board[2][2].equals(board[1][1]) && board[2][2].equals(Player)){

    if(board[0][0] != human.getMarker() && board[0][0] != Player){
        board[0][0] = Player;
        mademove = true;
        return;
    }
}

if(board[0][0].equals(board[1][1]) && board[0][0].equals(Player)){

    if(board[2][2] != human.getMarker() && board[2][2] != Player){
        board[2][2] = Player;
        mademove = true;
        return;
    }
}

if(board[0][2].equals(board[1][1]) && board[0][2].equals(Player)){

    if(board[2][0] != human.getMarker() && board[2][0] != Player){
        board[2][0] = Player;
        mademove = true;
        return;
    }
}

if(board[2][0].equals(board[1][1]) && board[2][0].equals(Player)){

    if(board[0][2] != human.getMarker() && board[0][2] != Player){
        board[0][2] = Player;
        mademove = true;
        return;
    }
}





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

    if(board[0][i].equals(board[1][i]) && board[0] 
[i].equals(human.getMarker())){
        if(board[2][i] != Player && board[2][i] != human.getMarker()){
            board[2][i] = Player;
            mademove = true;
            return;
        }

    }

}

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

    if(board[2][i].equals(board[1][i]) && board[0] 
[i].equals(human.getMarker())){

        if(board[0][i] != Player && board[0][i] != human.getMarker()){
            board[0][i] = Player;
            mademove = true;
            return;
        }

    }


}




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

    if(board[i][0].equals(board[i][1]) && board[i] 
[0].equals(human.getMarker())){

        if(board[i][2] != Player && board[i][2] != human.getMarker()){
            board[i][2] = Player;
            mademove = true;
            return;
        }

    }

}

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

    if(board[i][2].equals(board[i][1]) && board[i] 
[2].equals(human.getMarker())){

        if(board[i][0] != Player && board[i][0] != human.getMarker()){
            board[i][0] = Player;
            mademove = true;
            return;
        }

    }

}

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

    if(board[2][i].equals(board[1][i]) && board[2] 
[i].equals(human.getMarker())){

        if(board[0][i] != Player && board[0][i] != human.getMarker()){
            board[0][i] = Player;
            mademove = true;
            return;
        }

    }

}






if(board[0][0].equals(board[1][1]) && board[0][0].equals(human.getMarker())) 
{

    if(board[2][2] != Player && board[2][2] != human.getMarker()){
        board[2][2] = Player;
        mademove = true;
        return;
    }
}

if(board[2][2].equals(board[1][1]) && board[2][2].equals(human.getMarker())) 
{

    if(board[0][0] != Player && board[0][0] != human.getMarker()){
        board[0][0] = Player;
        mademove = true;
        return;
    }
}

if(board[0][0].equals(board[1][1]) && board[0][0].equals(human.getMarker())) 
{
    if(board[2][2] != Player && board[2][2] != human.getMarker()){
        board[2][2] = Player;
        mademove = true;
        return;
    }
}

if(board[0][2].equals(board[1][1]) && board[0][2].equals(human.getMarker())) 
{

    if(board[2][0] != Player && board[2][0] != human.getMarker()){
        board[2][0] = Player;
        mademove = true;
        return;
    }
}

if(board[2][0].equals(board[1][1]) && board[2][0].equals(human.getMarker())) 
{

    if(board[0][2] != Player && board[0][2] != human.getMarker()){
        board[0][2] = Player;
        mademove = true;
        return;
    }
}




// Ai Makes a random move.
int rand1 = 0;
int rand2 = 0;

while(!mademove){

    rand1 = (int) (Math.random() * 3);
    rand2 = (int) (Math.random() * 3);

    if(board[rand1][rand2] != "x" && board[rand1][rand2] != "o"){
        board[rand1][rand2] = Player;
        mademove = true;        

    }

}


}   
}

Thank you for the help guys.

Aucun commentaire:

Enregistrer un commentaire