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 {
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];
}

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 static void main(String[] args) {
Cmd.cls();
new MainMenu();
}
}

View File

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

View File

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

View File

@ -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;

View File

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