implement Game#play
This commit is contained in:
parent
42b0c656f8
commit
9cfa56be8d
@ -35,10 +35,13 @@ public class App extends Application {
|
||||
}
|
||||
}
|
||||
|
||||
public static Game startGame() throws IllegalArgumentException, InvocationTargetException, NoSuchMethodException,
|
||||
public static void startGame() throws IllegalArgumentException, InvocationTargetException, NoSuchMethodException,
|
||||
InstantiationException, IllegalAccessException {
|
||||
List<Player> players = parsePlayers();
|
||||
return new Game(new Grid(12, 12, players), players);
|
||||
for (Player player : game.getPlayers()) {
|
||||
playerList.put(player, new ClientPlayer(player, new Terminal(game, player)));
|
||||
}
|
||||
game = new Game(new Grid(12, 12, players), players);
|
||||
}
|
||||
|
||||
public static void updateView() {
|
||||
@ -48,28 +51,23 @@ public class App extends Application {
|
||||
@Override
|
||||
public void start(Stage stage) {
|
||||
try {
|
||||
game = startGame();
|
||||
startGame();
|
||||
} catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | InstantiationException
|
||||
| IllegalAccessException e) {
|
||||
throw new CrashException(e.getMessage(), e);
|
||||
}
|
||||
for (Player player : game.getPlayers()) {
|
||||
playerList.put(player, new ClientPlayer(player, new Window(stage, game, player)));
|
||||
}
|
||||
new Thread(() -> game.play());
|
||||
updateView();
|
||||
}
|
||||
|
||||
public static void launchTerminal() {
|
||||
try {
|
||||
game = startGame();
|
||||
startGame();
|
||||
} catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | InstantiationException
|
||||
| IllegalAccessException e) {
|
||||
throw new CrashException(e.getMessage(), e);
|
||||
}
|
||||
|
||||
for (Player player : game.getPlayers()) {
|
||||
playerList.put(player, new ClientPlayer(player, new Terminal(game, player)));
|
||||
}
|
||||
new Thread(() -> game.play());
|
||||
updateView();
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
package fr.lnl.game.client.listener;
|
||||
|
||||
import fr.lnl.game.client.App;
|
||||
import fr.lnl.game.server.listener.AbstractModelListening;
|
||||
import fr.lnl.game.server.listener.ModelListener;
|
||||
|
||||
public class ButtonListener extends AbstractModelListening {
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
package fr.lnl.game.client.view;
|
||||
|
||||
import fr.lnl.game.client.listener.ModelListener;
|
||||
import fr.lnl.game.server.listener.ModelListener;
|
||||
import fr.lnl.game.client.listener.ButtonListener;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.event.EventHandler;
|
||||
|
@ -3,16 +3,22 @@ package fr.lnl.game.server.games;
|
||||
import fr.lnl.game.server.games.action.*;
|
||||
import fr.lnl.game.server.games.grid.Grid;
|
||||
import fr.lnl.game.server.games.player.Player;
|
||||
import fr.lnl.game.server.listener.AwakeGame;
|
||||
import fr.lnl.game.server.listener.ModelListener;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class Game {
|
||||
|
||||
Grid grid;
|
||||
Player currentPlayer;
|
||||
List<Player> players;
|
||||
private final Grid grid;
|
||||
private final List<Player> players;
|
||||
private Player currentPlayer;
|
||||
private InterfaceAction interfaceAction;
|
||||
private Action selectedAction = null;
|
||||
private final Object lock = new Object();
|
||||
|
||||
public Game(Grid grid, List<Player> players) throws IllegalArgumentException {
|
||||
if(players.size() < 2)
|
||||
@ -22,8 +28,37 @@ public class Game {
|
||||
this.grid = grid;
|
||||
}
|
||||
|
||||
public void play() {
|
||||
/**
|
||||
*
|
||||
* @return game winner
|
||||
*/
|
||||
public Player play() {
|
||||
while(!isOver()) {
|
||||
ModelListener awakeEvent = new AwakeGame(this);
|
||||
generateAndGetPlayerActions(currentPlayer);
|
||||
interfaceAction = InterfaceAction.SELECT_ACTION;
|
||||
waitForInterfaceEvent();
|
||||
selectedAction.doAction();
|
||||
nextCurrentPlayer();
|
||||
}
|
||||
return getWinner();
|
||||
}
|
||||
|
||||
private void waitForInterfaceEvent() {
|
||||
synchronized (lock){
|
||||
try {
|
||||
wait();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void resumeThread() {
|
||||
synchronized (lock) {
|
||||
lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
protected List<Action> generateAndGetPlayerActions(Player player) {
|
||||
@ -46,13 +81,17 @@ public class Game {
|
||||
return actions;
|
||||
}
|
||||
|
||||
public Stream<Player> getPlayersAlive() {
|
||||
return players.parallelStream().filter(Player::isAlive);
|
||||
}
|
||||
|
||||
public boolean isOver() {
|
||||
return players.parallelStream().filter(player -> !player.isAlive()).count() == 1;
|
||||
return getPlayersAlive().count() <= 1;
|
||||
}
|
||||
|
||||
public Player getWinner() {
|
||||
// On part du principe que isOver est forcément appelé avant d'appeler getWinner
|
||||
return players.parallelStream().filter(player -> !player.isAlive()).findFirst().orElse(null);
|
||||
return getPlayersAlive().findFirst().orElse(null);
|
||||
}
|
||||
|
||||
public Player getCurrentPlayer() {
|
||||
@ -86,4 +125,8 @@ public class Game {
|
||||
public List<Player> getPlayers() {
|
||||
return players;
|
||||
}
|
||||
|
||||
public InterfaceAction getInterfaceAction() {
|
||||
return interfaceAction;
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package fr.lnl.game.server.games;
|
||||
|
||||
public enum InterfaceAction {
|
||||
|
||||
SELECT_ACTION
|
||||
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package fr.lnl.game.client.listener;
|
||||
package fr.lnl.game.server.listener;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class AbstractModelListening implements ModelListener {
|
||||
|
||||
List<ModelListener> listeners;
|
||||
protected List<ModelListener> listeners;
|
||||
|
||||
public void addListener(ModelListener e) {
|
||||
this.listeners.add(e);
|
@ -0,0 +1,17 @@
|
||||
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();
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package fr.lnl.game.client.listener;
|
||||
package fr.lnl.game.server.listener;
|
||||
|
||||
public interface ModelListener {
|
||||
//à peut-être revoir
|
@ -6,4 +6,5 @@ module server {
|
||||
exports fr.lnl.game.server.games.weapon;
|
||||
exports fr.lnl.game.server.games.action;
|
||||
exports fr.lnl.game.server.utils;
|
||||
exports fr.lnl.game.server.listener;
|
||||
}
|
Loading…
Reference in New Issue
Block a user