From 4b47525e95d7277964c8afed237708f7f99f1fff Mon Sep 17 00:00:00 2001 From: Andres Cruz <1912548@stud.hs-mannheim.de> Date: Sat, 9 Nov 2024 08:07:25 +0100 Subject: [PATCH] Loesung mit char array plus die Loesung von Vlad --- src/main/java/Uebung_02/Main.java | 179 +++++++++++++++++++++ src/main/java/Uebung_02/TicTacToe_AC1.java | 17 +- src/main/java/Uebung_02/TicTacToe_AC2.java | 63 ++++---- src/main/java/Uebung_02/TicTacToe_AC3.java | 123 ++++++++++++++ 4 files changed, 336 insertions(+), 46 deletions(-) create mode 100644 src/main/java/Uebung_02/Main.java create mode 100644 src/main/java/Uebung_02/TicTacToe_AC3.java diff --git a/src/main/java/Uebung_02/Main.java b/src/main/java/Uebung_02/Main.java new file mode 100644 index 0000000..db4023b --- /dev/null +++ b/src/main/java/Uebung_02/Main.java @@ -0,0 +1,179 @@ +package Uebung_02; + +import java.util.Objects; +import java.util.Random; +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + String[] moveArray = {" ", " ", " ", " ", " ", " ", " ", " ", " "}; + boolean gameGoing = true; + String savingMemory; + + // printBoard(moveArray); //Not needed for the first run, actually. + + while(gameGoing){ + + printBoard(playerMove(moveArray)); + + gameGoing = isGameGoing(moveArray, gameGoing); + if(gameGoing == false){ + break; + } + + printBoard(enemyMove(moveArray)); + + gameGoing = isGameGoing(moveArray, gameGoing); + } + + } + + private static boolean isGameGoing(String[] moveArray, boolean gameGoing) { + String savingMemory; + savingMemory = checkWin(moveArray); //Yes, yes, I bowed to the mighty IntelliJ refactoring. + if (savingMemory == "Player win!") { + gameGoing = false; + System.out.println(savingMemory); + + } + + else if (savingMemory == "PC win!") { + gameGoing = false; + System.out.println(savingMemory); + + } + else if (savingMemory == "DRAW!!!!") { + gameGoing = false; + System.out.println(savingMemory); + + } + else System.out.println(savingMemory); + return gameGoing; + } + + + private static void printBoard(String[] moveArray){ + System.out.print("[" + moveArray[0] + "]" + "[" + moveArray[1] + "]" + "[" + moveArray[2] + "]" + "\n" + + "[" + moveArray[3] + "]" + "[" + moveArray[4] + "]" + "[" + moveArray[5] + "]" + "\n" + + "[" + moveArray[6] + "]" + "[" + moveArray[7] + "]" + "[" + moveArray[8] + "]" + "\n" + "\n"); + } + + private static String[] enemyMove( String[] moveArray){ + boolean argh = true; //so I know when to stop generating moves + + while (argh == true) { //Yes. I know. I told IntelliJ to leave me alone as well. You will not make me budge either. + Random random = new Random(); + int randomInt = random.nextInt(9); + if(Objects.equals(moveArray[randomInt], " ")){ + moveArray[randomInt] = "O"; + argh = false; + } + else { + System.out.print("Thinking."); + try { + Thread.sleep(300); + } catch (InterruptedException e) { + System.err.println("Thread was interrupted!"); + } + System.out.print("."); + try { + Thread.sleep(300); + } catch (InterruptedException e) { + System.err.println("Thread was interrupted!"); + } + System.out.print("."+ "\n"); + } + } + return moveArray; + } +private static String[] playerMove ( String[] moveArray){ + boolean validInput = true; + while (validInput) { //Yes, I know its counterintuitive. No, I don't care. + System.out.println("Where do you wanna out in your move?"); + System.out.print("\n"+"[1]" + "[2]" + "[3]" + "\n" + + "[4]" + "[5]" + "[6]" + "\n" + + "[7]" + "[8]" + "[9]" + "\n"); + Scanner scanner = new Scanner(System.in); + int playerMove = scanner.nextInt() - 1; + if(playerMove<=8){ + System.out.println("This is a correct move!"); + moveArray[playerMove] = "X"; + validInput = false; + } + else { + System.out.println("No, this is not a valid input, ya git!"); //useful comments are for the weak. + } + + } + + return moveArray; +} + +private static String checkWin(String[] moveArray){ + String playerChar = "X"; //Yes, I know it can be made simpler. But I was too lazy to type the logic myself, so I let ChatGpt write it and then had to bastardise it to fit into my code. Sue me. + String pcChar = "O"; + + + // Check for player win + //rows + if ((moveArray[0] == playerChar && moveArray[1] == playerChar && moveArray[2] == playerChar) || // Row 1 + (moveArray[3] == playerChar && moveArray[4] == playerChar && moveArray[5] == playerChar) || // Row 2 + (moveArray[6] == playerChar && moveArray[7] == playerChar && moveArray[8] == playerChar)) { // Row 3 + return "Player win!"; + } + + // Check columns + if ((moveArray[0] == playerChar && moveArray[3] == playerChar && moveArray[6] == playerChar) || // Column 1 + (moveArray[1] == playerChar && moveArray[4] == playerChar && moveArray[7] == playerChar) || // Column 2 + (moveArray[2] == playerChar && moveArray[5] == playerChar && moveArray[8] == playerChar)) { // Column 3 + return "Player win!"; + } + + // Check diagonals + if ((moveArray[0] == playerChar && moveArray[4] == playerChar && moveArray[8] == playerChar) || // Diagonal top-left to bottom-right + (moveArray[2] == playerChar && moveArray[4] == playerChar && moveArray[6] == playerChar)) { // Diagonal top-right to bottom-left + return "Player win!"; + } + + //Check for PC win + //rows + if ((moveArray[0] == pcChar && moveArray[1] == pcChar && moveArray[2] == pcChar) || // Row 1 + (moveArray[3] == pcChar && moveArray[4] == pcChar && moveArray[5] == pcChar) || // Row 2 + (moveArray[6] == pcChar && moveArray[7] == pcChar && moveArray[8] == pcChar)) { // Row 3 + return "PC win!"; + } + + +// Check columns + if ((moveArray[0] == pcChar && moveArray[3] == pcChar && moveArray[6] == pcChar) || // Column 1 + (moveArray[1] == pcChar && moveArray[4] == pcChar && moveArray[7] == pcChar) || // Column 2 + (moveArray[2] == pcChar && moveArray[5] == pcChar && moveArray[8] == pcChar)) { // Column 3 + return "PC win!"; + } + + +// Check diagonals + if ((moveArray[0] == pcChar && moveArray[4] == pcChar && moveArray[8] == pcChar) || // Diagonal top-left to bottom-right + (moveArray[2] == pcChar && moveArray[4] == pcChar && moveArray[6] == pcChar)) { // Diagonal top-right to bottom-left + return "PC win!"; + } + +//And of course check for draw + if ( moveArray[0] != " " && moveArray[1] != " "&& moveArray[2] != " "&& moveArray[3] != " "&& moveArray[4] != " "&& moveArray[5] != " "&& moveArray[6] != " "&& moveArray[7] != " "&& moveArray[8] != " "){ + return "DRAW!!!!"; + } + +//else return "Something went wrong. Please consult your local Witch Doctor."; + else return "You are not done yet! The enemy is still standing!"; + +} + + + + + + } + + + + diff --git a/src/main/java/Uebung_02/TicTacToe_AC1.java b/src/main/java/Uebung_02/TicTacToe_AC1.java index 0256ba1..e76684f 100644 --- a/src/main/java/Uebung_02/TicTacToe_AC1.java +++ b/src/main/java/Uebung_02/TicTacToe_AC1.java @@ -21,22 +21,21 @@ public class TicTacToe_AC1 { Scanner scanner = new Scanner(System.in); - while(true) { + while(canMakeMove()) { humanMove(scanner); printGrid(); - if(gameHasEnded()) { + if(gameWasWon()) { System.out.println("\nDu hast gewonnen!"); break; } computerMove(); printGrid(); - if(gameHasEnded()) { + if(gameWasWon()) { System.out.println("\nDer Roboter hat gewonnen!"); break; } } - scanner.close(); } @@ -82,17 +81,13 @@ public class TicTacToe_AC1 { gameFields[index] = X; } } - - public static boolean gameHasEnded() { - return gameWasWon() || noMovesLeft(); - } - public static boolean noMovesLeft() { + public static boolean canMakeMove() { for (String s: gameFields) { - if(s.equals(EMPTYFIELD)) return false; + if(s.equals(EMPTYFIELD)) return true; } System.out.println("\nUnentschieden!"); - return true; + return false; } public static boolean gameWasWon() { diff --git a/src/main/java/Uebung_02/TicTacToe_AC2.java b/src/main/java/Uebung_02/TicTacToe_AC2.java index 815cb03..c46ae2e 100644 --- a/src/main/java/Uebung_02/TicTacToe_AC2.java +++ b/src/main/java/Uebung_02/TicTacToe_AC2.java @@ -9,25 +9,25 @@ public class TicTacToe_AC2 { public static final String EMPTYFIELD = " "; public static final String X = "X"; public static final String O = "O"; - public static String[] gameFields = new String[9]; + public static String[] boardFields = new String[9]; public static void main(String[] args) { - initializeGameStatus(); + initializeGameBoard(); computerMove(); - printGrid(); + printBoard(); Scanner scanner = new Scanner(System.in); - while(true) { + while(canMakeMove()) { humanMove(scanner); - printGrid(); - if(gameHasEnded()) { + printBoard(); + if(gameWasWon()) { System.out.println("\nDu hast gewonnen!"); break; } computerMove(); - printGrid(); - if(gameHasEnded()) { + printBoard(); + if(gameWasWon()) { System.out.println("\nDer Roboter hat gewonnen!"); break; } @@ -36,8 +36,8 @@ public class TicTacToe_AC2 { } - public static void initializeGameStatus() { - Arrays.fill(gameFields, EMPTYFIELD); + public static void initializeGameBoard() { + Arrays.fill(boardFields, EMPTYFIELD); } public static void computerMove() { @@ -47,7 +47,7 @@ public class TicTacToe_AC2 { randomNumber = generateNumber(); } while (!isFieldChoosable(randomNumber)); - gameFields[randomNumber] = X; + boardFields[randomNumber] = X; } public static void humanMove(Scanner scanner) { @@ -58,7 +58,7 @@ public class TicTacToe_AC2 { choice = scanner.nextInt(); } while (!isFieldChoosable(choice-1)); - gameFields[choice-1] = O; + boardFields[choice-1] = O; } public static int generateNumber() { @@ -67,53 +67,46 @@ public class TicTacToe_AC2 { } public static boolean isFieldChoosable(int index) { - return gameFields[index].equals(EMPTYFIELD); - } - - public static boolean gameHasEnded() { - return gameWasWon() || noMovesLeft(); + return boardFields[index].equals(EMPTYFIELD); } - public static boolean noMovesLeft() { - for (String s: gameFields) { - if (s.equals(EMPTYFIELD)) return false; + public static boolean canMakeMove() { + for (String s: boardFields) { + if (s.equals(EMPTYFIELD)) return true; } System.out.println("\nUnentschieden!"); - return true; + return false; } public static boolean gameWasWon() { return isDiagonalWin() || isHorizontalWin() || isVerticalWin(); } - public static boolean isDiagonalWin() { - if (isLineComplete(0,4,8) || isLineComplete(2,4,6)) return true; - return false; + public static boolean isDiagonalWin() { + return isLineComplete(0,4,8) || isLineComplete(2,4,6); } - public static boolean isHorizontalWin() { - if (isLineComplete(0,1,2) || isLineComplete(3,4,5) || isLineComplete(6,7,8)) return true; - return false; + public static boolean isHorizontalWin() { + return isLineComplete(0,1,2) || isLineComplete(3,4,5) || isLineComplete(6,7,8); } - public static boolean isVerticalWin() { - if (isLineComplete(0,3,6) || isLineComplete(1,4,7) || isLineComplete(2,5,8)) return true; - return false; + public static boolean isVerticalWin() { + return isLineComplete(0,3,6) || isLineComplete(1,4,7) || isLineComplete(2,5,8); } public static boolean isLineComplete(int first, int second, int third) { - return !gameFields[first].equals(EMPTYFIELD) && - gameFields[first].equals(gameFields[second]) && - gameFields[first].equals(gameFields[third]); + return !boardFields[first].equals(EMPTYFIELD) && + boardFields[first].equals(boardFields[second]) && + boardFields[first].equals(boardFields[third]); } //Below is section for helper methods - Strings and outputs// - public static void printGrid() { + public static void printBoard() { System.out.println("______________________________________________________________________"); String grid = ""; for (int i = 0; i < 9; i++) { if (i % 3 == 0) grid += "\n"; - grid += "[" + gameFields[i] + "]"; + grid += "[" + boardFields[i] + "]"; } System.out.println(grid); } diff --git a/src/main/java/Uebung_02/TicTacToe_AC3.java b/src/main/java/Uebung_02/TicTacToe_AC3.java new file mode 100644 index 0000000..00e07de --- /dev/null +++ b/src/main/java/Uebung_02/TicTacToe_AC3.java @@ -0,0 +1,123 @@ +package Uebung_02; + +import java.util.Arrays; +import java.util.Random; +import java.util.Scanner; + +public class TicTacToe_AC3 { + + public static final char EMPTYFIELD = ' '; + public static final char X = 'X'; + public static final char O = 'O'; + public static char[] boardFields = new char[9]; + + public static void main(String[] args) { + initializeGameBoard(); + computerMove(); + printBoard(); + + Scanner scanner = new Scanner(System.in); + while(canMakeMove()) { + humanMove(scanner); + printBoard(); + if(gameWasWon()) { + System.out.println("\nDu hast gewonnen!"); + break; + } + + computerMove(); + printBoard(); + if(gameWasWon()) { + System.out.println("\nDer Roboter hat gewonnen!"); + break; + } + } + scanner.close(); + } + + + public static void initializeGameBoard() { + Arrays.fill(boardFields, EMPTYFIELD); + } + + public static void computerMove() { + int randomNumber = -1; + + do { + randomNumber = generateNumber(); + } while (!isFieldChoosable(randomNumber)); + + boardFields[randomNumber] = X; + } + + public static void humanMove(Scanner scanner) { + printOptionsMenu(); + int choice = -1; + + do { + choice = scanner.nextInt(); + } while (!isFieldChoosable(choice-1)); + + boardFields[choice-1] = O; + } + + public static int generateNumber() { + Random random = new Random(); + return random.nextInt(9); + } + + public static boolean isFieldChoosable(int index) { + return boardFields[index] == (EMPTYFIELD); + } + + public static boolean canMakeMove() { + for (char f: boardFields) { + if (f == EMPTYFIELD) return true; + } + System.out.println("\nUnentschieden!"); + return false; + } + + public static boolean gameWasWon() { + return isDiagonalWin() || isHorizontalWin() || isVerticalWin(); + } + + public static boolean isDiagonalWin() { + return isLineComplete(0,4,8) || isLineComplete(2,4,6); + } + + public static boolean isHorizontalWin() { + return isLineComplete(0,1,2) || isLineComplete(3,4,5) || isLineComplete(6,7,8); + } + + public static boolean isVerticalWin() { + return isLineComplete(0,3,6) || isLineComplete(1,4,7) || isLineComplete(2,5,8); + } + + public static boolean isLineComplete(int first, int second, int third) { + return !(boardFields[first] == EMPTYFIELD) && + boardFields[first] == boardFields[second] && + boardFields[first] == boardFields[third]; + } + + //Below is section for helper methods - Strings and outputs// + public static void printBoard() { + System.out.println("______________________________________________________________________"); + String grid = ""; + for (int i = 0; i < 9; i++) { + if (i % 3 == 0) grid += "\n"; + grid += "[" + boardFields[i] + "]"; + } + System.out.println(grid); + } + + public static void printOptionsMenu() { + System.out.println("\n\nDu hast die folgende leeren Felder: "); + String grid = ""; + for (int i = 0; i < 9; i++) { + if (i % 3 == 0) grid += "\n"; + grid += isFieldChoosable(i) ? (i + 1)+" " : " "; + } + System.out.println(grid+"\nGib die Zahl ein, wo du deinen Kreis setzen willst: "); + } +}