Merge remote-tracking branch 'origin/master'

# Conflicts:
#	client/src/main/java/fr/lnl/game/client/App.java
#	server/src/main/java/fr/lnl/game/server/games/Game.java
#	server/src/test/java/fr/lnl/game/server/Mock.java
This commit is contained in:
Katchan 2021-12-02 20:06:53 +01:00
commit e862e79a62
20 changed files with 92 additions and 141 deletions

View File

@ -1,14 +1,9 @@
package fr.lnl.game.client; package fr.lnl.game.client;
import fr.lnl.game.client.view.*;
import fr.lnl.game.client.listener.UpdateViewEvent; import fr.lnl.game.server.listener.GameFinishEvent;
import fr.lnl.game.client.view.AbstractView;
import fr.lnl.game.client.view.Terminal;
import fr.lnl.game.client.view.ViewManager;
import fr.lnl.game.client.view.Window;
import fr.lnl.game.server.games.Game; import fr.lnl.game.server.games.Game;
import fr.lnl.game.server.games.grid.Grid; import fr.lnl.game.server.games.grid.Grid;
import fr.lnl.game.server.games.player.*; import fr.lnl.game.server.games.player.*;
import fr.lnl.game.server.listener.GameFinishEvent;
import fr.lnl.game.server.utils.CrashException; import fr.lnl.game.server.utils.CrashException;
import fr.lnl.game.server.utils.Point; import fr.lnl.game.server.utils.Point;
import javafx.application.Application; import javafx.application.Application;
@ -43,7 +38,7 @@ public class App extends Application {
public static void startGame(ViewLambda lambda) throws IllegalArgumentException, InvocationTargetException, NoSuchMethodException, public static void startGame(ViewLambda lambda) throws IllegalArgumentException, InvocationTargetException, NoSuchMethodException,
InstantiationException, IllegalAccessException { InstantiationException, IllegalAccessException {
List<Player> players = parsePlayers(); List<Player> 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()) { for (Player player : game.getPlayers()) {
playerList.put(player, new ClientPlayer(player, lambda.createViewLambda(player))); playerList.put(player, new ClientPlayer(player, lambda.createViewLambda(player)));
} }
@ -58,7 +53,6 @@ public class App extends Application {
throw new CrashException(e.getMessage(), e); throw new CrashException(e.getMessage(), e);
} }
viewManager = new ViewManager(playerList, game); viewManager = new ViewManager(playerList, game);
new Thread(() -> game.play()).start();
} }
public static void launchTerminal() { public static void launchTerminal() {
@ -69,7 +63,6 @@ public class App extends Application {
throw new CrashException(e.getMessage(), e); throw new CrashException(e.getMessage(), e);
} }
viewManager = new ViewManager(playerList, game); viewManager = new ViewManager(playerList, game);
new Thread(() -> game.play()).start();
} }
public static List<Player> parsePlayers() throws IllegalArgumentException, NoSuchMethodException, public static List<Player> parsePlayers() throws IllegalArgumentException, NoSuchMethodException,

View File

@ -1,12 +1,21 @@
package fr.lnl.game.client.listener; package fr.lnl.game.client.listener;
import fr.lnl.game.client.App; 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.AbstractModelListening;
import fr.lnl.game.server.listener.ModelListener; import fr.lnl.game.server.listener.ModelListener;
import javafx.scene.control.Alert;
import javafx.scene.control.Dialog;
public class ButtonListener extends AbstractModelListening { public class ButtonListener extends AbstractModelListening {
private final Game game;
public ButtonListener(Game game) {
this.game = game;
}
@Override @Override
public void addListener(ModelListener e) { public void addListener(ModelListener e) {
this.listeners.add(e); this.listeners.add(e);
@ -20,6 +29,12 @@ public class ButtonListener extends AbstractModelListening {
@Override @Override
public void updateModel(Object event) { 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();
} }
} }

View File

@ -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);
}
}

View File

