Skip to content
Advertisement

Tic Tac Toe runs and functions completely, but after getting 3 in a row, another move has to be made for it to end [closed]

Is anyone of you able to find out why it loops around 1 extra time even though the while condition isn’t true anymore?

NOTE: I have no clue if this is the right way of doing stuff on here, but here’s the code. My code also isn’t the most optimized, as I was planning on doing that after I got stuff working, but, well, that isn’t the case right now.

import nl.saxion.app.SaxionApp;

import java.util.ArrayList;

public class Application implements Runnable {

    public static void main(String[] args) {
        SaxionApp.start(new Application(), 650, 500);
    }

    public void run() {
        // Game Size
        int sizeInput = boardSize(); // Call method "boardSize()"

        if (sizeInput < 50) {
            sizeInput = 50;
            SaxionApp.printLine("Input too low, defaulted to min(50)");
        } else if (sizeInput >90) {
            sizeInput = 90;
            SaxionApp.printLine("Input too high, defaulted to max(90)");
        }

        int absoluteWidth = sizeInput*7;
        int absoluteHeight = sizeInput*7;
        SaxionApp.resize(absoluteWidth, absoluteHeight);

        int celWidth = absoluteWidth/5;
        int celHeight = absoluteHeight/5;

        int fontSize = celHeight / 3;

        ArrayList<String> cells = new ArrayList<>();
        setFields(cells);

        String cell1 = cells.get(0);
        String cell2 = cells.get(1);
        String cell3 = cells.get(2);
        String cell4 = cells.get(3);
        String cell5 = cells.get(4);
        String cell6 = cells.get(5);
        String cell7 = cells.get(6);
        String cell8 = cells.get(7);
        String cell9 = cells.get(8);


        // Game over code
        boolean gameOver = false;
        // Winconditions
        String playerSymbol = "";

        int activePlayer = 1;
        int playerMove = 0;

        while (!gameOver){
            drawBoard(celWidth, celHeight, fontSize, cell1, cell2, cell3, cell4, cell5, cell6, cell7, cell8, cell9);



            SaxionApp.print("Player " + playerSymbol + ", make your move(1-9)?");
            playerMove = SaxionApp.readInt();


            if (activePlayer == 1 && !gameOver) {
                // Player 1 turn
//                SaxionApp.print("Player X, make your move(1-9)?");
//                playerMove = SaxionApp.readInt();

                activePlayer = 2;

                if (playerMove == 0) {

                    SaxionApp.clear();
                    SaxionApp.printLine("Thank You For User Our App! :D");
                } else if (cells.get(playerMove-1).equals("O") || cells.get(playerMove-1).equals("X")) {
                    SaxionApp.clear();
                    SaxionApp.printLine("This cell has already been chosen, pick another!");
                    activePlayer = 1;

                } else if (playerMove == 1) {
                    cell1 = "X";
                    cells.set(0, "X");
                    SaxionApp.clear();
                }
                else if (playerMove == 2) {
                    cell2 = "X";
                    cells.set(1, "X");
                    SaxionApp.clear();
                }
                else if (playerMove == 3) {
                    cell3 = "X";
                    cells.set(2, "X");
                    SaxionApp.clear();
                }
                else if (playerMove == 4) {
                    cell4 = "X";
                    cells.set(3, "X");
                    SaxionApp.clear();
                }
                else if (playerMove == 5) {
                    cell5 = "X";
                    cells.set(4, "X");
                    SaxionApp.clear();
                }
                else if (playerMove == 6) {
                    cell6 = "X";
                    cells.set(5, "X");
                    SaxionApp.clear();
                }
                else if (playerMove == 7) {
                    cell7 = "X";
                    cells.set(6, "X");
                    SaxionApp.clear();
                }
                else if (playerMove == 8) {
                    cell8 = "X";
                    cells.set(7, "X");
                    SaxionApp.clear();
                }
                else if (playerMove == 9) {
                    cell9 = "X";
                    cells.set(8, "X");
                    SaxionApp.clear();
                }
                playerSymbol = "O";

                /*else if (playerMove == 0) {
                    i = 9;
                    SaxionApp.clear();
                    SaxionApp.printLine("Thank You For User Our App! :D");
                }*/

            } else if (activePlayer == 2 && !gameOver){
                // Player 2 turn
//                SaxionApp.print("Player O, make your move(1-9)?");
//                playerMove = SaxionApp.readInt();

                activePlayer = 1;

                if (playerMove == 0) {

                    SaxionApp.clear();
                    SaxionApp.printLine("Thank You For User Our App! :D");
                } else if (cells.get(playerMove-1).equals("X")) {
                    SaxionApp.clear();
                    SaxionApp.printLine("Player X has already chosen this, pick another!");
                    activePlayer = 2;

                } else if (playerMove == 1) {
                    cell1 = "O";
                    cells.set(0, "O");
                    SaxionApp.clear();
                }
                else if (playerMove == 2) {
                    cell2 = "O";
                    cells.set(1, "O");
                    SaxionApp.clear();
                }
                else if (playerMove == 3) {
                    cell3 = "O";
                    cells.set(2, "O");
                    SaxionApp.clear();
                }
                else if (playerMove == 4) {
                    cell4 = "O";
                    cells.set(3, "O");
                    SaxionApp.clear();
                }
                else if (playerMove == 5) {
                    cell5 = "O";
                    cells.set(4, "O");
                    SaxionApp.clear();
                }
                else if (playerMove == 6) {
                    cell6 = "O";
                    cells.set(5, "O");
                    SaxionApp.clear();
                }
                else if (playerMove == 7) {
                    cell7 = "O";
                    cells.set(6, "O");
                    SaxionApp.clear();
                }
                else if (playerMove == 8) {
                    cell8 = "O";
                    cells.set(7, "O");
                    SaxionApp.clear();
                }
                else if (playerMove == 9) {
                    cell9 = "O";
                    cells.set(8, "O");
                    SaxionApp.clear();
                }
                playerSymbol = "X";
            }

            ArrayList<Boolean> differentWins = winConditions(cells, playerSymbol);
            int counter = 0;
            while (counter < differentWins.size()) {
                System.out.println("gameOver while works");
                if (differentWins.get(counter)) {
                    System.out.println("gameOver if works");
                    gameOver = true;
                    SaxionApp.clear();
                    SaxionApp.printLine("Player " + playerSymbol + " has won! Congratulations!");
                    break;
                } else {
                    System.out.println("gameOver if DOES NOT WORK");
                    counter++;
                }

            }

//            gameOver = true;

        }

        SaxionApp.printLine("Thank you for playing our game! :D");
        // Saving Image for easy preview
        SaxionApp.saveImage("Exercise4/end_test_output.png");

    }

