Refactor card stack into own class

This commit is contained in:
Arne Keller 2020-03-17 12:48:28 +01:00
parent 44412a6d09
commit 7a09111164
2 changed files with 46 additions and 12 deletions

View File

@ -18,13 +18,9 @@ import java.util.stream.Collectors;
*/ */
public class CardGame { public class CardGame {
/** /**
* Copy of the card stack used to start the game. * Card stack used.
*/ */
private Deque<Card> cardStack; private CardStack cardStack;
/**
* Currently active card stack.
*/
private Deque<Card> currentCardStack;
/** /**
* Resources collected by the player. Obviously only contains {@link CardCategory#RESOURCE resource} cards. * Resources collected by the player. Obviously only contains {@link CardCategory#RESOURCE resource} cards.
*/ */
@ -57,7 +53,7 @@ public class CardGame {
.allMatch(card -> Collections.frequency(cardStack, card) == card.requiredAmount())) { .allMatch(card -> Collections.frequency(cardStack, card) == card.requiredAmount())) {
throw new LogicException("invalid deck: missing or surplus cards"); throw new LogicException("invalid deck: missing or surplus cards");
} }
this.cardStack = new ArrayDeque<>(cardStack); this.cardStack = new CardStack(cardStack);
reset(); reset();
return true; return true;
} }
@ -70,12 +66,12 @@ public class CardGame {
* @throws LogicException if no card to draw exists or phase is not scavenge * @throws LogicException if no card to draw exists or phase is not scavenge
*/ */
public Card draw() throws LogicException { public Card draw() throws LogicException {
if (currentCardStack == null || currentCardStack.isEmpty()) { if (cardStack == null) {
throw new LogicException("no card to draw exists"); throw new LogicException("no card to draw exists");
} else if (phase != Phase.SCAVENGE) { } else if (phase != Phase.SCAVENGE) {
throw new LogicException("can only draw cards in scavenge phase"); throw new LogicException("can only draw cards in scavenge phase");
} }
final Card card = currentCardStack.removeFirst(); final Card card = cardStack.draw().orElseThrow(() -> new LogicException("no card to draw exists"));
switch (card.category()) { switch (card.category()) {
case RESOURCE: case RESOURCE:
resources.add(card); resources.add(card);
@ -245,7 +241,7 @@ public class CardGame {
*/ */
private void checkLost() { private void checkLost() {
// can not draw new cards // can not draw new cards
if (currentCardStack != null && currentCardStack.isEmpty() if (cardStack != null && cardStack.isEmpty()
// can not roll dice // can not roll dice
&& phase != Phase.ENCOUNTER && phase != Phase.ENDEAVOR && phase != Phase.ENCOUNTER && phase != Phase.ENDEAVOR
// can not build item // can not build item
@ -312,7 +308,7 @@ public class CardGame {
* End the current game, deleting the active card stack. * End the current game, deleting the active card stack.
*/ */
private void endGame() { private void endGame() {
currentCardStack = null; cardStack.clearActiveStack();
} }
/** /**
@ -324,7 +320,7 @@ public class CardGame {
if (cardStack == null) { if (cardStack == null) {
throw new LogicException("can not reset a game that is not started!"); throw new LogicException("can not reset a game that is not started!");
} else { } else {
this.currentCardStack = new ArrayDeque<>(cardStack); this.cardStack.reset();
} }
this.resources.clear(); this.resources.clear();
this.items.clear(); this.items.clear();

View File

@ -0,0 +1,38 @@
package edu.kit.informatik.cardgame.model;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Optional;
public class CardStack {
/**
* Copy of the card stack used to initialize the stack.
*/
private final Deque<Card> stack;
/**
* Currently active card stack.
*/
private Deque<Card> activeStack;
public CardStack(Deque<Card> cards) {
// copy stack to avoid modifications
this.stack = new ArrayDeque<>(cards);
reset();
}
public Optional<Card> draw() {
return Optional.ofNullable(activeStack.pollFirst());
}
public void clearActiveStack() {
activeStack.clear();
}
public void reset() {
activeStack = new ArrayDeque<>(stack);
}
public boolean isEmpty() {
return activeStack.isEmpty();
}
}