diff --git a/Tic-Tac-Toe/src/main/Board.java b/Tic-Tac-Toe/src/main/Board.java index 203a3d6..bc78f9b 100644 --- a/Tic-Tac-Toe/src/main/Board.java +++ b/Tic-Tac-Toe/src/main/Board.java @@ -3,10 +3,11 @@ package main; public class Board { private char[][] board; - private final int BOARD_SIZE = 4; + private final int BOARD_SIZE; private char[][] symbols; public Board() { + BOARD_SIZE = Options.boardSize; board = new char[BOARD_SIZE * 3 + 1][BOARD_SIZE * 3 + 1]; for (int x = 0; x < board.length; x++) { for (int y = 0; y < board[0].length; y++) { @@ -52,12 +53,12 @@ public class Board { } public char testWinner() { - for (int x = 0; x < symbols.length - 1; x++) { + for (int x = 0; x < symbols.length; x++) { if (symbols[x][0] == symbols[x][1] && symbols[x][0] == symbols[x][2] && symbols[x][0] != 0) { return symbols[x][0]; } } - for (int y = 0; y < symbols[0].length - 1; y++) { + for (int y = 0; y < symbols[0].length; y++) { if (symbols[0][y] == symbols[1][y] && symbols[0][y] == symbols[2][y] && symbols[0][y] != 0) { return symbols[0][y]; } diff --git a/Tic-Tac-Toe/src/main/Cmd.java b/Tic-Tac-Toe/src/main/Cmd.java new file mode 100644 index 0000000..c6e0a99 --- /dev/null +++ b/Tic-Tac-Toe/src/main/Cmd.java @@ -0,0 +1,14 @@ +package main; + +import java.io.IOException; + +public class Cmd { + + public static void cls() { + try { + new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor(); + } catch (InterruptedException | IOException e) { + e.printStackTrace(); + } + } +} diff --git a/Tic-Tac-Toe/src/main/Launcher.java b/Tic-Tac-Toe/src/main/Launcher.java index 0937e33..4eece43 100644 --- a/Tic-Tac-Toe/src/main/Launcher.java +++ b/Tic-Tac-Toe/src/main/Launcher.java @@ -3,6 +3,7 @@ package main; public class Launcher { public static void main(String[] args) { + Cmd.cls(); new MainMenu(); } } diff --git a/Tic-Tac-Toe/src/main/MenuScreen.java b/Tic-Tac-Toe/src/main/MenuScreen.java index 80a4dcf..cbcfbd9 100644 --- a/Tic-Tac-Toe/src/main/MenuScreen.java +++ b/Tic-Tac-Toe/src/main/MenuScreen.java @@ -28,8 +28,10 @@ public abstract class MenuScreen { cursorPos++; } } else { + Cmd.cls(); select(cursorPos); } + Cmd.cls(); } } diff --git a/Tic-Tac-Toe/src/main/Options.java b/Tic-Tac-Toe/src/main/Options.java index d5c0865..bbbfa42 100644 --- a/Tic-Tac-Toe/src/main/Options.java +++ b/Tic-Tac-Toe/src/main/Options.java @@ -2,9 +2,9 @@ package main; public class Options extends MenuScreen { - public static char player1Symbol; - public static char player2Symbol; - public static int boardSize; + public static char player1Symbol = 'X'; + public static char player2Symbol = 'O'; + public static int boardSize = 4; public Options() { cursorPos = 0; @@ -13,11 +13,6 @@ public class Options extends MenuScreen { tabs[1] = "Player 2 symbol"; tabs[2] = "Spielfeldgröße"; tabs[3] = "Zurück"; - - player1Symbol = 'X'; - player2Symbol = 'O'; - boardSize = 4; - init(); } @@ -31,15 +26,38 @@ public class Options extends MenuScreen { player2Symbol = requestSymbol(); break; case 2: + boardSize = requestNumber(); + if (boardSize < 2) { + boardSize = 2; + } + if (boardSize % 2 == 1) { + boardSize++; + } break; case 3: + stopLoop(); break; } } + private int requestNumber() { + System.out.println("Bitte gebe eine Zahl ein:"); + String in = scanner.next(); + while (!in.matches("[0-9]+")) { + System.out.println("Bitte eine Zahl eingeben!"); + in = scanner.next(); + } + return Integer.parseInt(in); + } + private char requestSymbol() { System.out.println("Bitte neues Symbol eingeben:"); - return 0; + String in = scanner.next(); + while (in.length() > 1) { + System.out.println("Bitte nur ein Symbol!"); + in = scanner.next(); + } + return in.charAt(0); } @@ -54,7 +72,18 @@ public class Options extends MenuScreen { } else { System.out.print(" "); } - System.out.println(tabs[i]); + System.out.print(tabs[i]); + switch (i) { + case 0: + System.out.println(": " + player1Symbol); + break; + case 1: + System.out.println(": " + player2Symbol); + break; + case 2: + System.out.println(": " + boardSize); + break; + } } } diff --git a/Tic-Tac-Toe/src/main/PlayerAI.java b/Tic-Tac-Toe/src/main/PlayerAI.java index 5530c00..4ec9c77 100644 --- a/Tic-Tac-Toe/src/main/PlayerAI.java +++ b/Tic-Tac-Toe/src/main/PlayerAI.java @@ -1,17 +1,285 @@ package main; public class PlayerAI extends Player { - + private int nextMove; public PlayerAI(char symbol) { super(symbol); } - - public void calculateNextMove(char[][] board) { - nextMove = 5; + + public boolean calculateNextMove(char[][] board) { + int round = 0; + for (int x = 0; x < board.length; x++) { + for (int y = 0; y < board[0].length; y++) { + if (board[x][y] != 0) { + round++; + } + } + } + switch (round) { + case 0: + nextMove = 5; + return true; + case 1: + if (board[1][1] == 0) { + nextMove = 5; + } else { + int rand = (int) (Math.random() * 9) + 1; + if (rand % 2 == 0) { + rand++; + } + if (rand == 5) { + rand = 7; + } + nextMove = rand; + } + return true; + case 2: + if (board[1][0] != 0) { + nextMove = 3; + return true; + } + if (board[0][1] != 0) { + nextMove = 1; + return true; + } + if (board[2][1] != 0) { + nextMove = 9; + return true; + } + if (board[1][2] != 0) { + nextMove = 7; + return true; + } + break; + case 4: + if (board[0][0] == getSymbol()) { + nextMove = 3; + return true; + } + if (board[2][0] == getSymbol()) { + nextMove = 9; + return true; + } + if (board[0][2] == getSymbol()) { + nextMove = 1; + return true; + } + if (board[2][2] == getSymbol()) { + nextMove = 7; + return true; + } + break; + default: + if (!attack(board)) { + if (!block(board)) { + for (int i = 0; i < 8; i++) { + if (board[i % 3][i / 3] == 0) { + nextMove = i + 1; + return true; + } + } + }else { + return true; + } + }else { + return true; + } + } + return false; } + public boolean attack(char[][] board) { + if (board[0][0] == board[1][0] && board[0][0] == getSymbol() && board[0][0] != 0 && board[2][0] == 0) { + nextMove = 3; + return true; + } else if (board[0][1] == board[1][1] && board[0][1] == getSymbol() && board[0][1] != 0 + && board[2][1] == 0) { + nextMove = 6; + return true; + } else if (board[0][2] == board[1][2] && board[0][2] == getSymbol() && board[0][2] != 0 + && board[2][2] == 0) { + nextMove = 9; + return true; + } else if (board[1][0] == board[2][0] && board[1][0] == getSymbol() && board[1][0] != 0 + && board[0][0] == 0) { + nextMove = 1; + return true; + } else if (board[1][1] == board[2][1] && board[1][1] == getSymbol() && board[1][1] != 0 + && board[0][1] == 0) { + nextMove = 4; + return true; + } else if (board[1][2] == board[2][2] && board[1][2] == getSymbol() && board[1][2] != 0 + && board[0][2] == 0) { + nextMove = 7; + return true; + + } else if (board[0][0] == board[0][1] && board[0][0] == getSymbol() && board[0][0] != 0 + && board[0][2] == 0) { + nextMove = 7; + return true; + } else if (board[1][0] == board[1][1] && board[1][0] == getSymbol() && board[1][0] != 0 + && board[1][2] == 0) { + nextMove = 8; + return true; + } else if (board[2][0] == board[2][1] && board[2][0] == getSymbol() && board[2][0] != 0 + && board[2][2] == 0) { + nextMove = 9; + return true; + } else if (board[0][1] == board[0][2] && board[0][1] == getSymbol() && board[0][1] != 0 + && board[0][0] == 0) { + nextMove = 1; + return true; + } else if (board[1][1] == board[1][2] && board[1][1] == getSymbol() && board[1][1] != 0 + && board[1][0] == 0) { + nextMove = 2; + return true; + } else if (board[2][1] == board[2][2] && board[2][1] == getSymbol() && board[2][1] != 0 + && board[2][0] == 0) { + nextMove = 3; + return true; + + } else if (board[0][0] == board[1][1] && board[1][1] == getSymbol() && board[1][1] != 0 + && board[2][2] == 0) { + nextMove = 9; + return true; + } else if (board[0][2] == board[1][1] && board[1][1] == getSymbol() && board[1][1] != 0 + && board[2][0] == 0) { + nextMove = 3; + return true; + } else if (board[2][0] == board[1][1] && board[1][1] == getSymbol() && board[1][1] != 0 + && board[0][2] == 0) { + nextMove = 7; + return true; + } else if (board[2][2] == board[1][1] && board[1][1] == getSymbol() && board[1][1] != 0 + && board[0][0] == 0) { + nextMove = 1; + return true; + + } else if (board[0][0] == board[2][0] && board[0][0] == getSymbol() && board[0][0] != 0 + && board[1][0] == 0) { + nextMove = 2; + return true; + } else if (board[0][1] == board[2][1] && board[0][1] == getSymbol() && board[0][1] != 0 + && board[1][1] == 0) { + nextMove = 5; + return true; + } else if (board[0][2] == board[2][2] && board[0][2] == getSymbol() && board[0][2] != 0 + && board[1][2] == 0) { + nextMove = 8; + return true; + } else if (board[0][0] == board[0][2] && board[0][0] == getSymbol() && board[0][0] != 0 + && board[0][1] == 0) { + nextMove = 4; + return true; + } else if (board[1][0] == board[1][2] && board[1][0] == getSymbol() && board[1][0] != 0 + && board[1][1] == 0) { + nextMove = 5; + return true; + } else if (board[2][0] == board[2][2] && board[2][0] == getSymbol() && board[2][0] != 0 + && board[2][1] == 0) { + nextMove = 6; + return true; + } + return false; + } + + private boolean block(char[][] board) { + if (board[0][0] == board[1][0] && board[0][0] != getSymbol() && board[0][0] != 0 && board[2][0] == 0) { + nextMove = 3; + return true; + } else if (board[0][1] == board[1][1] && board[0][1] != getSymbol() && board[0][1] != 0 + && board[2][1] == 0) { + nextMove = 6; + return true; + } else if (board[0][2] == board[1][2] && board[0][2] != getSymbol() && board[0][2] != 0 + && board[2][2] == 0) { + nextMove = 9; + return true; + } else if (board[1][0] == board[2][0] && board[1][0] != getSymbol() && board[1][0] != 0 + && board[0][0] == 0) { + nextMove = 1; + return true; + } else if (board[1][1] == board[2][1] && board[1][1] != getSymbol() && board[1][1] != 0 + && board[0][1] == 0) { + nextMove = 4; + return true; + } else if (board[1][2] == board[2][2] && board[1][2] != getSymbol() && board[1][2] != 0 + && board[0][2] == 0) { + nextMove = 7; + return true; + + } else if (board[0][0] == board[0][1] && board[0][0] != getSymbol() && board[0][0] != 0 + && board[0][2] == 0) { + nextMove = 7; + return true; + } else if (board[1][0] == board[1][1] && board[1][0] != getSymbol() && board[1][0] != 0 + && board[1][2] == 0) { + nextMove = 8; + return true; + } else if (board[2][0] == board[2][1] && board[2][0] != getSymbol() && board[2][0] != 0 + && board[2][2] == 0) { + nextMove = 9; + return true; + } else if (board[0][1] == board[0][2] && board[0][1] != getSymbol() && board[0][1] != 0 + && board[0][0] == 0) { + nextMove = 1; + return true; + } else if (board[1][1] == board[1][2] && board[1][1] != getSymbol() && board[1][1] != 0 + && board[1][0] == 0) { + nextMove = 2; + return true; + } else if (board[2][1] == board[2][2] && board[2][1] != getSymbol() && board[2][1] != 0 + && board[2][0] == 0) { + nextMove = 3; + return true; + + } else if (board[0][0] == board[1][1] && board[1][1] != getSymbol() && board[1][1] != 0 + && board[2][2] == 0) { + nextMove = 9; + return true; + } else if (board[0][2] == board[1][1] && board[1][1] != getSymbol() && board[1][1] != 0 + && board[2][0] == 0) { + nextMove = 3; + return true; + } else if (board[2][0] == board[1][1] && board[1][1] != getSymbol() && board[1][1] != 0 + && board[0][2] == 0) { + nextMove = 7; + return true; + } else if (board[2][2] == board[1][1] && board[1][1] != getSymbol() && board[1][1] != 0 + && board[0][0] == 0) { + nextMove = 1; + return true; + + } else if (board[0][0] == board[2][0] && board[0][0] != getSymbol() && board[0][0] != 0 + && board[1][0] == 0) { + nextMove = 2; + return true; + } else if (board[0][1] == board[2][1] && board[0][1] != getSymbol() && board[0][1] != 0 + && board[1][1] == 0) { + nextMove = 5; + return true; + } else if (board[0][2] == board[2][2] && board[0][2] != getSymbol() && board[0][2] != 0 + && board[1][2] == 0) { + nextMove = 8; + return true; + } else if (board[0][0] == board[0][2] && board[0][0] != getSymbol() && board[0][0] != 0 + && board[0][1] == 0) { + nextMove = 4; + return true; + } else if (board[1][0] == board[1][2] && board[1][0] != getSymbol() && board[1][0] != 0 + && board[1][1] == 0) { + nextMove = 5; + return true; + } else if (board[2][0] == board[2][2] && board[2][0] != getSymbol() && board[2][0] != 0 + && board[2][1] == 0) { + nextMove = 6; + return true; + } + return false; + } + @Override public int makeTurn() { return nextMove; diff --git a/Tic-Tac-Toe/src/main/TicTacToe.java b/Tic-Tac-Toe/src/main/TicTacToe.java index a8fef69..e3ff091 100644 --- a/Tic-Tac-Toe/src/main/TicTacToe.java +++ b/Tic-Tac-Toe/src/main/TicTacToe.java @@ -7,7 +7,7 @@ public class TicTacToe { Player turn; private boolean running; - + public static final int MODE_NORMAL = 0; public static final int MODE_AI = 1; @@ -15,14 +15,14 @@ public class TicTacToe { board = new Board(); - switch(mode) { + switch (mode) { case MODE_NORMAL: - player1 = new Player('X'); - player2 = new Player('O'); + player1 = new Player(Options.player1Symbol); + player2 = new Player(Options.player2Symbol); break; case MODE_AI: - player1 = new Player('X'); - player2 = new PlayerAI('O'); + player1 = new Player(Options.player1Symbol); + player2 = new PlayerAI(Options.player2Symbol); break; } turn = player1; @@ -37,7 +37,9 @@ public class TicTacToe { board.draw(); turn.printTurnMessage(); if (turn instanceof PlayerAI) { - ((PlayerAI)turn).calculateNextMove(board.getBoard()); + if (!((PlayerAI) turn).calculateNextMove(board.getBoard())) { + System.exit(0); + } } int field = turn.makeTurn(); while (!board.isFieldFree(field)) { @@ -48,9 +50,11 @@ public class TicTacToe { board.place(field, turn.getSymbol()); char winner = board.testWinner(); if (winner > 1) { + Cmd.cls(); board.draw(); System.out.println(winner + " hat gewonnen!"); } else if (winner == 1) { + Cmd.cls(); board.draw(); System.out.println("Unetschieden!"); } @@ -58,7 +62,7 @@ public class TicTacToe { System.out.println("Noch eine Runde? [y/n]"); if (Input.yesNoDialog()) { board.clear(); - }else { + } else { running = false; } } @@ -67,6 +71,6 @@ public class TicTacToe { } else { turn = player1; } - + Cmd.cls(); } }