Skip to content

Commit

Permalink
moved GameSettings to proper interface
Browse files Browse the repository at this point in the history
  • Loading branch information
Triikk committed Feb 18, 2024
1 parent cd39e03 commit fac3379
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 95 deletions.
98 changes: 3 additions & 95 deletions src/main/java/it/unibo/model/GameManagerImpl.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
package it.unibo.model;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.Random;
import java.util.stream.Stream;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import it.unibo.common.Recipes;
import it.unibo.common.card.CardType;
Expand All @@ -25,9 +20,6 @@
import it.unibo.model.board.BoardImpl;
import it.unibo.model.developmentcard.DevelopmentCards;
import it.unibo.model.developmentcard.DevelopmentCardsImpl;
import it.unibo.model.mapgenerator.BeginnerGameMapGenerator;
import it.unibo.model.mapgenerator.GameMapGenerator;
import it.unibo.model.mapgenerator.RandomGameMapGenerator;
import it.unibo.model.player.Player;
import it.unibo.model.player.PlayerImpl;
import it.unibo.model.property.Property;
Expand Down Expand Up @@ -67,10 +59,10 @@ public GameManagerImpl(final List<String> playersNames) {
this.propertyManager = new PropertyManagerImpl();
this.resourceManager = new ResourceManagerImpl(players);

final GameSettings settings = new GameSettings("settings/settings.json");
this.pointsToWin = settings.getPoints();
final GameSettings settings = new GameSettingsJSON("settings/settings.json");
this.pointsToWin = settings.getPointsToWin();
this.turnManager = new TurnManagerImpl(players, settings.isRandomOrder());
this.board = new BoardImpl(settings.getMapGenerator());
this.board = new BoardImpl(settings.getGameMapGenerator());
}

@Override
Expand Down Expand Up @@ -338,88 +330,4 @@ private boolean isRoadNearToAnyPlayerProperty(final RoadPosition roadPosition, f
.anyMatch(roadPosition::isNearToProperty);
}

/**
* Class which represents the settings of the game customized by players, which
* are the amount of points necessary to win, the type of map to play with and
* whether the randomize the order of players.
*/
private static final class GameSettings {

private enum MapType {
/**
* @see BeginnerGameMapGenerator
*/
BEGINNER,
/**
* @see RandomGameMapGenerator
*/
RANDOM
}

private static final Map<String, MapType> FIELD_TO_MAP_TYPE = Map.of(
"random", MapType.RANDOM, "beginner", MapType.BEGINNER);
private static final String DEFAULT_MAP_FIELD = "random";
private static final MapType DEFAULT_MAP_TYPE = MapType.RANDOM;
private static final boolean DEFAULT_RANDOM_ORDER = true;
private static final int DEFAULT_POINTS = 10;

private int points = DEFAULT_POINTS;
private MapType mapType = DEFAULT_MAP_TYPE;
private boolean randomOrder = DEFAULT_RANDOM_ORDER;

/**
* Game settings constructor.
*
* @param settingsPath path of settings file in CLASSPATH
*/
@SuppressWarnings({ "PMD.EmptyCatchBlock" }) // default values are already set
private GameSettings(final String settingsPath) {
try {
final ObjectMapper objectMapper = new ObjectMapper();
final JsonNode settings = objectMapper.readTree(ClassLoader.getSystemResourceAsStream(settingsPath));
final String mapFieldName = "map";
final String pointsFieldName = "points";
final String shuffleFieldName = "shuffle";
setMapType(Optional.ofNullable(settings.get(mapFieldName)));
setPoints(Optional.ofNullable(settings.get(pointsFieldName)));
setShuffle(Optional.ofNullable(settings.get(shuffleFieldName)));
} catch (IOException | IllegalArgumentException e) {
}
}

private int getPoints() {
return points;
}

private GameMapGenerator getMapGenerator() {
return switch (mapType) {
case BEGINNER -> new BeginnerGameMapGenerator();
default -> new RandomGameMapGenerator();
};
}

private boolean isRandomOrder() {
return randomOrder;
}

private void setMapType(final Optional<JsonNode> selectedMap) {
if (selectedMap.isPresent()) {
mapType = FIELD_TO_MAP_TYPE.getOrDefault(
selectedMap.get().asText(DEFAULT_MAP_FIELD).toLowerCase(Locale.US),
DEFAULT_MAP_TYPE);
}
}

private void setPoints(final Optional<JsonNode> selectedPoints) {
if (selectedPoints.isPresent()) {
points = selectedPoints.get().asInt(DEFAULT_POINTS);
}
}

private void setShuffle(final Optional<JsonNode> selectedShuffle) {
if (selectedShuffle.isPresent()) {
randomOrder = selectedShuffle.get().asBoolean(DEFAULT_RANDOM_ORDER);
}
}
}
}
25 changes: 25 additions & 0 deletions src/main/java/it/unibo/model/GameSettings.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package it.unibo.model;