@ -4,6 +4,7 @@ import fr.lnl.game.server.games.grid.Bomb;
import fr.lnl.game.server.games.grid.EnergyBall; import fr.lnl.game.server.games.grid.EnergyBall;
import fr.lnl.game.server.games.grid.Mine; import fr.lnl.game.server.games.grid.Mine;
import fr.lnl.game.server.games.player.Player; import fr.lnl.game.server.games.player.Player;
import fr.lnl.game.server.utils.Cardinal;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane; import javafx.scene.layout.StackPane;
@ -36,17 +37,34 @@ public class Cell extends Rectangle {
if(object instanceof Player){ if(object instanceof Player){
image = new Image("file:resources/images/player.png"); image = new Image("file:resources/images/player.png");
} }
if(object instanceof EnergyBall){ else if(object instanceof EnergyBall){
image = new Image("file:resources/images/energyBall.png"); image = new Image("file:resources/images/energyBall.png");
} }
if(object instanceof Bomb){ else if(object instanceof Bomb){
image = new Image("file:resources/images/bomb.jpg"); image = new Image("file:resources/images/bomb.jpg");
} }
if(object instanceof Mine){ else if(object instanceof Mine){
image = new Image("file:resources/images/mine.webp"); image = new Image("file:resources/images/mine.webp");
} }
else{ else{
image = new Image("file:resources/images/wall.jpg"); //test
if(((Wall)object).getCardinal()== Cardinal.NORTH){
image = new Image("file:resources/topWall.png");
}else if(((Wall)object).getCardinal()== Cardinal.SOUTH) {
image = new Image("file:resources/bottomWall.png");
}else if(((Wall)object).getCardinal()== Cardinal.EAST) {
image = new Image("file:resources/rightWall.png");
}else if(((Wall)object).getCardinal()== Cardinal.WEST) {
image = new Image("file:resources/leftWall.png");
}else if(((Wall)object).getCardinal()== Cardinal.NORTH_EAST) {
image = new Image("file:resources/topRightWall.png");
}else if(((Wall)object).getCardinal()== Cardinal.NORTH_WEST) {
image = new Image("file:resources/topLeftWall.png");
}else if(((Wall)object).getCardinal()== Cardinal.SOUTH_EAST) {
image = new Image("file:resources/bottomRightWall.png");
}else{
image = new Image("file:resources/bottomLeftWall.png");
}
} }
ImageView iv = new ImageView(image); ImageView iv = new ImageView(image);

View File

@ -49,9 +49,8 @@ public class GUI {
private Parent createContent() { private Parent createContent() {
Pane principalPane = new Pane(); Pane principalPane = new Pane();
principalPane.setPrefSize(width * cellSize, height * cellSize); principalPane.setPrefSize(width * cellSize, height * cellSize);
//PARTIE1
//à définir avec n pour moduler la taille du plateau
//à définir avec n pour moduler la taille du plateau
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) { for (int j = 0; j < 16; j++) {
Cell cell = new Cell(i, j); Cell cell = new Cell(i, j);
@ -59,7 +58,6 @@ public class GUI {
} }
} }
//PARTIE2
board = grid.getBoard(); board = grid.getBoard();
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) { for (int j = 0; j < 16; j++) {
@ -68,11 +66,20 @@ public class GUI {
addToPrincipalPanel(value.getA(), principalPane, i, j); addToPrincipalPanel(value.getA(), principalPane, i, j);
} }
if (value.getB() instanceof Wall || value.getB() instanceof EnergyBall || value.getB() instanceof Mine || value.getB() instanceof Bomb) { if (value.getB() instanceof Wall || value.getB() instanceof EnergyBall || value.getB() instanceof Mine || value.getB() instanceof Bomb) {
System.out.println(value.getB());
addToPrincipalPanel(value.getB(), principalPane, i, j); addToPrincipalPanel(value.getB(), principalPane, i, j);
} }
} }
} }
//PARTIE3
Rectangle shape = new Rectangle();
shape.setX(700);
shape.setY(20);
shape.setWidth(200);
shape.setHeight(600);
shape.setFill(javafx.scene.paint.Color.WHITE);
Button followingButton = new Button("SUIVANT"); Button followingButton = new Button("SUIVANT");
followingButton.setLayoutX(775); followingButton.setLayoutX(775);
followingButton.setLayoutY(600); followingButton.setLayoutY(600);
@ -81,6 +88,7 @@ public class GUI {
//add un eventListener au button //add un eventListener au button
principalPane.getChildren().add(followingButton); principalPane.getChildren().add(followingButton);
//pas compris le principe
return principalPane; return principalPane;
} }

