added AI for AI mode
This commit is contained in:
parent
d9466c3ea5
commit
d6cf2c4e5a
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,6 +3,7 @@ package main;
|
|||
public class Launcher {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Cmd.cls();
|
||||
new MainMenu();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,8 +28,10 @@ public abstract class MenuScreen {
|
|||
cursorPos++;
|
||||
}
|
||||
} else {
|
||||
Cmd.cls();
|
||||
select(cursorPos);
|
||||
}
|
||||
Cmd.cls();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue