From 178dccebfb0f5e9e290b8af62d5a1af685f921da Mon Sep 17 00:00:00 2001 From: Tringapps-Dharshan <102800724+Tringapps-Dharshan@users.noreply.github.com> Date: Mon, 18 Apr 2022 10:02:55 +0530 Subject: [PATCH] Add files via upload --- README.md | 5 + crazy-cardgame.iml | 19 +++ pom.xml | 50 ++++++++ src/main/java/cardgame/Card.java | 112 +++++++++++++++++ src/main/java/cardgame/Play.java | 109 +++++++++++++++++ src/main/java/cardgame/Player1.java | 107 +++++++++++++++++ src/main/java/cardgame/Player2.java | 109 +++++++++++++++++ src/main/java/cardgame/PlayerStrategy.java | 109 +++++++++++++++++ src/main/java/cardgame/PlayerTurn.java | 59 +++++++++ src/test/java/cardgame/CardTest.java | 119 +++++++++++++++++++ target/classes/cardgame/Card$Rank.class | Bin 0 -> 1579 bytes target/classes/cardgame/Card$Suit.class | Bin 0 -> 1098 bytes target/classes/cardgame/Card.class | Bin 0 -> 2422 bytes target/classes/cardgame/Play.class | Bin 0 -> 4332 bytes target/classes/cardgame/Player1.class | Bin 0 -> 3794 bytes target/classes/cardgame/Player2.class | Bin 0 -> 3812 bytes target/classes/cardgame/PlayerStrategy.class | Bin 0 -> 728 bytes target/classes/cardgame/PlayerTurn.class | Bin 0 -> 1217 bytes target/test-classes/cardgame/CardTest.class | Bin 0 -> 3839 bytes 19 files changed, 798 insertions(+) create mode 100644 README.md create mode 100644 crazy-cardgame.iml create mode 100644 pom.xml create mode 100644 src/main/java/cardgame/Card.java create mode 100644 src/main/java/cardgame/Play.java create mode 100644 src/main/java/cardgame/Player1.java create mode 100644 src/main/java/cardgame/Player2.java create mode 100644 src/main/java/cardgame/PlayerStrategy.java create mode 100644 src/main/java/cardgame/PlayerTurn.java create mode 100644 src/test/java/cardgame/CardTest.java create mode 100644 target/classes/cardgame/Card$Rank.class create mode 100644 target/classes/cardgame/Card$Suit.class create mode 100644 target/classes/cardgame/Card.class create mode 100644 target/classes/cardgame/Play.class create mode 100644 target/classes/cardgame/Player1.class create mode 100644 target/classes/cardgame/Player2.class create mode 100644 target/classes/cardgame/PlayerStrategy.class create mode 100644 target/classes/cardgame/PlayerTurn.class create mode 100644 target/test-classes/cardgame/CardTest.class diff --git a/README.md b/README.md new file mode 100644 index 0000000..fcc2ea0 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Crazy Card Game + +Assignment documentation is here: https://courses.grainger.illinois.edu/cs126/fa2019/assignments/crazy-cardgame/ + +Good luck! diff --git a/crazy-cardgame.iml b/crazy-cardgame.iml new file mode 100644 index 0000000..7350b04 --- /dev/null +++ b/crazy-cardgame.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4feed12 --- /dev/null +++ b/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + uiuc126 + crazy-cardgame + 1.0-SNAPSHOT + + + + com.google.code.gson + gson + 2.8.5 + + + + commons-io + commons-io + 2.6 + + + junit + junit + 4.12 + test + + + + com.github.stefanbirkner + system-rules + 1.19.0 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + \ No newline at end of file diff --git a/src/main/java/cardgame/Card.java b/src/main/java/cardgame/Card.java new file mode 100644 index 0000000..35d8888 --- /dev/null +++ b/src/main/java/cardgame/Card.java @@ -0,0 +1,112 @@ +package cardgame; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.Objects; + +/* + * ======================================== + * You should not need to modify this file. + * ======================================== + */ + +/** + * Represents a standard playing card from a 52 card deck. + */ +public class Card { + + public enum Suit {DIAMONDS, HEARTS, SPADES, CLUBS} + + public enum Rank { + ACE, + TWO, + THREE, + FOUR, + FIVE, + SIX, + SEVEN, + EIGHT, + NINE, + TEN, + JACK, + QUEEN, + KING + } + + private static final int FACE_CARD_VALUE = 10; + private static final int EIGHT_CARD_VALUE = 50; + + private static final int DECK_SIZE = Suit.values().length * Rank.values().length; + + private Suit suit; + private Rank rank; + + public Card(Suit suit, Rank rank) { + this.suit = suit; + this.rank = rank; + } + + public Suit getSuit() { + return suit; + } + + public Rank getRank() { + return rank; + } + + /** + * Returns the Crazy8s point value for this card. + * + * @return An integer representing this card's point value + */ + public int getPointValue() { + if (rank.ordinal() >= Rank.JACK.ordinal()) { + return FACE_CARD_VALUE; + } + + if (rank == Rank.EIGHT) { + return EIGHT_CARD_VALUE; + } + + // Otherwise, return numeric value of card + return rank.ordinal() + 1; + } + + /** + * Creates a new, unshuffled deck of standard playing cards. + * + * @return A list representing an unshuffled deck of cards + */ + public static List getDeck() { + List cardDeck = new ArrayList<>(DECK_SIZE); + + for (Suit suit : EnumSet.allOf(Suit.class)) { + for (Rank rank : EnumSet.allOf(Rank.class)) { + cardDeck.add(new Card(suit, rank)); + } + } + + return cardDeck; + } + + // Convenience methods; you might or might not need these. + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Card card = (Card) o; + return suit == card.suit && + rank == card.rank; + } + + @Override + public int hashCode() { + return Objects.hash(suit, rank); + } +} diff --git a/src/main/java/cardgame/Play.java b/src/main/java/cardgame/Play.java new file mode 100644 index 0000000..a2bce05 --- /dev/null +++ b/src/main/java/cardgame/Play.java @@ -0,0 +1,109 @@ +package cardgame; + +import java.util.*; + +import cardgame.Card.Rank; + +public class Play { + public static void main(String[] args) { + Play o = new Play(); + Player1 dharshan = new Player1(); + Player2 sherin = new Player2(); + List deck = new ArrayList<>(); + deck = Card.getDeck(); + Collections.shuffle(deck); + deck = o.start(deck, dharshan, sherin); + o.play(deck, dharshan, sherin); + } + + List start(List deck, Player1 dharshan, Player2 sherin) { + int i; + List player1 = new ArrayList<>(); + List player2 = new ArrayList<>(); + for (i = 0; i < 14; i++) { + if (i % 2 == 0) { + player2.add(deck.get(0)); + } else { + player1.add(deck.get(0)); + } + deck.remove(0); + } + System.out.println(); + System.out.println("Card of Player1: "); + for (i = 0; i < player1.size(); i++) { + System.out.println(player1.get(i).getRank() + " " + player1.get(i).getSuit() + " "); + } + System.out.println("Card of Player2: "); + for (i = 0; i < player2.size(); i++) { + System.out.println(player2.get(i).getRank() + " " + player2.get(i).getSuit() + " "); + } + System.out.println(); + dharshan.receiveInitialCards(player1); + sherin.receiveInitialCards(player2); + return deck; + } + + void play(List deck, Player1 dharshan, Player2 sherin) { + Play o = new Play(); + int score1 = 0, i, score2 = 0; + Card topCard; + topCard = deck.get(0); + deck.remove(0); + System.out.println("Top Card : " + topCard.getRank() + " " + topCard.getSuit()); + Card.Suit decCard = null; + while (score1 < 200 && score2 < 200) { + for (i = 0; i < 3; i++) { + if (sherin.shouldDrawCard(topCard, decCard)) { + if (deck.size() != 0) { + sherin.receiveCard(deck.get(0)); + deck.remove(0); + } + } else { + topCard = sherin.playCard(); + System.out.println("Top Card : " + topCard.getRank() + " " + topCard.getSuit()); + if (topCard.getRank() == Rank.EIGHT && sherin.myCards.size() != 0) { + decCard = sherin.declareSuit(); + } + break; + } + } + for (i = 0; i < 3; i++) { + if (dharshan.shouldDrawCard(topCard, decCard)) { + if (deck.size() != 0) { + dharshan.receiveCard(deck.get(0)); + deck.remove(0); + } + } else { + topCard = dharshan.playCard(); + System.out.println("Top Card : " + topCard.getRank() + " " + topCard.getSuit()); + if (topCard.getRank() == Rank.EIGHT && sherin.myCards.size() != 0) { + decCard = dharshan.declareSuit(); + } + break; + } + } + if (dharshan.myCards.size() == 0 || deck.size() == 0) { + score2 += sherin.getScore(); + System.out.println("Score of Player 1 : " + score2); + } + if (sherin.myCards.size() == 0 || deck.size() == 0) { + score1 += dharshan.getScore(); + System.out.println("Score of Player 2 : " + score1); + } + if (deck.size() == 0 && score1 < 200 && score2 < 200) { + deck = Card.getDeck(); + Collections.shuffle(deck); + deck = o.start(deck, dharshan, sherin); + } + } + o.results(score1, score2); + } + + void results(int s1, int s2) { + if (s1 >= 200) { + System.out.println("Winnner is sherin"); + } else { + System.out.println("Winnner is Dharshan"); + } + } +} \ No newline at end of file diff --git a/src/main/java/cardgame/Player1.java b/src/main/java/cardgame/Player1.java new file mode 100644 index 0000000..10e4c16 --- /dev/null +++ b/src/main/java/cardgame/Player1.java @@ -0,0 +1,107 @@ +package cardgame; + +import java.util.List; + +public class Player1 implements PlayerStrategy { + int playerId; + List opponentIds; + List myCards; + Card topPileCard; + Card.Suit changedSuit; + + public void init(int playerId, List opponentIds) { + this.playerId = playerId; + this.opponentIds = opponentIds; + } + + public void receiveInitialCards(List cards) { + this.myCards = cards; + } + + public boolean shouldDrawCard(Card topPileCard, Card.Suit changedSuit) { + this.topPileCard = topPileCard; + this.changedSuit = changedSuit; + if (changedSuit == null) { + for (int i = 0; i < myCards.size(); i++) { + if (myCards.get(i).getSuit().equals(topPileCard.getSuit()) + || myCards.get(i).getRank().equals(topPileCard.getRank())) { + return false; + } + } + } else { + for (int i = 0; i < myCards.size(); i++) { + if (myCards.get(i).getSuit().equals(changedSuit)) { + return false; + } + } + } + return true; + } + + public void receiveCard(Card drawnCard) { + System.out.println("Dharshan recieved :" + drawnCard.getRank() + " " + drawnCard.getSuit()); + myCards.add(drawnCard); + } + + public Card playCard() { + Card outCard = null; + if (changedSuit == null) { + for (int i = 0; i < myCards.size(); i++) { + if (myCards.get(i).getSuit().equals(topPileCard.getSuit()) + || myCards.get(i).getRank().equals(topPileCard.getRank())) { + System.out.println("Dharshan played: " + myCards.get(i).getRank() + " " + myCards.get(i).getSuit()); + outCard = myCards.get(i); + myCards.remove(i); + break; + } + } + } else { + for (int i = 0; i < myCards.size(); i++) { + if (myCards.get(i).getSuit().equals(changedSuit)) { + System.out.println("Dharshan played: " + myCards.get(i).getRank() + " " + myCards.get(i).getSuit()); + outCard = myCards.get(i); + myCards.remove(i); + break; + } + } + } + return outCard; + + } + + public Card.Suit declareSuit() { + Card Dsiut = myCards.get(0); + int max = 0, count = 0; + for (int i = 0; i < myCards.size(); i++) { + count = 0; + for (int j = 0; j < myCards.size(); j++) { + if (myCards.get(i) == myCards.get(j)) + count++; + } + if (count > max) { + max = count; + Dsiut = myCards.get(i); + } + } + System.out.println("Delcare suit: " + Dsiut.getSuit()); + return Dsiut.getSuit(); + + } + + public void processOpponentActions(List opponentActions) { + + } + + public void reset() { + + } + + @Override + public int getScore() { + int point = 0; + for (int i = 0; i < myCards.size(); i++) { + point += myCards.get(i).getPointValue(); + } + return point; + } +} diff --git a/src/main/java/cardgame/Player2.java b/src/main/java/cardgame/Player2.java new file mode 100644 index 0000000..8d15f93 --- /dev/null +++ b/src/main/java/cardgame/Player2.java @@ -0,0 +1,109 @@ +package cardgame; + +import java.util.List; + +public class Player2 implements PlayerStrategy { + int playerId; + List opponentIds; + List myCards; + Card topPileCard; + Card.Suit changedSuit; + + public void init(int playerId, List opponentIds) { + this.playerId = playerId; + this.opponentIds = opponentIds; + } + + public void receiveInitialCards(List cards) { + this.myCards = cards; + + } + + public boolean shouldDrawCard(Card topPileCard, Card.Suit changedSuit) { + this.topPileCard = topPileCard; + this.changedSuit = changedSuit; + if (changedSuit == null) { + for (int i = 0; i < myCards.size(); i++) { + if (myCards.get(i).getSuit().equals(topPileCard.getSuit()) + || myCards.get(i).getRank().equals(topPileCard.getRank())) { + return false; + } + } + } else { + for (int i = 0; i < myCards.size(); i++) { + if (myCards.get(i).getSuit().equals(changedSuit)) { + return false; + } + } + } + return true; + + } + + public void receiveCard(Card drawnCard) { + System.out.println("Sherin recieved: " + drawnCard.getRank() + " " + drawnCard.getSuit()); + myCards.add(drawnCard); + } + + public Card playCard() { + Card outCard = null; + if (changedSuit == null) { + for (int i = 0; i < myCards.size(); i++) { + if (myCards.get(i).getSuit().equals(topPileCard.getSuit()) + || myCards.get(i).getRank().equals(topPileCard.getRank())) { + System.out.println("Shrein played: " + myCards.get(i).getRank() + " " + myCards.get(i).getSuit()); + outCard = myCards.get(i); + myCards.remove(i); + break; + } + } + } else { + for (int i = 0; i < myCards.size(); i++) { + if (myCards.get(i).getSuit().equals(changedSuit)) { + System.out.println("Sherin played: " + myCards.get(i).getRank() + " " + myCards.get(i).getSuit()); + outCard = myCards.get(i); + myCards.remove(i); + break; + } + } + } + return outCard; + + } + + public Card.Suit declareSuit() { + Card Dsiut = myCards.get(0); + int max = 52, count = 0; + for (int i = 0; i < myCards.size(); i++) { + count = 0; + for (int j = 0; j < myCards.size(); j++) { + if (myCards.get(i) == myCards.get(j)) + count++; + } + if (count < max) { + max = count; + Dsiut = myCards.get(i); + } + } + System.out.println("Delcare Suit: " + Dsiut.getSuit()); + return Dsiut.getSuit(); + + } + + public void processOpponentActions(List opponentActions) { + + } + + public void reset() { + + } + + @Override + public int getScore() { + int point = 0; + for (int i = 0; i < myCards.size(); i++) { + point += myCards.get(i).getPointValue(); + } + return point; + } +} \ No newline at end of file diff --git a/src/main/java/cardgame/PlayerStrategy.java b/src/main/java/cardgame/PlayerStrategy.java new file mode 100644 index 0000000..75f209d --- /dev/null +++ b/src/main/java/cardgame/PlayerStrategy.java @@ -0,0 +1,109 @@ +package cardgame; + +import java.util.List; + +/* + * ======================= + * DO NOT MODIFY THIS FILE + * ======================= + */ + +/** + * A contract for how a Crazy8's player will interact with a Crazy8's game + * engine. + *

