From 4c4b24068182a5807285f784c1adb18c6fa12b3c Mon Sep 17 00:00:00 2001 From: Julian Wollersberger Date: Tue, 12 Jun 2018 21:27:22 +0200 Subject: [PATCH] Server funktioniert, AI auch. Let's merge! --- AI/src/at/dropical/wolliAI/AiMain.java | 9 ++++-- AI/src/at/dropical/wolliAI/ServerAdapter.kt | 1 - .../dropical/wolliAI/types/TryToLoseAI.java | 21 ++++++++++++++ .../client/transmitter/RemoteTransmitter.java | 2 +- .../src/at/dropical/server/GameManager.java | 2 +- server/src/at/dropical/server/game/Game.java | 29 +++++++++++-------- .../transmitter/ServerToClientAdapter.java | 7 ++--- 7 files changed, 49 insertions(+), 22 deletions(-) create mode 100644 AI/src/at/dropical/wolliAI/types/TryToLoseAI.java diff --git a/AI/src/at/dropical/wolliAI/AiMain.java b/AI/src/at/dropical/wolliAI/AiMain.java index caa8ce5..8aeeeb4 100644 --- a/AI/src/at/dropical/wolliAI/AiMain.java +++ b/AI/src/at/dropical/wolliAI/AiMain.java @@ -3,6 +3,8 @@ import at.dropical.wolliAI.bestPossibility.BestPossibilityAI; import at.dropical.wolliAI.types.AI; +import at.dropical.wolliAI.types.AlwaysLeftAI; +import at.dropical.wolliAI.types.TryToLoseAI; /** * Starts the AI and connects to the default @@ -12,16 +14,17 @@ public class AiMain { public static void main(String[] args) throws InterruptedException { AI ai = new BestPossibilityAI(new ServerAdapter()); - //Temp - //AI ai2 = new BestPossibilityAI(new ServerAdapter()); + //Temp to occupy full game + //AI ai2 = new TryToLoseAI(new ServerAdapter()); while(true) { Thread.sleep(100); try { ai.process(); + //ai2.process(); } catch(IndexOutOfBoundsException e) { - System.out.println(e.getMessage()); + System.err.println(e.getMessage()); } } } diff --git a/AI/src/at/dropical/wolliAI/ServerAdapter.kt b/AI/src/at/dropical/wolliAI/ServerAdapter.kt index fcc233b..f86a322 100644 --- a/AI/src/at/dropical/wolliAI/ServerAdapter.kt +++ b/AI/src/at/dropical/wolliAI/ServerAdapter.kt @@ -119,7 +119,6 @@ class ServerAdapter( } fun sendInput(input: PlayerAction) { - //inputQueue.add(input) server.writeToServer(HandleInputRequest(playerName, input)) } diff --git a/AI/src/at/dropical/wolliAI/types/TryToLoseAI.java b/AI/src/at/dropical/wolliAI/types/TryToLoseAI.java new file mode 100644 index 0000000..7408e07 --- /dev/null +++ b/AI/src/at/dropical/wolliAI/types/TryToLoseAI.java @@ -0,0 +1,21 @@ +package at.dropical.wolliAI.types; +// Created by julian on 12.06.18. + +import at.dropical.shared.PlayerAction; +import at.dropical.wolliAI.ServerAdapter; + +/** + * Just drops to lose as fast as possible. + */ +public class TryToLoseAI implements AI { + + private ServerAdapter serverAdapter; + + public TryToLoseAI(ServerAdapter serverAdapter) { + this.serverAdapter = serverAdapter; + } + + public void process() { + serverAdapter.sendInput(PlayerAction.DROP); + } +} diff --git a/client/src/at/dropical/client/transmitter/RemoteTransmitter.java b/client/src/at/dropical/client/transmitter/RemoteTransmitter.java index c7e94a2..67d68d9 100644 --- a/client/src/at/dropical/client/transmitter/RemoteTransmitter.java +++ b/client/src/at/dropical/client/transmitter/RemoteTransmitter.java @@ -24,7 +24,7 @@ public void writeRequest(SendableItem r) { try { outputStream.writeObject(r); } catch(IOException e) { - e.printStackTrace(); + System.out.println(e.getLocalizedMessage()); } } diff --git a/server/src/at/dropical/server/GameManager.java b/server/src/at/dropical/server/GameManager.java index 4bf89de..7901202 100644 --- a/server/src/at/dropical/server/GameManager.java +++ b/server/src/at/dropical/server/GameManager.java @@ -103,7 +103,7 @@ private Game autoJoinOrCreateGame(String playerName, Transmitter trans) { })); // No waiting game found. if(game[0] == null) { - game[0] = new Game(); + game[0] = new Game(name); gamesMap.put(name, game[0]); } diff --git a/server/src/at/dropical/server/game/Game.java b/server/src/at/dropical/server/game/Game.java index f7c3651..d8a864a 100644 --- a/server/src/at/dropical/server/game/Game.java +++ b/server/src/at/dropical/server/game/Game.java @@ -9,10 +9,7 @@ import at.dropical.shared.net.abstracts.Transmitter; import at.dropical.shared.net.requests.HandleInputRequest; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; @@ -30,11 +27,13 @@ public class Game extends Thread implements AutoCloseable { private boolean updateClientsNextTime = false; //Classic - public Game() { + public Game(String name) { + setName(name); necessaryPlayers =2; } //Variable Players - public Game(int playercount) { + public Game(int playercount, String name) { + setName(name); this.necessaryPlayers =playercount; } @@ -70,8 +69,10 @@ private void gameLoop() { // Process inputs for(ServerToClientAdapter player : players) { - for(HandleInputRequest inputRequest : player.getInputQueue()) { - handleInput(inputRequest); + HandleInputRequest request = player.pollInput(); + while(request != null) { + handleInput(request); + request = player.pollInput(); } } @@ -146,19 +147,21 @@ public void updateClients() { if(!playerLock.tryLock()) return; - for (ServerToClientAdapter player : players) { + for(Iterator iterator = players.iterator(); iterator.hasNext(); ) { + ServerToClientAdapter player = iterator.next(); if(player.stillConnected()) player.writeRequest(container); else { - players.remove(player); + iterator.remove(); } } - for (ServerToClientAdapter viewer : viewers) { + for(Iterator iterator = viewers.iterator(); iterator.hasNext(); ) { + ServerToClientAdapter viewer = iterator.next(); if(viewer.stillConnected()) viewer.writeRequest(container); else - viewers.remove(viewer); + iterator.remove(); } playerLock.unlock(); } @@ -166,6 +169,7 @@ public void updateClients() { /** End all connections and terminate Threads. */ public void close() { this.interrupt(); + playerLock.lock(); try { for(ServerToClientAdapter player : players) { player.close(); @@ -174,6 +178,7 @@ public void close() { viewer.close(); } } catch(Exception ignored) { } + playerLock.unlock(); } public Map getGames() { diff --git a/server/src/at/dropical/server/transmitter/ServerToClientAdapter.java b/server/src/at/dropical/server/transmitter/ServerToClientAdapter.java index 78f51a4..8062193 100644 --- a/server/src/at/dropical/server/transmitter/ServerToClientAdapter.java +++ b/server/src/at/dropical/server/transmitter/ServerToClientAdapter.java @@ -55,7 +55,7 @@ private void recieveRequests() { /** Returns null when no request is in the queue. */ @Override - public SendableItem readRequest() throws IOException { + public SendableItem readRequest() { return requestQueue.poll(); } @@ -68,9 +68,8 @@ public boolean stillConnected() { return !transmitterDied; } - /** So kann gleich ein foreach gemacht werden. */ - public ConcurrentLinkedQueue getInputQueue() { - return inputQueue; + public HandleInputRequest pollInput() { + return inputQueue.poll(); } @Override