From 4c7017ff974247ac1c470038df395e51fb75a560 Mon Sep 17 00:00:00 2001 From: Quentin Legot Date: Thu, 2 Dec 2021 18:33:18 +0100 Subject: [PATCH] FINALLY fix the game with Window (currently not work with terminal) --- .../src/main/java/fr/lnl/game/client/App.java | 5 +- .../game/client/listener/ButtonListener.java | 17 +++++- .../game/client/listener/UpdateViewEvent.java | 12 ---- .../fr/lnl/game/client/view/TimerService.java | 19 ------ .../fr/lnl/game/client/view/ViewManager.java | 13 ---- .../java/fr/lnl/game/client/view/Window.java | 7 ++- .../java/fr/lnl/game/server/games/Game.java | 61 ++++++------------- .../game/server/games/InterfaceAction.java | 3 +- .../lnl/game/server/listener/AwakeGame.java | 17 ------ .../game/server/listener/GameFinishEvent.java | 2 - .../test/java/fr/lnl/game/server/Mock.java | 3 +- .../lnl/game/server/games/MockViewUpdate.java | 10 --- 12 files changed, 42 insertions(+), 127 deletions(-) delete mode 100644 client/src/main/java/fr/lnl/game/client/listener/UpdateViewEvent.java delete mode 100644 client/src/main/java/fr/lnl/game/client/view/TimerService.java delete mode 100644 server/src/main/java/fr/lnl/game/server/listener/AwakeGame.java delete mode 100644 server/src/test/java/fr/lnl/game/server/games/MockViewUpdate.java diff --git a/client/src/main/java/fr/lnl/game/client/App.java b/client/src/main/java/fr/lnl/game/client/App.java index 7b41864..574a030 100644 --- a/client/src/main/java/fr/lnl/game/client/App.java +++ b/client/src/main/java/fr/lnl/game/client/App.java @@ -1,7 +1,6 @@ package fr.lnl.game.client; import fr.lnl.game.client.view.*; import fr.lnl.game.server.listener.GameFinishEvent; -import fr.lnl.game.client.listener.UpdateViewEvent; import fr.lnl.game.server.games.Game; import fr.lnl.game.server.games.grid.Grid; import fr.lnl.game.server.games.player.*; @@ -39,7 +38,7 @@ public class App extends Application { public static void startGame(ViewLambda lambda) throws IllegalArgumentException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { List players = parsePlayers(); - game = new Game(new Grid(12, 12, players), players, new UpdateViewEvent(), new GameFinishEvent()); + game = new Game(new Grid(12, 12, players), players, new GameFinishEvent()); for (Player player : game.getPlayers()) { playerList.put(player, new ClientPlayer(player, lambda.createViewLambda(player))); } @@ -54,7 +53,6 @@ public class App extends Application { throw new CrashException(e.getMessage(), e); } viewManager = new ViewManager(playerList, game); - new Thread(() -> game.play()).start(); } public static void launchTerminal() { @@ -65,7 +63,6 @@ public class App extends Application { throw new CrashException(e.getMessage(), e); } viewManager = new ViewManager(playerList, game); - new Thread(() -> game.play()).start(); } public static List parsePlayers() throws IllegalArgumentException, NoSuchMethodException, diff --git a/client/src/main/java/fr/lnl/game/client/listener/ButtonListener.java b/client/src/main/java/fr/lnl/game/client/listener/ButtonListener.java index bfcf322..4d8e7f4 100644 --- a/client/src/main/java/fr/lnl/game/client/listener/ButtonListener.java +++ b/client/src/main/java/fr/lnl/game/client/listener/ButtonListener.java @@ -1,12 +1,21 @@ package fr.lnl.game.client.listener; import fr.lnl.game.client.App; +import fr.lnl.game.server.games.Game; import fr.lnl.game.server.listener.AbstractModelListening; import fr.lnl.game.server.listener.ModelListener; +import javafx.scene.control.Alert; +import javafx.scene.control.Dialog; public class ButtonListener extends AbstractModelListening { + private final Game game; + + public ButtonListener(Game game) { + this.game = game; + } + @Override public void addListener(ModelListener e) { this.listeners.add(e); @@ -20,6 +29,12 @@ public class ButtonListener extends AbstractModelListening { @Override public void updateModel(Object event) { - App.viewManager.setNeedUpdate(true); + game.play(); + App.viewManager.updateView(); + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle("Un joueur ordinateur a joué"); + alert.setHeaderText("Le joueur ordinateur numéro" + game.getCurrentPlayer().getId() + " a joué"); + alert.setContentText("Il a joué l'action: " + game.getSelectedAction()); + alert.showAndWait(); } } diff --git a/client/src/main/java/fr/lnl/game/client/listener/UpdateViewEvent.java b/client/src/main/java/fr/lnl/game/client/listener/UpdateViewEvent.java deleted file mode 100644 index ac6b91e..0000000 --- a/client/src/main/java/fr/lnl/game/client/listener/UpdateViewEvent.java +++ /dev/null @@ -1,12 +0,0 @@ -package fr.lnl.game.client.listener; - -import fr.lnl.game.client.App; -import fr.lnl.game.server.listener.AbstractModelListening; - -public class UpdateViewEvent extends AbstractModelListening { - - @Override - public void updateModel(Object obj) { - App.viewManager.setNeedUpdate(true); - } -} diff --git a/client/src/main/java/fr/lnl/game/client/view/TimerService.java b/client/src/main/java/fr/lnl/game/client/view/TimerService.java deleted file mode 100644 index 936bb35..0000000 --- a/client/src/main/java/fr/lnl/game/client/view/TimerService.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.lnl.game.client.view; - -import fr.lnl.game.client.App; -import javafx.concurrent.ScheduledService; -import javafx.concurrent.Task; - -public class TimerService extends ScheduledService { - @Override - protected Task createTask() { - return new Task<>() { - protected Integer call() { - if(App.viewManager.getNeedUpdate()) { - App.viewManager.updateView(); - } - return 0; - } - }; - } -} diff --git a/client/src/main/java/fr/lnl/game/client/view/ViewManager.java b/client/src/main/java/fr/lnl/game/client/view/ViewManager.java index 50d11df..c71bfd3 100644 --- a/client/src/main/java/fr/lnl/game/client/view/ViewManager.java +++ b/client/src/main/java/fr/lnl/game/client/view/ViewManager.java @@ -12,27 +12,14 @@ public class ViewManager { private final HashMap players; private final Game game; - private Boolean needUpdate = true; public ViewManager(HashMap players, Game game) { this.players = players; this.game = game; - TimerService timer = new TimerService(); - timer.setPeriod(Duration.millis(30)); updateView(); - timer.start(); } public void updateView() { players.get(game.getCurrentPlayer()).getView().show(); - setNeedUpdate(false); - } - - public Boolean getNeedUpdate() { - return needUpdate; - } - - public void setNeedUpdate(Boolean needUpdate) { - this.needUpdate = needUpdate; } } diff --git a/client/src/main/java/fr/lnl/game/client/view/Window.java b/client/src/main/java/fr/lnl/game/client/view/Window.java index 65bb4e0..9ad05fa 100644 --- a/client/src/main/java/fr/lnl/game/client/view/Window.java +++ b/client/src/main/java/fr/lnl/game/client/view/Window.java @@ -25,9 +25,10 @@ public class Window extends AbstractView { String javaVersion = System.getProperty("java.version"); String javafxVersion = System.getProperty("javafx.version"); Label l = new Label("Hello, JavaFX version " + javafxVersion + ", running on Java " + javaVersion + "."); - Label l2 = new Label("I'm " + player.getClass().getSimpleName() + " num " + player.getId() + " my class is " + player.getClassPlayer().toString()); - Button b = new Button("Click to see others players informations"); - b.setOnAction(new ClientEventHandler(new ButtonListener())); + Label l2 = new Label("I'm " + player.getClass().getSimpleName() + " num " + player.getId() + "" + + " my class is " + player.getClassPlayer().toString() + ", my remaining energy is " + player.getEnergy()); + Button b = new Button("Click to continue the game"); + b.setOnAction(new ClientEventHandler(new ButtonListener(game))); GridPane grid = new GridPane(); grid.add(l, 0, 0); grid.add(l2, 0, 1); diff --git a/server/src/main/java/fr/lnl/game/server/games/Game.java b/server/src/main/java/fr/lnl/game/server/games/Game.java index 993219d..0966e38 100644 --- a/server/src/main/java/fr/lnl/game/server/games/Game.java +++ b/server/src/main/java/fr/lnl/game/server/games/Game.java @@ -5,7 +5,6 @@ import fr.lnl.game.server.games.grid.Grid; import fr.lnl.game.server.games.player.ComputerPlayer; import fr.lnl.game.server.games.player.HumanPlayer; import fr.lnl.game.server.games.player.Player; -import fr.lnl.game.server.listener.AwakeGame; import fr.lnl.game.server.listener.ModelListener; import fr.lnl.game.server.utils.CrashException; import fr.lnl.game.server.utils.Point; @@ -13,31 +12,25 @@ import fr.lnl.game.server.utils.Point; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.concurrent.TimeUnit; import java.util.stream.Stream; public class Game { private final Grid grid; private final List players; - private final ModelListener viewUpdateEvent; private final ModelListener gameFinishEvent; private Player currentPlayer; - private InterfaceAction interfaceAction; private Action selectedAction = null; - ModelListener awakeEvent; - private final Object lock = new Object(); - public Game(Grid grid, List players, ModelListener viewUpdate, ModelListener gameFinishEvent) throws IllegalArgumentException { + public Game(Grid grid, List players, ModelListener gameFinishEvent) throws IllegalArgumentException { if(players.size() < 2) throw new IllegalArgumentException("The game need 2 or more player to start"); this.players = players; this.currentPlayer = players.get(0); this.grid = grid; - this.viewUpdateEvent = viewUpdate; this.gameFinishEvent = gameFinishEvent; placePlayersBRUT(); - + currentPlayer.setActions(generateAndGetPlayerActions(currentPlayer)); } /** @@ -52,54 +45,36 @@ public class Game { } public void play() { - while(!isOver()) { - awakeEvent = new AwakeGame(this); - currentPlayer.setActions(generateAndGetPlayerActions(currentPlayer)); - if(currentPlayer instanceof HumanPlayer) { - interfaceAction = InterfaceAction.SELECT_ACTION; - waitForInterfaceEvent(); - selectedAction.doAction(); - } else { - ComputerPlayer player = (ComputerPlayer) currentPlayer; - Action action = player.choseAction(); - action.doAction(); - waitNSeconds(2); - } - selectedAction = null; - nextCurrentPlayer(); - viewUpdateEvent.updateModel(null); + if (currentPlayer instanceof ComputerPlayer player) { + selectedAction = player.choseAction(); } - gameFinishEvent.updateModel(null); + selectedAction.doAction(); + nextCurrentPlayer(); + currentPlayer.setActions(generateAndGetPlayerActions(currentPlayer)); + if(isOver()) { + gameFinishEvent.updateModel(null); + } + } private void waitForInterfaceEvent() { - synchronized (lock){ - try { - wait(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - } - - private void waitNSeconds(int n) { synchronized (this){ try { - wait(TimeUnit.SECONDS.toMillis(n)); + wait(); } catch (InterruptedException e) { throw new CrashException(e.getMessage(), e); } } + } public void resumeThread() { - synchronized (lock) { - lock.notifyAll(); + synchronized (this) { + notifyAll(); } } - protected List generateAndGetPlayerActions(Player player) { + public List generateAndGetPlayerActions(Player player) { List actions = new ArrayList<>(); for(Direction direction : Direction.values()) { try { @@ -164,7 +139,7 @@ public class Game { return players; } - public InterfaceAction getInterfaceAction() { - return interfaceAction; + public Action getSelectedAction() { + return selectedAction; } } \ No newline at end of file diff --git a/server/src/main/java/fr/lnl/game/server/games/InterfaceAction.java b/server/src/main/java/fr/lnl/game/server/games/InterfaceAction.java index 01591f1..2322f1f 100644 --- a/server/src/main/java/fr/lnl/game/server/games/InterfaceAction.java +++ b/server/src/main/java/fr/lnl/game/server/games/InterfaceAction.java @@ -2,6 +2,7 @@ package fr.lnl.game.server.games; public enum InterfaceAction { - SELECT_ACTION + SELECT_ACTION, + DIALOG_TO_CONTINUE_COMPUTER_IA } diff --git a/server/src/main/java/fr/lnl/game/server/listener/AwakeGame.java b/server/src/main/java/fr/lnl/game/server/listener/AwakeGame.java deleted file mode 100644 index c5bc122..0000000 --- a/server/src/main/java/fr/lnl/game/server/listener/AwakeGame.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.lnl.game.server.listener; - -import fr.lnl.game.server.games.Game; - -public class AwakeGame extends AbstractModelListening { - - private final Game game; - - public AwakeGame(Game game) { - this.game = game; - } - - @Override - public void updateModel(Object obj) { - game.resumeThread(); - } -} diff --git a/server/src/main/java/fr/lnl/game/server/listener/GameFinishEvent.java b/server/src/main/java/fr/lnl/game/server/listener/GameFinishEvent.java index f09595f..183b1ea 100644 --- a/server/src/main/java/fr/lnl/game/server/listener/GameFinishEvent.java +++ b/server/src/main/java/fr/lnl/game/server/listener/GameFinishEvent.java @@ -1,7 +1,5 @@ package fr.lnl.game.server.listener; -import fr.lnl.game.server.listener.AbstractModelListening; - public class GameFinishEvent extends AbstractModelListening { private final Object lock = new Object(); diff --git a/server/src/test/java/fr/lnl/game/server/Mock.java b/server/src/test/java/fr/lnl/game/server/Mock.java index 19e13bb..89aa984 100644 --- a/server/src/test/java/fr/lnl/game/server/Mock.java +++ b/server/src/test/java/fr/lnl/game/server/Mock.java @@ -1,7 +1,6 @@ package fr.lnl.game.server; import fr.lnl.game.server.games.Game; -import fr.lnl.game.server.games.MockViewUpdate; import fr.lnl.game.server.games.grid.EnergyBall; import fr.lnl.game.server.games.grid.Grid; import fr.lnl.game.server.games.grid.Wall; @@ -27,7 +26,7 @@ public class Mock { placePlayersBRUT(); placeEnergyBallBRUT(); placeInternWallBRUT(); - game = new Game(grid, players, new MockViewUpdate(), new GameFinishEvent()); + game = new Game(grid, players, new GameFinishEvent()); } public void placePlayersBRUT(){ diff --git a/server/src/test/java/fr/lnl/game/server/games/MockViewUpdate.java b/server/src/test/java/fr/lnl/game/server/games/MockViewUpdate.java deleted file mode 100644 index 05ec33f..0000000 --- a/server/src/test/java/fr/lnl/game/server/games/MockViewUpdate.java +++ /dev/null @@ -1,10 +0,0 @@ -package fr.lnl.game.server.games; - -import fr.lnl.game.server.listener.AbstractModelListening; - -public class MockViewUpdate extends AbstractModelListening { - @Override - public void updateModel(Object obj) { - // no op - } -}