+ * A game engine would call these methods to interact with implementors of this + * interface in order + * to orchestrate a game of Crazy8's. + */ +public interface PlayerStrategy { + + /** + * Gives the player their assigned id, as well as a list of the opponents' + * assigned ids. + *

+ * This method will be called by the game engine once at the very beginning + * (before any games + * are started), to allow the player to set up any initial state. + * + * @param playerId The id for this player, assigned by the game engine + * @param opponentIds A list of ids for this player's opponents + */ + void init(int playerId, List opponentIds); + + /** + * Called once at the beginning of o game to deal the player their initial + * cards. + * + * @param cards The initial list of cards dealt to this player + */ + void receiveInitialCards(List cards); + + /** + * Called to ask whether the player wants to draw this turn. Gives this player + * the top card of + * the discard pile at the beginning of their turn, as well as an optional suit + * for the pile in + * case a "8" was played, and the suit was changed. + *

+ * By having this return true, the game engine will then call receiveCard() for + * this player. + * Otherwise, playCard() will be called. + * + * @param topPileCard The card currently at the top of the pile + * @param changedSuit The suit that the pile was changed to as the result of an + * "8" being + * played. Will be null if no "8" was played. + * @return whether or not the player wants to draw + */ + boolean shouldDrawCard(Card topPileCard, Card.Suit changedSuit); + + /** + * Called when this player has chosen to draw a card from the deck. + * + * @param drawnCard The card that this player has drawn + */ + void receiveCard(Card drawnCard); + + /** + * Called when this player is ready to play a card (will not be called if this + * player drew on + * their turn). + *

+ * This will end this player's turn. + * + * @return The card this player wishes to put on top of the pile + */ + Card playCard(); + + /** + * Called if this player decided to play a "8" card to ask the player what suit + * they would like + * to declare. + *

+ * This player should then return the Card.Suit enum that it wishes to set for + * the discard + * pile. + */ + Card.Suit declareSuit(); + + /** + * Called at the very beginning of this player's turn to give it context of what + * its opponents + * chose to do on each of their turns. + * + * @param opponentActions A list of what the opponents did on each of their + * turns + */ + void processOpponentActions(List opponentActions); + + /** + * Returns the score of each player + */ + int getScore(); + + /** + * Called before a game begins, to allow for resetting any state between games. + */ + void reset(); +} diff --git a/src/main/java/cardgame/PlayerTurn.java b/src/main/java/cardgame/PlayerTurn.java new file mode 100644 index 0000000..dfe440a --- /dev/null +++ b/src/main/java/cardgame/PlayerTurn.java @@ -0,0 +1,59 @@ +package cardgame; + +/* + * ======================== + * DO NOT MODIFY THIS FILE. + * ======================== + */ + +import java.util.Objects; + +/** + * Represents an player's action on their turn: either they drew a card or they played a card. + */ +public class PlayerTurn { + + /** + * The ID of the player that this action corresponds to + */ + public int playerId; + + /** + * If the player drew a card on their turn + */ + public boolean drewACard; + + /** + * The card the player played on their turn, or null if the player didn't play a card. + */ + public Card playedCard; + + /** + * When a player plays an "8", they can declare what suit the next player must play to. + *

+ * If the player played an "8", this is the suit that they declared. Otherwise, this is null. + */ + public Card.Suit declaredSuit; + + // Convenience methods; you might or might not need these. + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PlayerTurn that = (PlayerTurn) o; + return playerId == that.playerId && + drewACard == that.drewACard && + Objects.equals(playedCard, that.playedCard) && + declaredSuit == that.declaredSuit; + } + + @Override + public int hashCode() { + return Objects.hash(playerId, drewACard, playedCard, declaredSuit); + } +} diff --git a/src/test/java/cardgame/CardTest.java b/src/test/java/cardgame/CardTest.java new file mode 100644 index 0000000..db435c6 --- /dev/null +++ b/src/test/java/cardgame/CardTest.java @@ -0,0 +1,119 @@ +package cardgame; + +import static cardgame.Card.Rank; +import static cardgame.Card.Suit; +import static cardgame.Card.getDeck; +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; +import org.junit.Before; +import org.junit.Test; + +/* + * ======================================================= + * DO NOT PUT YOUR TESTS IN THIS FILE! + * + * Write your own test classes for any classes you create. + * ======================================================= + */ + +public class CardTest { + + private List deck; + + @Before + public void setUp() { + deck = getDeck(); + } + + @Test + public void faceCardsWorthTenPoints() { + List faceCards = Arrays.asList( + new Card(Suit.DIAMONDS, Rank.JACK), + new Card(Suit.HEARTS, Rank.QUEEN), + new Card(Suit.SPADES, Rank.KING) + ); + + for (Card card : faceCards) { + assertEquals(10, card.getPointValue()); + } + } + + @Test + public void eightsWorthFiftyPoints() { + List eights = Arrays.asList( + new Card(Suit.DIAMONDS, Rank.EIGHT), + new Card(Suit.HEARTS, Rank.EIGHT), + new Card(Suit.SPADES, Rank.EIGHT), + new Card(Suit.CLUBS, Rank.EIGHT) + ); + + for (Card card : eights) { + assertEquals(50, card.getPointValue()); + } + } + + @Test + public void acesWorthOnePoint() { + List aces = Arrays.asList( + new Card(Suit.DIAMONDS, Rank.ACE), + new Card(Suit.HEARTS, Rank.ACE), + new Card(Suit.SPADES, Rank.ACE), + new Card(Suit.CLUBS, Rank.ACE) + ); + + for (Card card : aces) { + assertEquals(1, card.getPointValue()); + } + } + + @Test + public void numericCardsWorthNumericPoints() { + assertEquals(2, new Card(Suit.DIAMONDS, Rank.TWO).getPointValue()); + assertEquals(3, new Card(Suit.HEARTS, Rank.THREE).getPointValue()); + assertEquals(4, new Card(Suit.SPADES, Rank.FOUR).getPointValue()); + assertEquals(5, new Card(Suit.CLUBS, Rank.FIVE).getPointValue()); + assertEquals(6, new Card(Suit.DIAMONDS, Rank.SIX).getPointValue()); + assertEquals(7, new Card(Suit.HEARTS, Rank.SEVEN).getPointValue()); + assertEquals(9, new Card(Suit.SPADES, Rank.NINE).getPointValue()); + assertEquals(10, new Card(Suit.CLUBS, Rank.TEN).getPointValue()); + } + + @Test + public void deckHasFiftyTwoCards() { + assertEquals(52, deck.size()); + } + + @Test + public void deckHasThirteenOfEachSuit() { + int numDiamonds = 0; + int numHearts = 0; + int numSpades = 0; + int numClubs = 0; + + for (Card card : deck) { + switch (card.getSuit()) { + case DIAMONDS: + numDiamonds++; + break; + case HEARTS: + numHearts++; + break; + case SPADES: + numSpades++; + break; + case CLUBS: + numClubs++; + break; + default: + break; + } + } + + assertEquals(13, numDiamonds); + assertEquals(13, numHearts); + assertEquals(13, numSpades); + assertEquals(13, numClubs); + } +} diff --git a/target/classes/cardgame/Card$Rank.class b/target/classes/cardgame/Card$Rank.class new file mode 100644 index 0000000000000000000000000000000000000000..3d4d4a072146ee11db5362ab2d3addf6e6ae8769 GIT binary patch literal 1579 zcmZ{k?RFDY6o%hJJ|-V0=@6mN&_aP)l2EBdib!H@jMFwWO{9|qM$omUVXUcX>dFVp z-hfx&6?g?W{D6f^mcP9ymwWF-8ke;{`kv>Uz4tlU=RNc1UvJ(5xPxyDoKZ-%+}^W& z_t0A|(O_ZM?S5|{sE|BxpS#N)x4XY=b%%!vfnv#0I9K^^e4ZBTk7^2``qr*RLBWk$ zW0$4eBnsH&$Fyc!O{+?3l{dHQv{)@yd9luu!3V|CHmyBuSc2Q->ZU^6sy22On#D@P zvK7uhIeqI$q19=3+k-VKmdQ4$Sn24Q7eOcng|x;c%qoNnZIigI>G4pD$;d zQHs5+5kfcugW;-%!4P3s(1QeNFmIlFErl6Ifbc8yX#elhkIVH?(TIwy2;8> z%k4DXUYl7aV+bHk9T|Mr?o$(&9PCLySRnz5e z*XzmlUf;k|g~Y#J19h6;&-x18Q-I!Ba(#v^1(1@PM9D~^}Z0$snTS4N$7FZO>7y?;=n-PH}fm`M%Zdqu>90lGMx?_$aSA{+{qmp+|=)M^f$_ssJ#)Z~| z)=e!`G!wtmi32|7Y$xbr-gZJhuG>!7$D-{RKC-qG@v&q(CQU7q(A;ejnp`D``nX3D z^N}Zs`&c8lC;RJAq5DvAy(yRz}AjRa5Vd5T!S=JFbzV7~U(EQn}Z#|A6}c Yya1X~^AR44I{1n+DPQ3UzFwdC8_P;0h5!Hn literal 0 HcmV?d00001 diff --git a/target/classes/cardgame/Card$Suit.class b/target/classes/cardgame/Card$Suit.class new file mode 100644 index 0000000000000000000000000000000000000000..e6ec179d0b4cbc52c46d31594271d15b3734386b GIT binary patch literal 1098 zcmZ`(TTc^F5dIF^?zUyQm7Cne3u0T4iV9xZ5NcavV*%qrlg6h*S?iK^Yqnbw{*{&o zh(_YGKgu|BQelmCANI^Qd%l@(F4>>IzFq=&f)@q`1mZR69o1#iPUp#3vO11$AS5t+ zEKg**A>Deq=ysX{kwPiAv$tEY1SZP=k}?AN>tgQRK7H4%x4A-*jBvhu@RH8K;_kuD zQYBYDVDIGn{`^R`)^J?M-xAOg$%;TI-#W4*2*)5WW+IMpike`w+X)&(|#qp1c@b#NF{{<_YW6FK8x-ZWS>rooTTb1Te#ayKav&7*vi;O-Q8csUy0)j%+ie5S z1cv_FF6uNd<@P$wNu$LLZ_n^_0Xk{0>ZF;flg0^*&hjwnW{75OVu*OdgnYvM?0SEfehP#-xs(Kd-))^MRP}~9B zrngSnfN|VW9`@4K_7tp>ey+est<0a}Zhw-g0vK50QfNQ#VYx@&q_UYl)x~107&2 z^@RsZt72Vc`P7I0i2jnU(tW;(CNaPwGvE2nIeVXL`1`*IDt{a3o9hWGQb4(T@QG`!$5xeVRCcgBm&>3C)Uz1L4Tc-JpXQ!p8}=T2uE6P-z8pD1ZFoC z1<#UG<$B4fmt2(~EonPzvZKxrrBu#4u2t-$>`N2liqh3Ya#{rEOq>@%K(z>+WvW*0 z{;c(&o)E#GvU9`_k)rCtTGc6z&Nvn6i_VO*=33QSnF&4CrZCYOQ~W~QKte-b!%d=G zww{QuASRKN98NJ`;j|?660R7ytYKe6J>}NcGj`QP8du5LDi*KZ)o>#05mV!lELxRH zyqRjvQ;gWy}ULM(sg;f3)eAk;9CaXerqCw1rl}b$1*eT0&kj6 zqG`xVK*zf99hMC&Y3Ocvl9)~0#4Xm#%I7ugZw|tn@pxoeSll+Tf;+5Z!K%zDKn~e5 zW00xxYSY_ZnSs{!e)8a5iy!$wx4lRlOZ#EXDpsVi*Gv@P5RHwXa?AR)#Oo!T+ovQm zr6O$31G6MN>45YL-d-r-p@9c2mGvU7m?(pzqKmGS=4QLY2)A4?Q>vA7_9aIKxid-s zrvzAonRZ>ftSHG=(Y?{pWyo-Z6_LdkVA}`K!IQz04|{m-Y&y&AaA&AHPO^G(j``ff z-(KvaWr(Mfw3VN|Tj<-~!r*q{Hw^zufe(lIDF8s2up$9Z?1j4N5+y>VC;AGZ)C2q#7oUbAudL*wyXjZfoD-Pl!3fGCl}FEO@>FZlTrI(mZ}BHF}P zPk9(q2j1v+HVElgi5p;bz;)1z1o|+ALr77cZbFRK>Bgz2!`EjrM-%v(m=`GV;i3v) zhknGc@U)9{vGd7&XsdR~8q;X%DFADWB4fwmMo z`3j4#al?lja`nB2A9wztt$NvxN@jG$dsy|;JbPz>To-W;S+ZV~Re@VrR{W)YU6fc@ zrQH#X)$4bT(MtXN$Wbmu@wD zz+N?fW?H1<#-p*P2Ii@()Ks1bCfdx z@((Zq19{T0aS&^)Qi09xkZIw4q=b9lspGhZ`y_LS(^X{m`czz9(2Z{GU-^ocR$YJJ zK$A?WwC+IQPxzPoLM*eS3#rT&T%pt4%dUd-dU>D@=|fd%)$oYV5cP-X@rTJl{#&Bq H@#NtD?MC5p literal 0 HcmV?d00001 diff --git a/target/classes/cardgame/Play.class b/target/classes/cardgame/Play.class new file mode 100644 index 0000000000000000000000000000000000000000..568fcff8a26d145d80e0fa70b628c42b4c40cd92 GIT binary patch literal 4332 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 literal 0 HcmV?d00001 diff --git a/target/classes/cardgame/Player2.class b/target/classes/cardgame/Player2.class new file mode 100644 index 0000000000000000000000000000000000000000..3e6c1a34f9611d6d404db75c8e8eb4aaeaf475f6 GIT binary patch literal 3812 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 literal 0 HcmV?d00001 diff --git a/target/classes/cardgame/PlayerTurn.class b/target/classes/cardgame/PlayerTurn.class new file mode 100644 index 0000000000000000000000000000000000000000..5079cdca83e340eeac4b5f01077dfdfe722b04c3 GIT binary patch literal 1217 zcmZuxTTc@~6#k~$vZXBdi=cuaDD4)h+*B+gP$g+ngrtO|_%yU*TU=V)withkZ@lOe zFD6EbiN?gl2Y-_>ezR0*#fP19nKS2n=R2qU@$1tU0P|Qk;S=c1N;j962P(GZ$XCkU zuDK->eu1uic_d?wEahXHd;2O|6$l=BA<3M8ND8#(T=jA_!S}Rx1w!6+?#$7d`kPog z;sRDqWgY3NT)I|dvcBek3GHQ6%TlpatS$=};mD4FKT*!95Dau%Xh(-YXR26IPihBy zgevzOCD4;9XQi_v-J-VZPJgvftO)d<7ddZFS5Yr&($N9o)W3bkBfGlbkcG>*!lv`8 zns8)=!M))~L$v3Nw?bgpLI5pVyJo>eP-|lrS`i9i95+l%2y}a8YSp4sr?X;V05=6D z|AU~R${F{>q?3j%w80|VW!?4#;H0ZskmR;KU6tAA8}hKuMzA0&1(iCIyJTVOkg0KZ0x!o77yVL?wPpTlw+-2c9bmX9EFLmoI0Db7E#TIdir+)m6(YolC9es;{|0Mby9rgzdM)|!#z&MG1h1js)f}~ A(f|Me literal 0 HcmV?d00001 diff --git a/target/test-classes/cardgame/CardTest.class b/target/test-classes/cardgame/CardTest.class new file mode 100644 index 0000000000000000000000000000000000000000..9da4ee6d953441ab62eed1339c75adf7ac981980 GIT binary patch literal 3839 zcmaJ@YgZfB72TuPfIP%NFowi#AtpB9*m4rbNew0zAS{6p7zqf$sWXTH#ug(Ojhr}X zo3@KIt8P}3uD-MSO8TJ9N?RKz2J&$GsUP}3y85BNp{4uY(GzH3Y3`iIJ@?#w&)IkW z@!wDG12~Jns_-aiNbC0eqP}c|2KbUPa*hh0g8FOv4Ly|6t;NvT+%+TZDDcf2>Fcz_ zr77>2nNZx!IXwz$ljfqOJ9*ns(7wyu8?RcRr;q+^9m(lfY9M+w74DBmI*JY*B7=@( z-sEDQ*_eVruW6Z1p8{`Z*Ax>N$j%!sA5HG{G6=vZPfsi3KPyV8qG zccNQG*Pa*?x^-Q{NjyfFhrbll2giA!!bPQW}vbKWes-uh* z^gRaG8?$+NK8 z0kI$^F|C4~P+zXca4u)qj)vzjqd?Q86j{yd8J3X0b9lIGO5``I;R;@0T`uXlgiM72 zpJ(Tm%8xmUsuE3ARb6b6=IW-pxl(Mbx}>A0uaD|0g+^;O%*7?gt>htd!MW+yvN&l& z!-72NNbFKHB~E%tgDFnhKM9k~cgMVba2f z?PTSb4cknYJBhR)6mAB^=pGT^hK849fYkI@(cl$^S2cW1=9r33L?T6#Pnf=`;akGw z8ycIOC|dl&^16oaxR%&dX-+^`ZfW?QTqhZOt~f;%hPO4mBiBhrrXq==saBYNsNqL4 zS|XN+2*pn{{8R=>MG~wZLBUZyC&5jaf&)B`K~rDOTJt;{g;ZWkP1MkB!EE9^xuVaDgR9~DKqfzz6QsBy@?jf1 zf{!$OjC-tw8>0N_cbF;emxzij1rL=kt3)=LPcIFbMrJ-@+gV#hP(d)6&D&{X$P`yZ zod8V`>S-~HJrlDm!yd?p*5N`v!B`x`_R-FyylhPm|4G-BR4LWe4~tCsF4E>*#Ah9) z5J!chzk3r8+>x&Je2R&{AvEwQT7vwEpx(XyfMF z(aa+~j${1jXcP2KPCS8WjxVB1ZlX=1tQR)%47FdCpv8&pReE`#GnRnPwbk%#j+!QT zcF+%>3Pok{t7JOr6r}eBVW$AXs#*=g{4Nk&xeS6U2V77VHz4Kz56ZPK0Hs?N%_(l~ zG(iawf-^kp$1#Xgh!UPFybl*SuHfkkU{(vjLEbj}+igz_@Z57%5i)(_F5W;BHv{Rjw5mmL6`cm#|zQEPaIKS;EpoSo#Ue01S>6 zA{DS?OR${4Y5|toUG)-WrLE$NU}QIatyI5Riv3ol`unBWKd4kEO0j=jR+m}BZN?Z5W0;jULKx!& zbrd-ya0_F2598RvWeKj!P}?O&`PqKp@Nj$t4rpk?yWJn*=r(??Ku|$>QJ1PF$p%vu zfg4JJf3;s=+jKqBx@bTa+e271BKR&#PKl9B)`z`#1Z(gqV25$4s$5q3! z=KYcpFCehPQ&!1{;?JeT9WqK$qoPI9q~Gt~;WboLyN>lW4E#Qq6nDm5E+fDk-oTxi zzr%NXdJA{&e-<3+-oPReSI5@jo2JlC!B-T{Q1BOpa})xuFmo4oZZq9_wDRWK