    public int boardSize() {
        SaxionApp.print("What size do you wish the game window to be (min.50 and max.90)? ");
        int input = SaxionApp.readInt();
        SaxionApp.clear();
        return input;
    }

    private void drawBoard(int celWidth, int celHeight, int fontSize, String cell1, String cell2, String cell3, String cell4, String cell5, String cell6, String cell7, String cell8, String cell9) {
        SaxionApp.turnBorderOn();

        // Draw Board
        SaxionApp.drawLine(celWidth*2, celHeight, celWidth*2, celHeight*4);
        SaxionApp.drawLine(celWidth*3, celHeight, celWidth*3, celHeight*4);
        SaxionApp.drawLine(celWidth*1, celHeight*2, celWidth*4, celHeight*2);
        SaxionApp.drawLine(celWidth*1, celHeight*3, celWidth*4, celHeight*3);

        SaxionApp.turnBorderOff();

        // Draw Cell Values
        SaxionApp.drawBorderedText(" "+cell1,celWidth*1+fontSize, celHeight+fontSize, fontSize);
        SaxionApp.drawBorderedText(" "+cell2,celWidth*2+fontSize, celHeight+fontSize, fontSize);
        SaxionApp.drawBorderedText(" "+cell3,celWidth*3+fontSize, celHeight+fontSize, fontSize);
        SaxionApp.drawBorderedText(" "+cell4,celWidth*1+fontSize, celHeight*2+fontSize, fontSize);
        SaxionApp.drawBorderedText(" "+cell5,celWidth*2+fontSize, celHeight*2+fontSize, fontSize);
        SaxionApp.drawBorderedText(" "+cell6,celWidth*3+fontSize, celHeight*2+fontSize, fontSize);
        SaxionApp.drawBorderedText(" "+cell7,celWidth*1+fontSize, celHeight*3+fontSize, fontSize);
        SaxionApp.drawBorderedText(" "+cell8,celWidth*2+fontSize, celHeight*3+fontSize, fontSize);
        SaxionApp.drawBorderedText(" "+cell9,celWidth*3+fontSize, celHeight*3+fontSize, fontSize);
    }