View File

@ -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<Integer> {
@Override
protected Task<Integer> createTask() {
return new Task<>() {
protected Integer call() {
if(App.viewManager.getNeedUpdate()) {
App.viewManager.updateView();
}
return 0;
}
};
}
}

View File

@ -12,27 +12,14 @@ public class ViewManager {
private final HashMap<Player, ClientPlayer> players; private final HashMap<Player, ClientPlayer> players;
private final Game game; private final Game game;
private Boolean needUpdate = true;
public ViewManager(HashMap<Player, ClientPlayer> players, Game game) { public ViewManager(HashMap<Player, ClientPlayer> players, Game game) {
this.players = players; this.players = players;
this.game = game; this.game = game;
TimerService timer = new TimerService();
timer.setPeriod(Duration.millis(30));
updateView(); updateView();
timer.start();
} }
public void updateView() { public void updateView() {
players.get(game.getCurrentPlayer()).getView().show(); players.get(game.getCurrentPlayer()).getView().show();
setNeedUpdate(false);
}
public Boolean getNeedUpdate() {
return needUpdate;
}
public void setNeedUpdate(Boolean needUpdate) {
this.needUpdate = needUpdate;
} }
} }

View File

@ -22,9 +22,10 @@ public class Window extends AbstractView {
String javaVersion = System.getProperty("java.version"); String javaVersion = System.getProperty("java.version");
String javafxVersion = System.getProperty("javafx.version"); String javafxVersion = System.getProperty("javafx.version");
Label l = new Label("Hello, JavaFX version " + javafxVersion + ", running on Java " + javaVersion + "."); 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()); Label l2 = new Label("I'm " + player.getClass().getSimpleName() + " num " + player.getId() + "" +
Button b = new Button("Click to see others players informations"); " my class is " + player.getClassPlayer().toString() + ", my remaining energy is " + player.getEnergy());
b.setOnAction(new ClientEventHandler(new ButtonListener())); Button b = new Button("Click to continue the game");
b.setOnAction(new ClientEventHandler(new ButtonListener(game)));
GridPane grid = new GridPane(); GridPane grid = new GridPane();
grid.add(l, 0, 0); grid.add(l, 0, 0);
grid.add(l2, 0, 1); grid.add(l2, 0, 1);

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -5,92 +5,76 @@ import fr.lnl.game.server.games.grid.Grid;
import fr.lnl.game.server.games.player.ComputerPlayer; import fr.lnl.game.server.games.player.ComputerPlayer;
import fr.lnl.game.server.games.player.HumanPlayer; import fr.lnl.game.server.games.player.HumanPlayer;
import fr.lnl.game.server.games.player.Player; 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.listener.ModelListener;
import fr.lnl.game.server.utils.CrashException; import fr.lnl.game.server.utils.CrashException;
import fr.lnl.game.server.utils.Point;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream; import java.util.stream.Stream;
public class Game { public class Game {
private final Grid grid; private final Grid grid;
private final List<Player> players; private final List<Player> players;
private final ModelListener viewUpdateEvent;
private final ModelListener gameFinishEvent; private final ModelListener gameFinishEvent;
private Player currentPlayer; private Player currentPlayer;
private InterfaceAction interfaceAction;
private Action selectedAction = null; private Action selectedAction = null;
ModelListener awakeEvent;
private final Object lock = new Object();
public Game(Grid grid, List<Player> players, ModelListener viewUpdate, ModelListener gameFinishEvent) throws IllegalArgumentException { public Game(Grid grid, List<Player> players, ModelListener gameFinishEvent) throws IllegalArgumentException {
if(players.size() < 2 || grid.getNumberNeutralBox() < players.size()) if(players.size() < 2)
throw new IllegalArgumentException("The game need 2 or more player to start"); throw new IllegalArgumentException("The game need 2 or more player to start");
this.players = players; this.players = players;
this.currentPlayer = players.get(0); this.currentPlayer = players.get(0);
this.grid = grid; this.grid = grid;
this.viewUpdateEvent = viewUpdate;
this.gameFinishEvent = gameFinishEvent; this.gameFinishEvent = gameFinishEvent;
grid.initPlacePlayers(); placePlayersBRUT();
currentPlayer.setActions(generateAndGetPlayerActions(currentPlayer));
} }
/** /**
* @deprecated utiliser pour le moment, nécessite une meilleure implémentation pour savoir ou placé les joueurs * @deprecated utiliser pour le moment, nécessite une meilleure implémentation pour savoir ou placé les joueurs
*/ */
@Deprecated
public void placePlayersBRUT(){
grid.getBoard().get(new Point(7,7)).setA(grid.getPlayers().get(0));
grid.getPlayers().get(0).setPosition(new Point(7, 7));
grid.getBoard().get(new Point(7,8)).setA(grid.getPlayers().get(1));
grid.getPlayers().get(1).setPosition(new Point(7, 8));
}
public void play() { public void play() {
while(!isOver()) { if (currentPlayer instanceof ComputerPlayer player) {
awakeEvent = new AwakeGame(this); selectedAction = player.choseAction();
currentPlayer.setActions(generateAndGetPlayerActions(currentPlayer)); }
if(currentPlayer instanceof HumanPlayer) {
interfaceAction = InterfaceAction.SELECT_ACTION;
waitForInterfaceEvent();
selectedAction.doAction(); selectedAction.doAction();
} else {
ComputerPlayer player = (ComputerPlayer) currentPlayer;
Action action = player.choseAction();
action.doAction();
waitNSeconds(2);
}
selectedAction = null;
nextCurrentPlayer(); nextCurrentPlayer();
viewUpdateEvent.updateModel(null); currentPlayer.setActions(generateAndGetPlayerActions(currentPlayer));
} if(isOver()) {
gameFinishEvent.updateModel(null); gameFinishEvent.updateModel(null);
} }
}
private void waitForInterfaceEvent() { private void waitForInterfaceEvent() {
synchronized (lock){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void waitNSeconds(int n) {
synchronized (this){ synchronized (this){
try { try {
wait(TimeUnit.SECONDS.toMillis(n)); wait();
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new CrashException(e.getMessage(), e); throw new CrashException(e.getMessage(), e);
} }
} }
} }
public void resumeThread() { public void resumeThread() {
synchronized (lock) { synchronized (this) {
lock.notifyAll(); notifyAll();
} }
} }
protected List<Action> generateAndGetPlayerActions(Player player) { public List<Action> generateAndGetPlayerActions(Player player) {
List<Action> actions = new ArrayList<>(); List<Action> actions = new ArrayList<>();
for(Direction direction : Direction.values()) { for(Direction direction : Direction.values()) {
try { try {
@ -155,7 +139,7 @@ public class Game {
return players; return players;
} }
public InterfaceAction getInterfaceAction() { public Action getSelectedAction() {
return interfaceAction; return selectedAction;
} }
} }

View File

@ -2,6 +2,7 @@ package fr.lnl.game.server.games;
public enum InterfaceAction { public enum InterfaceAction {
SELECT_ACTION SELECT_ACTION,
DIALOG_TO_CONTINUE_COMPUTER_IA
} }

View File

@ -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();
}
}

View File

@ -1,7 +1,6 @@
package fr.lnl.game.server; package fr.lnl.game.server;
import fr.lnl.game.server.games.Game; 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.EnergyBall;
import fr.lnl.game.server.games.grid.Grid; import fr.lnl.game.server.games.grid.Grid;
import fr.lnl.game.server.games.grid.Wall; import fr.lnl.game.server.games.grid.Wall;
@ -23,8 +22,11 @@ public class Mock {
public Mock() { public Mock() {
List<Player> players = Arrays.asList(new RandomComputerPlayer(1,null, ClassPlayer.DEFAULT), List<Player> players = Arrays.asList(new RandomComputerPlayer(1,null, ClassPlayer.DEFAULT),
new RandomComputerPlayer(2,null, ClassPlayer.DEFAULT)); new RandomComputerPlayer(2,null, ClassPlayer.DEFAULT));
this.grid = new Grid(16,16, players, 0.80F,0.95F); this.grid = new Grid(16,16, players);
game = new Game(grid, players, new MockViewUpdate(), new GameFinishEvent()); placePlayersBRUT();
placeEnergyBallBRUT();
placeInternWallBRUT();
game = new Game(grid, players, new GameFinishEvent());
} }
public void placePlayersBRUT(){ public void placePlayersBRUT(){

View File

@ -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
}
}