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;
}
}
CodePudding user response:
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.