    public void setFields(ArrayList<String> cells) {
        for (int i = 1; i < 10; i++) {
            String cellNumber = String.valueOf(i);
            cells.add(cellNumber);
        }
        System.out.println(cells);
    }

    public ArrayList<Boolean> winConditions(ArrayList<String> cells, String playerSymbol) {

        boolean winConditionWidth1 = cells.get(0).equals(playerSymbol) && cells.get(1).equals(playerSymbol) && cells.get(2).equals(playerSymbol);
        boolean winConditionWidth2 = cells.get(3).equals(playerSymbol) && cells.get(4).equals(playerSymbol) && cells.get(5).equals(playerSymbol);
        boolean winConditionWidth3 = cells.get(6).equals(playerSymbol) && cells.get(7).equals(playerSymbol) && cells.get(8).equals(playerSymbol);

        boolean winConditionHeight1 = cells.get(0).equals(playerSymbol) && cells.get(3).equals(playerSymbol) && cells.get(6).equals(playerSymbol);
        boolean winConditionHeight2 = cells.get(1).equals(playerSymbol) && cells.get(4).equals(playerSymbol) && cells.get(7).equals(playerSymbol);
        boolean winConditionHeight3 = cells.get(2).equals(playerSymbol) && cells.get(5).equals(playerSymbol) && cells.get(8).equals(playerSymbol);

        boolean winConditionDiagonal1 = cells.get(0).equals(playerSymbol) && cells.get(4).equals(playerSymbol) && cells.get(8).equals(playerSymbol);
        boolean winConditionDiagonal2 = cells.get(2).equals(playerSymbol) && cells.get(4).equals(playerSymbol) && cells.get(6).equals(playerSymbol);

        ArrayList<Boolean>differentWins = new ArrayList<>();
        differentWins.add(winConditionWidth1);
        differentWins.add(winConditionWidth2);
        differentWins.add(winConditionWidth3);

        differentWins.add(winConditionHeight1);
        differentWins.add(winConditionHeight2);
        differentWins.add(winConditionHeight3);

        differentWins.add(winConditionDiagonal1);
        differentWins.add(winConditionDiagonal2);

        return differentWins;
    }

}

Advertisement

Answer

In your method winConditions() you pass playerSymbol, but before you pass it you always assign the other player symbol to it. So if it is player 1 turn (“X”) you assign playerSymbol to be “O”.

Example: (E stands for empty)

Turn 1
E|E|E
E|X|E
E|E|E

Turn 2
E|E|O
E|X|E
E|E|E

Turn 3
X|E|O
E|X|E
E|E|E

Turn 4
X|O|O
E|X|E
E|E|E

Turn 5
X|O|O
E|X|E
E|E|X

“X” won, right? But you’re not checking if “X” won, you’re checking if “O” won, because of the playerSymbol = "O"; statement before calling winConditions(). So that’s why it takes one round longer. Next round you will set playerSymbol to “X” and this time a win will be detected. Change the player symbol after checking for a win.

Advertisement