add javadoc to Game.java, delete InterfaceAction (was useless), improved grid factory calls consistency
This commit is contained in:
parent
c856a03621
commit
f7b6f32ae2
@ -51,7 +51,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();
|
||||||
GridFactoryBuilder builder = LockGridFactoryBuilder.create().energyProbability(0.95F).wallProbability(0.80F).playersList(players).gridDimensions(12, 12);
|
GridFactoryBuilder builder = LockGridFactoryBuilder.create().energyProbability(0.95F).wallProbability(0.80F).gridDimensions(12, 12);
|
||||||
game = new Game(builder, players);
|
game = new Game(builder, players);
|
||||||
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)));
|
||||||
|
@ -16,32 +16,40 @@ import static java.util.function.Predicate.not;
|
|||||||
|
|
||||||
public class Game {
|
public class Game {
|
||||||
|
|
||||||
private final GridFactoryBuilder buildStrategy;
|
|
||||||
private final Grid grid;
|
private final Grid grid;
|
||||||
private final List<Player> players;
|
private final List<Player> players;
|
||||||
private Player currentPlayer;
|
private Player currentPlayer;
|
||||||
private Action selectedAction = null;
|
private Action selectedAction = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param buildStrategy used to build a grid
|
||||||
|
* @param players a list players in the game
|
||||||
|
* @throws IllegalArgumentException if number of players given in parameters is too many or inferior to 2
|
||||||
|
*/
|
||||||
public Game(GridFactoryBuilder buildStrategy, List<Player> players) throws IllegalArgumentException {
|
public Game(GridFactoryBuilder buildStrategy, List<Player> players) throws IllegalArgumentException {
|
||||||
this.grid = buildStrategy.build();
|
this.grid = buildStrategy.playersList(players).build();
|
||||||
if(players.size() < 2)
|
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");
|
||||||
if(players.size() > grid.getNumberNeutralBox()){
|
if(players.size() > grid.getNumberNeutralBox()){
|
||||||
throw new IllegalArgumentException("There are too many players for the number of box available");
|
throw new IllegalArgumentException("There are too many players for the number of box available");
|
||||||
}
|
}
|
||||||
this.buildStrategy = buildStrategy;
|
|
||||||
this.players = players;
|
this.players = players;
|
||||||
this.currentPlayer = players.get(0);
|
this.currentPlayer = players.get(0);
|
||||||
initGame();
|
initGame(buildStrategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initGame(){
|
/**
|
||||||
|
* Initialize a game by placing players on the grid and by generating current player available actions
|
||||||
|
* @param buildStrategy builder used to create a grid
|
||||||
|
*/
|
||||||
|
public void initGame(GridFactoryBuilder buildStrategy){
|
||||||
buildStrategy.initPlacePlayers();
|
buildStrategy.initPlacePlayers();
|
||||||
currentPlayer.setActions(generateAndGetPlayerActions(currentPlayer));
|
currentPlayer.setActions(generateAndGetPlayerActions(currentPlayer));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* Game "main" method, call by a controller after human chose an action or when a computer player play an action
|
||||||
|
* Method is call everytime an action has been chosen by a human or when aa computer player need to play
|
||||||
* @return true if game is over, false otherwise
|
* @return true if game is over, false otherwise
|
||||||
*/
|
*/
|
||||||
public boolean play() {
|
public boolean play() {
|
||||||
@ -56,17 +64,28 @@ public class Game {
|
|||||||
return isOver();
|
return isOver();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove dead players from the grid
|
||||||
|
*/
|
||||||
private void gridPlayersUpdate(){
|
private void gridPlayersUpdate(){
|
||||||
for (Player player: getPlayersNotAlive().toList()) {
|
for (Player player: getPlayersNotAlive().toList()) {
|
||||||
getGrid().getBoard().get(player.getPosition()).setA(null);
|
getGrid().getBoard().get(player.getPosition()).setA(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* play grid's elements that use a timer like {@link fr.lnl.game.server.games.grid.elements.Bomb} at each game tick
|
||||||
|
*/
|
||||||
private void countdownGridElementsUpdate() {
|
private void countdownGridElementsUpdate() {
|
||||||
List<CountdownBox> countdownBoxes = this.getGrid().getAllCountdownElements();
|
List<CountdownBox> countdownBoxes = this.getGrid().getAllCountdownElements();
|
||||||
countdownBoxes.forEach(CountdownBox::update);
|
countdownBoxes.forEach(CountdownBox::update);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to list all actions a player can execute at current time
|
||||||
|
* @param player the player to generate actions
|
||||||
|
* @return a list of available actions
|
||||||
|
*/
|
||||||
public 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()) {
|
||||||
@ -87,29 +106,52 @@ public class Game {
|
|||||||
return actions;
|
return actions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return a list of alive players
|
||||||
|
*/
|
||||||
public Stream<Player> getPlayersAlive() {
|
public Stream<Player> getPlayersAlive() {
|
||||||
return players.parallelStream().filter(Player::isAlive);
|
return players.parallelStream().filter(Player::isAlive);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opposite of {@link Game#getPlayersAlive()}
|
||||||
|
* @return a list of dead players
|
||||||
|
*/
|
||||||
public Stream<Player> getPlayersNotAlive() {
|
public Stream<Player> getPlayersNotAlive() {
|
||||||
return players.parallelStream().filter(not(Player::isAlive));
|
return players.parallelStream().filter(not(Player::isAlive));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A game is over if the number of alive players is inferior to 2
|
||||||
|
* @return true if game is over, false otherwise
|
||||||
|
*/
|
||||||
public boolean isOver() {
|
public boolean isOver() {
|
||||||
return getPlayersAlive().count() <= 1;
|
return getPlayersAlive().count() <= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return the winner of the game if exists, null otherwise.<br>
|
||||||
|
* return the only remaining alive player when it exists, or null if everyone is dead, per example when a bomb kill
|
||||||
|
* the 2 remaining players
|
||||||
|
*/
|
||||||
public Player getWinner() {
|
public Player getWinner() {
|
||||||
// On part du principe que isOver est forcément appelé avant d'appeler getWinner
|
// On part du principe que isOver est forcément appelé avant d'appeler getWinner
|
||||||
return getPlayersAlive().findFirst().orElse(null);
|
return getPlayersAlive().findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return the player who is currently playing
|
||||||
|
*/
|
||||||
public Player getCurrentPlayer() {
|
public Player getCurrentPlayer() {
|
||||||
return currentPlayer;
|
return currentPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change player to the next available in the list
|
* Change player to the next available in the list.<br>
|
||||||
|
* We set its shield deploy state to false.
|
||||||
*/
|
*/
|
||||||
public void nextCurrentPlayer() {
|
public void nextCurrentPlayer() {
|
||||||
do {
|
do {
|
||||||
@ -121,6 +163,9 @@ public class Game {
|
|||||||
currentPlayer.setShieldDeploy(false); // on reset son état
|
currentPlayer.setShieldDeploy(false); // on reset son état
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param current_player the new current player
|
||||||
|
*/
|
||||||
public void setCurrentPlayer(Player current_player) {
|
public void setCurrentPlayer(Player current_player) {
|
||||||
this.currentPlayer = current_player;
|
this.currentPlayer = current_player;
|
||||||
}
|
}
|
||||||
@ -133,10 +178,17 @@ public class Game {
|
|||||||
return players;
|
return players;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return action selected by current player if not already executed or last player if already executed
|
||||||
|
*/
|
||||||
public Action getSelectedAction() {
|
public Action getSelectedAction() {
|
||||||
return selectedAction;
|
return selectedAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param selectedAction set the action selected by current player before doing it
|
||||||
|
*/
|
||||||
public void setSelectedAction(Action selectedAction) {
|
public void setSelectedAction(Action selectedAction) {
|
||||||
this.selectedAction = selectedAction;
|
this.selectedAction = selectedAction;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
package fr.lnl.game.server.games;
|
|
||||||
|
|
||||||
public enum InterfaceAction {
|
|
||||||
|
|
||||||
SELECT_ACTION,
|
|
||||||
DIALOG_TO_CONTINUE_COMPUTER_IA
|
|
||||||
|
|
||||||
}
|
|
@ -53,7 +53,8 @@ public interface GridFactoryBuilder {
|
|||||||
Grid build();
|
Grid build();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* call when initializing the game, it'll place player depending on the strategy used by its implementation
|
* call when initializing the game, it'll place player depending on the strategy used by its implementation,
|
||||||
|
* need to be call after build, call an NullPointerException otherwise
|
||||||
*/
|
*/
|
||||||
void initPlacePlayers();
|
void initPlacePlayers();
|
||||||
|
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Game package, contains all classes and sub-packages mainly related game works
|
||||||
|
*/
|
||||||
|
package fr.lnl.game.server.games;
|
@ -14,7 +14,7 @@ public class Mock {
|
|||||||
public Grid grid;
|
public Grid grid;
|
||||||
|
|
||||||
public Mock(List<Player> players) {
|
public Mock(List<Player> players) {
|
||||||
this.buildStrategy = MockGridFactoryBuilder.create().gridDimensions(16, 16).playersList(players).wallProbability(0.80F).energyProbability(0.95F);
|
this.buildStrategy = MockGridFactoryBuilder.create().gridDimensions(16, 16).wallProbability(0.80F).energyProbability(0.95F);
|
||||||
game = new Game(buildStrategy, players);
|
game = new Game(buildStrategy, players);
|
||||||
this.grid = game.getGrid();
|
this.grid = game.getGrid();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user