Checkstyle

This commit is contained in:
Arne Keller 2020-03-17 12:03:19 +01:00
parent 29a36ce1aa
commit 477b45c42b
14 changed files with 90 additions and 61 deletions

View File

@ -2,6 +2,12 @@ package edu.kit.informatik.cardgame;
import edu.kit.informatik.cardgame.ui.CommandLine; import edu.kit.informatik.cardgame.ui.CommandLine;
/**
* Main program class.
*
* @author Arne Keller
* @version 1.0
*/
public final class Main { public final class Main {
/** /**
* Utility class -> private constructor. * Utility class -> private constructor.
@ -13,7 +19,7 @@ public final class Main {
/** /**
* Program entry point. * Program entry point.
* *
* @param args command-line arguments * @param args command-line arguments (will be ignored)
*/ */
public static void main(String[] args) { public static void main(String[] args) {
CommandLine.startInteractive(); CommandLine.startInteractive();

View File

@ -39,6 +39,11 @@ public enum Card implements RequireDice {
*/ */
THUNDERSTORM; THUNDERSTORM;
/**
* Get the category of this card.
*
* @return category of this card
*/
public CardCategory category() { public CardCategory category() {
switch (this) { switch (this) {
case WOOD: case WOOD:
@ -84,6 +89,11 @@ public enum Card implements RequireDice {
} }
} }
/**
* Get the number of cards of this type needed in a stack.
*
* @return amount of cards needed in a card deck
*/
public int requiredAmount() { public int requiredAmount() {
switch (this) { switch (this) {
case WOOD: case WOOD:
@ -101,6 +111,13 @@ public enum Card implements RequireDice {
} }
} }
/**
* Parse a single word and return the card represented by the input.
* Fun fact: Card.parse(card.toString()) == card is true for all cards.
*
* @param input text
* @return card object (null if input invalid)
*/
public static Card parse(String input) { public static Card parse(String input) {
switch (input) { switch (input) {
case "wood": case "wood":

View File

@ -33,11 +33,14 @@ public class CardGame {
* Items built by the player. * Items built by the player.
*/ */
private final List<Item> items = new ArrayList<>(); private final List<Item> items = new ArrayList<>();
private RequireDice requireDice = null;
/** /**
* Current game phase. * Current game phase.
*/ */
private Phase phase = null; private Phase phase;
/**
* Object currently requiring dice roll.
*/
private RequireDice requireDice;
/** /**
* Start a new game with the specified stack of cards. * Start a new game with the specified stack of cards.

View File

@ -2,14 +2,25 @@ package edu.kit.informatik.cardgame.model;
import java.util.Optional; import java.util.Optional;
/**
* Objects of classes implementing this optionally require a dice to be rolled.
*
* @author Arne Keller
* @version 1.0
*/
public interface RequireDice { public interface RequireDice {
/**
* Get the size of the dice needed to activate this object.
*
* @return dice size needed to use this item (empty if dice not required)
*/
Optional<Integer> diceSizeNeeded(); Optional<Integer> diceSizeNeeded();
/** /**
* Get the minimum dice roll needed to activate this object if it needs a dice roll. * Get the minimum dice roll needed to activate this object.
* *
* @return minimum dice roll needed to use this item * @return minimum dice roll needed to use this item (empty if dice not required)
*/ */
Optional<Integer> minimumDiceRollNeeded(); Optional<Integer> minimumDiceRollNeeded();
} }

View File

@ -6,9 +6,6 @@ import edu.kit.informatik.cardgame.ui.command.Command;
import edu.kit.informatik.cardgame.ui.command.CommandFactory; import edu.kit.informatik.cardgame.ui.command.CommandFactory;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
import java.util.StringJoiner;
import java.util.stream.IntStream;
/** /**
* Interactive game runner, gets user inputs and processes commands specified. * Interactive game runner, gets user inputs and processes commands specified.
* *
@ -35,10 +32,11 @@ public final class CommandLine {
// create a new simulation // create a new simulation
CardGame simulation = new CardGame(); CardGame simulation = new CardGame();
boolean lost = false; boolean lost = false;
// accept user input indefinitely
while (true) { while (true) {
String input = Terminal.readLine(); String input = Terminal.readLine();
// handle quit command
if (input.startsWith(QUIT)) { if (input.startsWith(QUIT)) {
if (input.length() != QUIT.length()) { if (input.length() != QUIT.length()) {
Terminal.printError("input after quit command"); Terminal.printError("input after quit command");
@ -49,19 +47,20 @@ public final class CommandLine {
} }
final Command command; final Command command;
// attempt to parse user input
try { try {
command = CommandFactory.getCommand(input); command = CommandFactory.getCommand(input);
} catch (NumberFormatException | InvalidInputException e) { } catch (NumberFormatException | InvalidInputException e) {
Terminal.printError(e.getMessage()); Terminal.printError(e.getMessage());
continue; continue;
} }
// attempt to execute command
try { try {
command.apply(simulation); command.apply(simulation);
} catch (LogicException e) { } catch (LogicException e) {
Terminal.printError(e.getMessage()); Terminal.printError(e.getMessage());
} }
// inform the player if he lost
if (lost != simulation.gameLost() && simulation.gameLost()) { if (lost != simulation.gameLost() && simulation.gameLost()) {
Terminal.printLine("lost"); Terminal.printLine("lost");
} }

View File

@ -9,9 +9,8 @@ import edu.kit.informatik.cardgame.ui.InvalidInputException;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static edu.kit.informatik.cardgame.ui.command.CommandFactory.BUILD;
public final class Build extends Command { public final class Build extends Command {
public static final String NAME = "build";
private static final Pattern BUILD_ARGUMENT = Pattern.compile(" (\\w+)"); private static final Pattern BUILD_ARGUMENT = Pattern.compile(" (\\w+)");
private Item item; private Item item;
@ -28,10 +27,10 @@ public final class Build extends Command {
@Override @Override
public void parse(String input) throws InvalidInputException { public void parse(String input) throws InvalidInputException {
if (input == null || !input.startsWith(BUILD)) { if (input == null || !input.startsWith(NAME)) {
throw new InvalidInputException("unknown command"); throw new InvalidInputException("unknown command");
} }
final Matcher matcher = Build.BUILD_ARGUMENT.matcher(input.substring(BUILD.length())); final Matcher matcher = Build.BUILD_ARGUMENT.matcher(input.substring(NAME.length()));
if (!matcher.matches()) { if (!matcher.matches()) {
throw new InvalidInputException("invalid build command"); throw new InvalidInputException("invalid build command");
} }

View File

@ -9,9 +9,9 @@ import edu.kit.informatik.cardgame.ui.InvalidInputException;
import java.util.Comparator; import java.util.Comparator;
import java.util.Set; import java.util.Set;
import static edu.kit.informatik.cardgame.ui.command.CommandFactory.BUILDABLE;
public final class Buildable extends Command { public final class Buildable extends Command {
public static final String NAME = "build?";
@Override @Override
public void apply(CardGame game) throws LogicException { public void apply(CardGame game) throws LogicException {
final Set<Item> buildable = game.getBuildableItems(); final Set<Item> buildable = game.getBuildableItems();
@ -24,10 +24,10 @@ public final class Buildable extends Command {
@Override @Override
public void parse(String input) throws InvalidInputException { public void parse(String input) throws InvalidInputException {
if (input == null || !input.startsWith(BUILDABLE)) { if (input == null || !input.startsWith(NAME)) {
throw new InvalidInputException("unknown command"); throw new InvalidInputException("unknown command");
} }
if (!input.equals(BUILDABLE)) { if (!input.equals(NAME)) {
throw new InvalidInputException("invalid build? argument: none expected"); throw new InvalidInputException("invalid build? argument: none expected");
} }
} }

View File

@ -2,7 +2,6 @@ package edu.kit.informatik.cardgame.ui.command;
import edu.kit.informatik.cardgame.ui.InvalidInputException; import edu.kit.informatik.cardgame.ui.InvalidInputException;
import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -10,30 +9,24 @@ import java.util.function.Supplier;
* Factory used to parse user input into commands. * Factory used to parse user input into commands.
* *
* @author Arne Keller * @author Arne Keller
* @version 1.1 * @version 1.2
*/ */
public final class CommandFactory { public final class CommandFactory {
public static final String START = "start"; /**
public static final String DRAW = "draw"; * Collection of command suppliers keyed by their respective command name.
public static final String LIST_RESOURCES = "list-resources"; */
public static final String BUILD = "build";
public static final String LIST_BUILDINGS = "list-buildings";
public static final String BUILDABLE = "build?";
public static final String ROLL_DICE = "rollD";
public static final String RESET = "reset";
private static final TreeMap<String, Supplier<Command>> COMMANDS = new TreeMap<>(); private static final TreeMap<String, Supplier<Command>> COMMANDS = new TreeMap<>();
static { static {
// initialize registered commands // initialize registered commands
COMMANDS.put(START, Start::new); COMMANDS.put(Start.NAME, Start::new);
COMMANDS.put(DRAW, Draw::new); COMMANDS.put(Draw.NAME, Draw::new);
COMMANDS.put(LIST_RESOURCES, ListResources::new); COMMANDS.put(ListResources.NAME, ListResources::new);
COMMANDS.put(BUILD, Build::new); COMMANDS.put(Build.NAME, Build::new);
COMMANDS.put(LIST_BUILDINGS, ListBuildings::new); COMMANDS.put(ListBuildings.NAME, ListBuildings::new);
COMMANDS.put(BUILDABLE, Buildable::new); COMMANDS.put(Buildable.NAME, Buildable::new);
COMMANDS.put(ROLL_DICE, RollDice::new); COMMANDS.put(RollDice.NAME, RollDice::new);
COMMANDS.put(RESET, Reset::new); COMMANDS.put(Reset.NAME, Reset::new);
} }
/** /**
@ -50,13 +43,14 @@ public final class CommandFactory {
* @throws InvalidInputException if user input is invalid * @throws InvalidInputException if user input is invalid
*/ */
public static Command getCommand(String input) throws InvalidInputException { public static Command getCommand(String input) throws InvalidInputException {
Supplier<Command> commandSupplier = COMMANDS final Supplier<Command> commandSupplier = COMMANDS
// match longest prefix
.descendingKeySet().stream() .descendingKeySet().stream()
.filter(input::startsWith) .filter(input::startsWith)
.map(COMMANDS::get) .map(COMMANDS::get)
.findFirst().orElse(null); .findFirst().orElse(null);
if (commandSupplier != null) { if (commandSupplier != null) {
Command command = commandSupplier.get(); final Command command = commandSupplier.get();
command.parse(input); command.parse(input);
return command; return command;
} else { } else {

View File

@ -5,9 +5,9 @@ import edu.kit.informatik.cardgame.model.CardGame;
import edu.kit.informatik.cardgame.model.LogicException; import edu.kit.informatik.cardgame.model.LogicException;
import edu.kit.informatik.cardgame.ui.InvalidInputException; import edu.kit.informatik.cardgame.ui.InvalidInputException;
import static edu.kit.informatik.cardgame.ui.command.CommandFactory.DRAW;
public final class Draw extends Command { public final class Draw extends Command {
public static final String NAME = "draw";
@Override @Override
public void apply(CardGame game) throws LogicException { public void apply(CardGame game) throws LogicException {
Terminal.printLine(game.draw()); Terminal.printLine(game.draw());
@ -15,10 +15,10 @@ public final class Draw extends Command {
@Override @Override
public void parse(String input) throws InvalidInputException { public void parse(String input) throws InvalidInputException {
if (input == null || !input.startsWith(DRAW)) { if (input == null || !input.startsWith(NAME)) {
throw new InvalidInputException("unknown command"); throw new InvalidInputException("unknown command");
} }
if (!input.equals(DRAW)) { if (!input.equals(NAME)) {
throw new InvalidInputException("invalid draw argument: none expected"); throw new InvalidInputException("invalid draw argument: none expected");
} }
} }

View File

@ -8,9 +8,9 @@ import edu.kit.informatik.cardgame.ui.InvalidInputException;
import java.util.List; import java.util.List;
import static edu.kit.informatik.cardgame.ui.command.CommandFactory.LIST_BUILDINGS;
public final class ListBuildings extends Command { public final class ListBuildings extends Command {
public static final String NAME = "list-buildings";
@Override @Override
public void apply(CardGame game) throws LogicException { public void apply(CardGame game) throws LogicException {
List<Item> items = game.getItems(); List<Item> items = game.getItems();
@ -25,10 +25,10 @@ public final class ListBuildings extends Command {
@Override @Override
public void parse(String input) throws InvalidInputException { public void parse(String input) throws InvalidInputException {
if (input == null || !input.startsWith(LIST_BUILDINGS)) { if (input == null || !input.startsWith(NAME)) {
throw new InvalidInputException("unknown command"); throw new InvalidInputException("unknown command");
} }
if (!input.equals(LIST_BUILDINGS)) { if (!input.equals(NAME)) {
throw new InvalidInputException("invalid list-buildings argument: none expected"); throw new InvalidInputException("invalid list-buildings argument: none expected");
} }
} }

View File

@ -8,9 +8,9 @@ import edu.kit.informatik.cardgame.ui.InvalidInputException;
import java.util.Deque; import java.util.Deque;
import static edu.kit.informatik.cardgame.ui.command.CommandFactory.LIST_RESOURCES;
public final class ListResources extends Command { public final class ListResources extends Command {
public static final String NAME = "list-resources";
@Override @Override
public void apply(CardGame game) throws LogicException { public void apply(CardGame game) throws LogicException {
Deque<Card> resources = game.getResources(); Deque<Card> resources = game.getResources();
@ -23,10 +23,10 @@ public final class ListResources extends Command {
@Override @Override
public void parse(String input) throws InvalidInputException { public void parse(String input) throws InvalidInputException {
if (input == null || !input.startsWith(LIST_RESOURCES)) { if (input == null || !input.startsWith(NAME)) {
throw new InvalidInputException("unknown command"); throw new InvalidInputException("unknown command");
} }
if (!input.equals(LIST_RESOURCES)) { if (!input.equals(NAME)) {
throw new InvalidInputException("invalid list-resources argument: none expected"); throw new InvalidInputException("invalid list-resources argument: none expected");
} }
} }

View File

@ -5,9 +5,9 @@ import edu.kit.informatik.cardgame.model.CardGame;
import edu.kit.informatik.cardgame.model.LogicException; import edu.kit.informatik.cardgame.model.LogicException;
import edu.kit.informatik.cardgame.ui.InvalidInputException; import edu.kit.informatik.cardgame.ui.InvalidInputException;
import static edu.kit.informatik.cardgame.ui.command.CommandFactory.RESET;
public final class Reset extends Command { public final class Reset extends Command {
public static final String NAME = "reset";
@Override @Override
public void apply(CardGame game) throws LogicException { public void apply(CardGame game) throws LogicException {
game.reset(); game.reset();
@ -16,10 +16,10 @@ public final class Reset extends Command {
@Override @Override
public void parse(String input) throws InvalidInputException { public void parse(String input) throws InvalidInputException {
if (input == null || !input.startsWith(RESET)) { if (input == null || !input.startsWith(NAME)) {
throw new InvalidInputException("unknown command"); throw new InvalidInputException("unknown command");
} }
if (!input.equals(RESET)) { if (!input.equals(NAME)) {
throw new InvalidInputException("invalid reset argument: none expected"); throw new InvalidInputException("invalid reset argument: none expected");
} }
} }

View File

@ -8,10 +8,9 @@ import edu.kit.informatik.cardgame.ui.InvalidInputException;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static edu.kit.informatik.cardgame.ui.command.CommandFactory.ROLL_DICE;
public final class RollDice extends Command { public final class RollDice extends Command {
private static final Pattern ROLL_DICE_ARGUMENTS = Pattern.compile(ROLL_DICE + "\\+?(\\d+) \\+?(\\d+)"); public static final String NAME = "rollD";
private static final Pattern ROLL_DICE_ARGUMENTS = Pattern.compile(NAME + "\\+?(\\d+) \\+?(\\d+)");
private int size; private int size;
@ -24,7 +23,7 @@ public final class RollDice extends Command {
@Override @Override
public void parse(String input) throws InvalidInputException { public void parse(String input) throws InvalidInputException {
if (input == null || !input.startsWith(ROLL_DICE)) { if (input == null || !input.startsWith(NAME)) {
throw new InvalidInputException("unknown command"); throw new InvalidInputException("unknown command");
} }
final Matcher matcher = ROLL_DICE_ARGUMENTS.matcher(input); final Matcher matcher = ROLL_DICE_ARGUMENTS.matcher(input);

View File

@ -12,6 +12,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public final class Start extends Command { public final class Start extends Command {
public static final String NAME = "start";
private static final Pattern START_ARGUMENTS = Pattern.compile("start ((\\w+,){63}(\\w+))"); private static final Pattern START_ARGUMENTS = Pattern.compile("start ((\\w+,){63}(\\w+))");
private Deque<Card> cards; private Deque<Card> cards;
@ -27,7 +28,7 @@ public final class Start extends Command {
@Override @Override
public void parse(String input) throws InvalidInputException { public void parse(String input) throws InvalidInputException {
if (input == null || !input.startsWith(CommandFactory.START)) { if (input == null || !input.startsWith(NAME)) {
throw new InvalidInputException("unknown command"); throw new InvalidInputException("unknown command");
} }
final Matcher matcher = START_ARGUMENTS.matcher(input); final Matcher matcher = START_ARGUMENTS.matcher(input);