added AI for AI mode

This commit is contained in:
Asecave
2020-09-06 13:57:14 +02:00
parent d9466c3ea5
commit d6cf2c4e5a
7 changed files with 345 additions and 26 deletions

View File

@@ -3,10 +3,11 @@ package main;
public class Board { public class Board {
private char[][] board; private char[][] board;
private final int BOARD_SIZE = 4; private final int BOARD_SIZE;
private char[][] symbols; private char[][] symbols;
public Board() { public Board() {
BOARD_SIZE = Options.boardSize;
board = new char[BOARD_SIZE * 3 + 1][BOARD_SIZE * 3 + 1]; board = new char[BOARD_SIZE * 3 + 1][BOARD_SIZE * 3 + 1];
for (int x = 0; x < board.length; x++) { for (int x = 0; x < board.length; x++) {
for (int y = 0; y < board[0].length; y++) { for (int y = 0; y < board[0].length; y++) {
@@ -52,12 +53,12 @@ public class Board {
} }
public char testWinner() { 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) { if (symbols[x][0] == symbols[x][1] && symbols[x][0] == symbols[x][2] && symbols[x][0] != 0) {
return symbols[x][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) { if (symbols[0][y] == symbols[1][y] && symbols[0][y] == symbols[2][y] && symbols[0][y] != 0) {
return symbols[0][y]; return symbols[0][y];
} }

View File

@@ -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();
}
}
}

View File

@@ -3,6 +3,7 @@ package main;
public class Launcher { public class Launcher {
public static void main(String[] args) { public static void main(String[] args) {
Cmd.cls();
new MainMenu(); new MainMenu();
} }
} }

View File

@@ -28,8 +28,10 @@ public abstract class MenuScreen {
cursorPos++; cursorPos++;
} }
} else { } else {
Cmd.cls();
select(cursorPos); select(cursorPos);
} }
Cmd.cls();
} }
} }

View File

@@ -2,9 +2,9 @@ package main;
public class Options extends MenuScreen { public class Options extends MenuScreen {
public static char player1Symbol; public static char player1Symbol = 'X';
public static char player2Symbol; public static char player2Symbol = 'O';
public static int boardSize; public static int boardSize = 4;
public Options() { public Options() {
cursorPos = 0; cursorPos = 0;
@@ -13,11 +13,6 @@ public class Options extends MenuScreen {
tabs[1] = "Player 2 symbol"; tabs[1] = "Player 2 symbol";
tabs[2] = "Spielfeldgröße"; tabs[2] = "Spielfeldgröße";
tabs[3] = "Zurück"; tabs[3] = "Zurück";
player1Symbol = 'X';
player2Symbol = 'O';
boardSize = 4;
init(); init();
} }
@@ -31,15 +26,38 @@ public class Options extends MenuScreen {
player2Symbol = requestSymbol(); player2Symbol = requestSymbol();
break; break;
case 2: case 2:
boardSize = requestNumber();
if (boardSize < 2) {
boardSize = 2;
}
if (boardSize % 2 == 1) {
boardSize++;
}
break; break;
case 3: case 3:
stopLoop();
break; 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() { private char requestSymbol() {
System.out.println("Bitte neues Symbol eingeben:"); 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 { } else {
System.out.print(" "); 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;
}
} }
} }

View File

@@ -8,8 +8,276 @@ public class PlayerAI extends Player {
super(symbol); super(symbol);
} }
public void calculateNextMove(char[][] board) { public boolean calculateNextMove(char[][] board) {
nextMove = 5; 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 @Override

View File

@@ -15,14 +15,14 @@ public class TicTacToe {
board = new Board(); board = new Board();
switch(mode) { switch (mode) {
case MODE_NORMAL: case MODE_NORMAL:
player1 = new Player('X'); player1 = new Player(Options.player1Symbol);
player2 = new Player('O'); player2 = new Player(Options.player2Symbol);
break; break;
case MODE_AI: case MODE_AI:
player1 = new Player('X'); player1 = new Player(Options.player1Symbol);
player2 = new PlayerAI('O'); player2 = new PlayerAI(Options.player2Symbol);
break; break;
} }
turn = player1; turn = player1;
@@ -37,7 +37,9 @@ public class TicTacToe {
board.draw(); board.draw();
turn.printTurnMessage(); turn.printTurnMessage();
if (turn instanceof PlayerAI) { if (turn instanceof PlayerAI) {
((PlayerAI)turn).calculateNextMove(board.getBoard()); if (!((PlayerAI) turn).calculateNextMove(board.getBoard())) {
System.exit(0);
}
} }
int field = turn.makeTurn(); int field = turn.makeTurn();
while (!board.isFieldFree(field)) { while (!board.isFieldFree(field)) {
@@ -48,9 +50,11 @@ public class TicTacToe {
board.place(field, turn.getSymbol()); board.place(field, turn.getSymbol());
char winner = board.testWinner(); char winner = board.testWinner();
if (winner > 1) { if (winner > 1) {
Cmd.cls();
board.draw(); board.draw();
System.out.println(winner + " hat gewonnen!"); System.out.println(winner + " hat gewonnen!");
} else if (winner == 1) { } else if (winner == 1) {
Cmd.cls();
board.draw(); board.draw();
System.out.println("Unetschieden!"); System.out.println("Unetschieden!");
} }
@@ -58,7 +62,7 @@ public class TicTacToe {
System.out.println("Noch eine Runde? [y/n]"); System.out.println("Noch eine Runde? [y/n]");
if (Input.yesNoDialog()) { if (Input.yesNoDialog()) {
board.clear(); board.clear();
}else { } else {
running = false; running = false;
} }
} }
@@ -67,6 +71,6 @@ public class TicTacToe {
} else { } else {
turn = player1; turn = player1;
} }
Cmd.cls();
} }
} }