import it.unibo.model.mapgenerator.GameMapGenerator;

/**
* Interface which represents customizable game settings.
*/
public interface GameSettings {

/**
* @return the amount of points to win
*/
int getPointsToWin();

/**
* @return whether to randomize players' order
*/
boolean isRandomOrder();

/**
* @return the generator used to generate the game map
*/
GameMapGenerator getGameMapGenerator();

}
100 changes: 100 additions & 0 deletions src/main/java/it/unibo/model/GameSettingsJSON.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package it.unibo.model;

import java.io.IOException;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import it.unibo.model.mapgenerator.BeginnerGameMapGenerator;
import it.unibo.model.mapgenerator.GameMapGenerator;
import it.unibo.model.mapgenerator.RandomGameMapGenerator;

/**
* Implementation of Game settings through a JSON file.
*/
public final class GameSettingsJSON implements GameSettings {

private enum MapType {
/**
* @see BeginnerGameMapGenerator
*/
BEGINNER,
/**
* @see RandomGameMapGenerator
*/
RANDOM
}

private static final Map<String, MapType> FIELD_TO_MAP_TYPE = Map.of(
"random", MapType.RANDOM,
"beginner", MapType.BEGINNER);
private static final String DEFAULT_MAP_FIELD = "random";
private static final MapType DEFAULT_MAP_TYPE = MapType.RANDOM;
private static final boolean DEFAULT_RANDOM_ORDER = true;
private static final int DEFAULT_POINTS_TO_WIN = 10;
private int pointsToWin = DEFAULT_POINTS_TO_WIN;
private MapType mapType = DEFAULT_MAP_TYPE;
private boolean randomOrder = DEFAULT_RANDOM_ORDER;

/**
* Game settings constructor.
*
* @param filePath path of settings file in CLASSPATH
*/
@SuppressWarnings({ "PMD.EmptyCatchBlock" }) // default values are already set
public GameSettingsJSON(final String filePath) {
try {
final ObjectMapper objectMapper = new ObjectMapper();
final JsonNode settings = objectMapper.readTree(ClassLoader.getSystemResourceAsStream(filePath));
final String mapFieldName = "map";
final String pointsFieldName = "points";
final String shuffleFieldName = "shuffle";
setMapType(Optional.ofNullable(settings.get(mapFieldName)));
setPoints(Optional.ofNullable(settings.get(pointsFieldName)));
setRandomOrder(Optional.ofNullable(settings.get(shuffleFieldName)));
} catch (final IOException | IllegalArgumentException e) {
}
}

@Override
public int getPointsToWin() {
return pointsToWin;
}

@Override
public GameMapGenerator getGameMapGenerator() {
return switch (mapType) {
case BEGINNER -> new BeginnerGameMapGenerator();
default -> new RandomGameMapGenerator();
};
}

@Override
public boolean isRandomOrder() {
return randomOrder;
}

private void setMapType(final Optional<JsonNode> selectedMap) {
if (selectedMap.isPresent()) {
mapType = FIELD_TO_MAP_TYPE.getOrDefault(
selectedMap.get().asText(DEFAULT_MAP_FIELD).toLowerCase(Locale.US),
DEFAULT_MAP_TYPE);
}
}

private void setPoints(final Optional<JsonNode> selectedPoints) {
if (selectedPoints.isPresent()) {
pointsToWin = selectedPoints.get().asInt(DEFAULT_POINTS_TO_WIN);
}
}

private void setRandomOrder(final Optional<JsonNode> selectedRandomOrder) {
if (selectedRandomOrder.isPresent()) {
randomOrder = selectedRandomOrder.get().asBoolean(DEFAULT_RANDOM_ORDER);
}
}

}

0 comments on commit fac3379

Please sign in to comment.