mirror of
https://github.com/2OOP/pism.git
synced 2026-02-04 10:54:51 +00:00
Added AI and made the options of adding those AI's actually work.
This commit is contained in:
@@ -66,7 +66,20 @@ public class LocalGameSelector extends JFrame {
|
|||||||
String playerTypes = (String) playerTypeSelectionBox.getSelectedItem();
|
String playerTypes = (String) playerTypeSelectionBox.getSelectedItem();
|
||||||
String selectedGame = (String) gameSelectionComboBox.getSelectedItem();
|
String selectedGame = (String) gameSelectionComboBox.getSelectedItem();
|
||||||
|
|
||||||
LocalTicTacToe lttt = new LocalTicTacToe(true, "127.0.0.1", "5001");
|
LocalTicTacToe lttt = null;
|
||||||
|
|
||||||
|
if (playerTypes.equals("Player vs Player")) {
|
||||||
|
logger.info("Player vs Player");
|
||||||
|
lttt = new LocalTicTacToe(true, "127.0.0.1", "5001");
|
||||||
|
} else {
|
||||||
|
if (playerTypes.equals("Player vs AI")) {
|
||||||
|
logger.info("Player vs AI");
|
||||||
|
lttt = new LocalTicTacToe(true, "127.0.0.1", "5001", new boolean[] { false, true });
|
||||||
|
} else {
|
||||||
|
logger.info("AI vs Player");
|
||||||
|
lttt = new LocalTicTacToe(true, "127.0.0.1", "5001", new boolean[] { true, false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ("Tic Tac Toe".equalsIgnoreCase(selectedGame)) {
|
if ("Tic Tac Toe".equalsIgnoreCase(selectedGame)) {
|
||||||
if (tttBoard == null) {
|
if (tttBoard == null) {
|
||||||
|
|||||||
@@ -4,12 +4,15 @@ import org.apache.logging.log4j.LogManager;
|
|||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.toop.eventbus.Events;
|
import org.toop.eventbus.Events;
|
||||||
import org.toop.eventbus.GlobalEventBus;
|
import org.toop.eventbus.GlobalEventBus;
|
||||||
|
import org.toop.game.tictactoe.MinMaxTicTacToe;
|
||||||
|
import org.toop.game.tictactoe.TicTacToe;
|
||||||
|
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A representation of a local tic-tac-toe game.
|
* A representation of a local tic-tac-toe game.
|
||||||
* Calls are made to a server for information about current game state.
|
* Calls are made to a server for information about current game state.
|
||||||
|
* MOST OF THIS CODE IS TRASH, THROW IT OUT OF THE WINDOW AFTER DEMO.
|
||||||
*/
|
*/
|
||||||
public class LocalTicTacToe { // TODO: Implement runnable
|
public class LocalTicTacToe { // TODO: Implement runnable
|
||||||
private static final Logger logger = LogManager.getLogger(LocalTicTacToe.class);
|
private static final Logger logger = LogManager.getLogger(LocalTicTacToe.class);
|
||||||
@@ -17,11 +20,26 @@ public class LocalTicTacToe { // TODO: Implement runnable
|
|||||||
private final ExecutorService executor = Executors.newSingleThreadExecutor();
|
private final ExecutorService executor = Executors.newSingleThreadExecutor();
|
||||||
private final BlockingQueue<String> receivedQueue = new LinkedBlockingQueue<>();
|
private final BlockingQueue<String> receivedQueue = new LinkedBlockingQueue<>();
|
||||||
|
|
||||||
Object receivedMessageListener;
|
private final Object receivedMessageListener;
|
||||||
|
|
||||||
volatile String gameId;
|
private volatile String gameId;
|
||||||
volatile String connectionId;
|
private final String connectionId;
|
||||||
volatile String serverId;
|
private final String serverId;
|
||||||
|
|
||||||
|
private final TicTacToe ticTacToe = new TicTacToe("A", "B");
|
||||||
|
|
||||||
|
private boolean isGameWithAi = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return Returns a boolean where True: a game with AI, false: A game without AI's
|
||||||
|
*/
|
||||||
|
public boolean isGameWithAi() {
|
||||||
|
return this.isGameWithAi;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private MinMaxTicTacToe[] aiPlayers = new MinMaxTicTacToe[2];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is either 1 or 2.
|
* Is either 1 or 2.
|
||||||
@@ -64,6 +82,32 @@ public class LocalTicTacToe { // TODO: Implement runnable
|
|||||||
this.executor.submit(this::gameThread);
|
this.executor.submit(this::gameThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param isLocalServer If the server is hosted locally.
|
||||||
|
* @param ip The IP of the server to connect to.
|
||||||
|
* @param port The port of the server to connect to.
|
||||||
|
* @param aiPlayers boolean[firstPlayerIsAI, SecondPlayerIsAI]
|
||||||
|
*/
|
||||||
|
public LocalTicTacToe(boolean isLocalServer, String ip, String port, boolean[] aiPlayers) {
|
||||||
|
this.receivedMessageListener = GlobalEventBus.subscribe(Events.ServerEvents.ReceivedMessage.class, this::receiveMessageAction);
|
||||||
|
GlobalEventBus.register(this.receivedMessageListener);
|
||||||
|
|
||||||
|
// TODO: Is blocking
|
||||||
|
if (isLocalServer) { this.serverId = this.createServer(port); }
|
||||||
|
else { this.serverId = null; } // TODO: What if null?
|
||||||
|
this.connectionId = this.createConnection(ip, port);
|
||||||
|
this.createGame(ip, port);
|
||||||
|
|
||||||
|
if (aiPlayers != null) {
|
||||||
|
this.isGameWithAi = true;
|
||||||
|
if (aiPlayers[0]) { this.aiPlayers[0] = new MinMaxTicTacToe(); }
|
||||||
|
if (aiPlayers[1]) { this.aiPlayers[1] = new MinMaxTicTacToe(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
this.executor.submit(this::gameThread);
|
||||||
|
}
|
||||||
|
|
||||||
private String createServer(String port) {
|
private String createServer(String port) {
|
||||||
CompletableFuture<String> serverIdFuture = new CompletableFuture<>();
|
CompletableFuture<String> serverIdFuture = new CompletableFuture<>();
|
||||||
GlobalEventBus.post(new Events.ServerEvents.StartServerRequest(port, "tictactoe", serverIdFuture));
|
GlobalEventBus.post(new Events.ServerEvents.StartServerRequest(port, "tictactoe", serverIdFuture));
|
||||||
@@ -129,6 +173,16 @@ public class LocalTicTacToe { // TODO: Implement runnable
|
|||||||
boolean running = true;
|
boolean running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
try {
|
try {
|
||||||
|
if (isGameWithAi) {
|
||||||
|
if (aiPlayers[playersTurn - 1] != null) {
|
||||||
|
logger.info("{}, AI's turn", playersTurn);
|
||||||
|
int move = aiPlayers[playersTurn - 1].findBestMove(ticTacToe);
|
||||||
|
logger.info("{}, move {}", playersTurn, move);
|
||||||
|
ticTacToe.play(move);
|
||||||
|
this.move(move);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
String rec = this.receivedQueue.take();
|
String rec = this.receivedQueue.take();
|
||||||
if (rec.equalsIgnoreCase("ok")) {continue;}
|
if (rec.equalsIgnoreCase("ok")) {continue;}
|
||||||
else if (rec.equalsIgnoreCase("svr game yourturn")) {
|
else if (rec.equalsIgnoreCase("svr game yourturn")) {
|
||||||
@@ -141,6 +195,7 @@ public class LocalTicTacToe { // TODO: Implement runnable
|
|||||||
}
|
}
|
||||||
else if (rec.equalsIgnoreCase("svr game win")) {
|
else if (rec.equalsIgnoreCase("svr game win")) {
|
||||||
endListeners();
|
endListeners();
|
||||||
|
running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
@@ -152,6 +207,10 @@ public class LocalTicTacToe { // TODO: Implement runnable
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public char[] getCurrentBoard() {
|
||||||
|
return ticTacToe.getGrid();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* End the current game.
|
* End the current game.
|
||||||
*/
|
*/
|
||||||
@@ -163,6 +222,7 @@ public class LocalTicTacToe { // TODO: Implement runnable
|
|||||||
* @param index The move to make.
|
* @param index The move to make.
|
||||||
*/
|
*/
|
||||||
public void move(int index) {
|
public void move(int index) {
|
||||||
|
this.ticTacToe.play(index); // TODO Right now no server check if valid.
|
||||||
sendCommand("gameid", this.gameId, "player", "test", "move", String.valueOf(index));
|
sendCommand("gameid", this.gameId, "player", "test", "move", String.valueOf(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user