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+e271BKRPKl9B)`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