diff --git a/src/cards/Card.java b/src/cards/Card.java index 561feb4..f652bb2 100644 --- a/src/cards/Card.java +++ b/src/cards/Card.java @@ -23,7 +23,12 @@ public record Card(Rank rank, Suit suit) implements Comparable { */ @Override public int compareTo(Card other) { - //TODO implement - return 0; + int rankcomparison = rank.compareTo(other.rank); + + if (rankcomparison != 0) { + return rankcomparison; + } else { + return suit.compareTo(other.suit); + } } } diff --git a/src/cards/Rank.java b/src/cards/Rank.java index ba0fe06..23dbef3 100644 --- a/src/cards/Rank.java +++ b/src/cards/Rank.java @@ -13,7 +13,35 @@ public enum Rank { */ @Override public String toString() { - //TODO implement - return super.toString(); + switch (this) { + case TWO: + return "2"; + case THREE: + return "3"; + case FOUR: + return "4"; + case FIVE: + return "5"; + case SIX: + return "6"; + case SEVEN: + return "7"; + case EIGHT: + return "8"; + case NINE: + return "9"; + case TEN: + return "10"; + case JACK: + return "J"; + case QUEEN: + return "Q"; + case KING: + return "K"; + case ACE: + return "A"; + default: + return ""; + } } } diff --git a/src/cards/Suit.java b/src/cards/Suit.java index 333688d..bcd5ba4 100644 --- a/src/cards/Suit.java +++ b/src/cards/Suit.java @@ -28,7 +28,17 @@ public enum Suit { */ @Override public String toString() { - //TODO implement - return super.toString(); + switch (this) { + case HEARTS: + return "♥︎"; + case DIAMONDS: + return "♦︎"; + case CLUBS: + return "♣︎"; + case SPADES: + return "♠︎"; + default: + return ""; + } } } diff --git a/src/cards/maumau/MauMauDeck.java b/src/cards/maumau/MauMauDeck.java index 9595b17..50dd9b5 100644 --- a/src/cards/maumau/MauMauDeck.java +++ b/src/cards/maumau/MauMauDeck.java @@ -1,7 +1,10 @@ package cards.maumau; import cards.Card; +import cards.Rank; +import cards.Suit; +import java.util.Collections; import java.util.List; /** @@ -20,7 +23,20 @@ public class MauMauDeck { * @return A list containing the generated deck of cards. */ public static List makeDeck(int numDecks) { - //TODO implement - return null; + List deck = List.of(); + + for(int i = 0; i < numDecks; i++){ + for(Rank rank : Rank.values()) { + for(Suit suit : Suit.values()) { + if(rank != Rank.TWO && rank != Rank.THREE && rank != Rank.FOUR && rank != Rank.FIVE && rank != Rank.SIX) { + deck.add(new Card(rank,suit)); + } + } + } + } + + Collections.shuffle(deck); + + return deck; } } diff --git a/src/cards/maumau/model/CardHandler.java b/src/cards/maumau/model/CardHandler.java index c69a174..e80d9dc 100644 --- a/src/cards/maumau/model/CardHandler.java +++ b/src/cards/maumau/model/CardHandler.java @@ -73,7 +73,11 @@ class CardHandler { * Deals cards to all players. */ void dealCards() { - //TODO implement + for (Player player : game.getPlayerHandler().getPlayers()) { + for (int i = 0; i < numCardsPerPlayer; i++) { + player.getCards().add(drawCard()); + } + } } /** diff --git a/src/cards/maumau/model/PlayerHandler.java b/src/cards/maumau/model/PlayerHandler.java index 8a145c7..b1f04b4 100644 --- a/src/cards/maumau/model/PlayerHandler.java +++ b/src/cards/maumau/model/PlayerHandler.java @@ -13,6 +13,117 @@ class PlayerHandler { private final List ranking = new ArrayList<>(); private Player remember; + private interface PlayerState { + void nextTurn(int n); + void mau(Player p); + void maumau(Player p); + }; + + private final PlayerState waitForNextTurnState = new PlayerState() { + + @Override + public void nextTurn(int n) { + decide(n); + } + + @Override + public void mau(Player p) { + //Do nothing + } + + @Override + public void maumau(Player p) { + // Do nothing + } + + }; + + private final PlayerState waitForMauState = new PlayerState() { + + @Override + public void nextTurn(int n) { + remember.drawCards(1); + decide(n); + } + + @Override + public void mau(Player p) { + if (p == remember) { + currentState = waitForNextTurnState; + } + } + + @Override + public void maumau(Player p) { + //Do nothing + } + + }; + + private final PlayerState waitForMauMauState = new PlayerState() { + + @Override + public void nextTurn(int n) { + remember.drawCards(1); + decide(n); + } + + @Override + public void mau(Player p) { + //Do nothing + } + + @Override + public void maumau(Player p) { + if (p == remember) { + finishPlayer(p); + } + if (players.size() == 1) { + finishPlayer(getCurrentPlayer()); + game.getActionHandler().finishGame(); + currentState = finishedState; + } else { + currentState = waitForNextTurnState; + } + } + + }; + + private final PlayerState finishedState = new PlayerState() { + + @Override + public void nextTurn(int n) { + //Do nothing + } + + @Override + public void mau(Player p) { + // Do nothing + } + + @Override + public void maumau(Player p) { + // Do nothing + } + + }; + + private void decide(int n) { + if (getCurrentPlayer().getCards().isEmpty()) { + remember = getCurrentPlayer(); + localNextTurn(n); + currentState = waitForMauMauState; + } else if (getCurrentPlayer().getCards().size() == 1) { + remember = getCurrentPlayer(); + localNextTurn(n); + currentState = waitForMauState; + } else { + localNextTurn(n); + } + } + + private PlayerState currentState = waitForNextTurnState; + /** * Constructs a PlayerHandler for the specified MauMau game. * @@ -28,7 +139,7 @@ class PlayerHandler { * @param n The number of turns to proceed. */ void nextTurn(int n) { - //TODO implement + currentState.nextTurn(n); } /** @@ -37,7 +148,7 @@ class PlayerHandler { * @param p The player calling "Mau". */ void mau(Player p) { - //TODO implement + currentState.mau(p); } /** @@ -46,7 +157,7 @@ class PlayerHandler { * @param p The player calling "Mau-Mau". */ void maumau(Player p) { - //TODO implement + currentState.maumau(p); } /** @@ -74,7 +185,10 @@ class PlayerHandler { * @throws IllegalArgumentException if a player with the same name already exists. */ void addPlayer(Player player) { - //TODO implement + if (!players.contains(player)) { + throw new IllegalArgumentException("Player with name " + player.getName() + " already exists."); + } + players.add(player); } /** @@ -83,7 +197,9 @@ class PlayerHandler { * @param n The number of turns to proceed. */ private void localNextTurn(int n) { - //TODO implement + for (int i = 0; i < n; i++) { + players.addLast(players.removeFirst()); + } } /** @@ -92,7 +208,7 @@ class PlayerHandler { * @param p The player to finish. */ private void finishPlayer(Player p) { - //TODO implement + ranking.addLast(players.removeLast()); } /**