From ec79326717bdf9d32dac217f0d21dcde3dcc243e Mon Sep 17 00:00:00 2001 From: FrederickPi1969 <pixinyudeyouxiang@gmail.com> Date: Fri, 5 Feb 2021 00:57:43 -0600 Subject: [PATCH] Complete assignment1.0 --- .../sp21-cs242-assignment1/CardManager.class | Bin 3548 -> 3634 bytes .../sp21-cs242-assignment1/CardParser.class | Bin 3257 -> 3261 bytes .../sp21-cs242-assignment1/CmdUI.class | Bin 4566 -> 4569 bytes .../sp21-cs242-assignment1/Game.class | Bin 2869 -> 2945 bytes .../sp21-cs242-assignment1/Player.class | Bin 4568 -> 5830 bytes .../RuleController.class | Bin 7117 -> 7117 bytes .../sp21-cs242-assignment1/PlayerTest.class | Bin 0 -> 2482 bytes .../RuleControllerTest.class | Bin 10399 -> 11480 bytes .../sp21-cs242-assignment1/cardDealTest.class | Bin 3160 -> 3160 bytes src/Test/PlayerTest.java | 85 +++++++++++++++ src/Test/RuleControllerTest.java | 60 +++++++++-- src/Test/cardDealTest.java | 6 +- src/UNO/CardManager.java | 8 +- src/UNO/CardParser.java | 2 +- src/UNO/CmdUI.java | 9 +- src/UNO/Game.java | 24 +++-- src/UNO/Player.java | 102 +++++++++++++++--- src/UNO/RuleController.java | 2 +- 18 files changed, 260 insertions(+), 38 deletions(-) create mode 100644 out/test/sp21-cs242-assignment1/PlayerTest.class create mode 100644 src/Test/PlayerTest.java diff --git a/out/production/sp21-cs242-assignment1/CardManager.class b/out/production/sp21-cs242-assignment1/CardManager.class index 3b553b8e9cce60d30360c982042f9805d8b9eeae..684095064f264898370a598bceaec72487f22763 100644 GIT binary patch delta 175 zcmca3y-9}a)W2Q(7#J9=85V5hGGpiGOHVCv$t+GzEJ_K;%t@VW$8N?qnTufx!&G*L zX*>)b4AUn!u^(ZaIoX}VjB(E7Iu0$Cd5jEllN&kYCZFQ4VdUD(&bf|7i;<y^p@)Hq zp#o^MJ_92VGBB`eZDA1J0Aw&RR02shuwdfkS-i5U{b11v3=@Gg2T*(x5YJ$k1>|u7 NS+g1DGR$X?1OOv=ChPzJ delta 114 zcmdlab4Qx%)W2Q(7#J9=8Rl=~GGm_{$Zo<niHl(}!xVOgsXPoG4AUl0W<SC>V{!zC z8RP89{Tx~>a~T=rChupLn|zzYhLLl#1m`*yb!LV>pdm~Q{R|U;GzSAC!$csS&M*_m P;{vi~G0b6@#~=v+Voe+n diff --git a/out/production/sp21-cs242-assignment1/CardParser.class b/out/production/sp21-cs242-assignment1/CardParser.class index 91bfe36bc32cfed6704cc7ea4288d3f3586384d5..6c9bc09a1dea0efd95dc1d18883109a6b2fa6a96 100644 GIT binary patch delta 24 fcmdlfxmR+-1Xgao%woU%Jm>tJ{G!d%S(VrUaDxbi delta 20 bcmdlhxl?k(1Xgyg%;NCOoRrP8S(VrUPS6JD diff --git a/out/production/sp21-cs242-assignment1/CmdUI.class b/out/production/sp21-cs242-assignment1/CmdUI.class index 9e4a053d8df256d5f7e95477d0e4e5fc5397a49c..8a634436ce8e7364bbb853031ae91061a657f900 100644 GIT binary patch delta 507 zcmXAlO-od99EG17BU8?cV{eLh&6-qZ)H0Dw98FWnEUgd|O{KIHLmO10M9XNbT`2s0 zA;n$g8>lriSZ*}^4njM3(idoJ2jXt-y`1y>&N=)3-~NpQhs)bL)DV7N748cUMh_hs z2`O=o>4CD~CRQ*vjx!j;88dcbdB}qUFDFRi6g~o+B*ba9r9S)L!w$dnB{#dcvDnjl z5XTW&W;SuL#>Pbk9?l7oDad(JxPZ+?{A7_&HkZkzQ0OArLgaCsOH}LcEedGh3XK#+ zBd%<#zC;&Gl_jJkWu!`&My2341gYj4HPmsF2h{RN<}Pm2O+5pG3~`s2++&3ML<F3p zDf-uKStTtTr<F52B!@Px(k@sBcLZprlNLeRdBS6!(o2u5&v;KCAL%y*-dNz3x(zGL zs5-q>nAfE9M$N_)=$!&Zs9;>g55|+UADEDOQfi}nvx+|@$F#PXk>iupb5hSsy<ptF z9s4s*zG$<r8hTMBm&9DwGAl~CYX11b_L>yyQf%n@H|_gf9irMTMlo^oBDo^rhuZx# ITgmDF08*=68~^|S delta 504 zcmXAlTT4`76o#KIBctPCM$BW5hbBke=7G#=NGD4rv<y*j(g>|Y84)5x^Ar`LR|)DD z8FSZ31J91ym1y=K1n<1BKj2lpARlbjUOeww@4HTX$G*)|htm}v3WW!IqkkN^v6*|s z=t0o_iDj4W;<R^ghPF+<D_9ec0~hfmaDhZ@lBvbRf$;Qm5r_QJpX3~gu=uUo#_<oo ziMW;<vn0(XiHo?&Ar&tf<m#J`j{?fLL<L1$rI2g*siBzLk~dIF6IXaBqMgd<OoHEP zsn*6D@^VuS0%USagKIS`C}EwtcW9=b4vBkc<T>}~(~y_kXNU*9qJ;?!oT8NoZPBwt z%L;T5M~E~Y$wMdC>EbSr1wT=@Tb&+NPxYP=rdQH_rd7={V5*XLN`{qfL}td6>9x#^ zE8zr}nUtY7GW1rq-f7~L@wksm-iw|UJ*RyiWPe_Y1?4wVd=$MX`jhC0aeEHEpK<a< zH~XqXe^bcsnz=+d%X0a{{Pn!>u83F_v8L_o<guX)o4V$fj<jt?Q|e-Om2S`Mr{w$x Dz+76Z diff --git a/out/production/sp21-cs242-assignment1/Game.class b/out/production/sp21-cs242-assignment1/Game.class index d5c853fa460b7ce595a9af05c64a4e50bd7a828d..4058f84c7860f8f236114c72a56bd777e7b3ccd2 100644 GIT binary patch delta 1391 zcmZuxTT@$A7+vQ=PIA~>npRo_Qmh3-FvN#WJ0-OiQmIiWNFhL4D@SsQDdB{klRyh- zthQ>s<Ea;_^{&wuXKLZ#lo>~7eDd8V|AcSObhP!`Cn+*hCzE~o_WHiHzO{F<T6ccC z`rEA=KLLp1yKCwJv2YNNC^*E>g>C^`PHVGTB%>LVk?w3Zqico$Wme1N_5M==>VnC( z-n$S{m1-SksKBEFnu77(Bighc{U2Ogf+LSGJcbqlzLcrW#k49jWvSSM#~GeLue~5P z7mf<3by@PcbS5&W8L8~Fiatnuc#>fd$4Hf-pUuUMoB%l(Z;Sij#V|txOhC;<-ZXV1 zH;~cJ>1O<}iUy1_j3FtYdQ#8Dtym^IF*TRAbOBPZEy?*$Fg%5mRL$C&o-f7YJaL>s z!!veRYVo8PbeytBrM;eK8PYgyUzT<aXBej85x{1MuHVoHvw0)M8_hDz@Pm8Iym2Sq zlQoBQE0;DVIl^SHxF{b_)y<K#p;8-phFSYhslM_o&MBB@SU}R=CWo7z6QIU4Gc}-@ zmTsz8gv8r^f#Ez}v`@-^vC2(U_OXgY^~Wl%;u8g*a_OJhYZbo=U)YPDfS>fn4MR6$ z8O^eEOTpLnO;1QJ3JBQ$cmj5hQrAUQ>7Cq*m%t$40<A?{q*W#DL31<ibLV=(@cn*t z()hBAdxfwG`>L|N>Qy@O)8mjSzF_~NB-&fo5gls`$v@)ZHN=jFYZV7Qp%v^4JBW{5 z5QXCHKdup4!X^8lH`1l!eoSFEa>O@}R=h@MA*!dN2Cw4{!VMybH%XPqIq(+VrkSta zag{IG-+Oly9-!0RXd#892&0rG(d=JG-`E=Z`$7*kI2c&P5N8%~iN<Od(LokRumumf zyv?Po4Gw>q!wVJf!lq0Sv+$Hz<_RrOrOwbw0Raai%h(a3PKV@i-min>GsIX#Qz@7# z2R9#<jo?yU3-=PyKI|m3_v3&oiC+#;lqD_ET86l@o}!mGgq%UAM9P3LQ3OH`p8f%? zB_TI30XXR3+&to7@@GVQ+Z{}mt*~$T8VcO>x>AWUQ;;t8J+fb*&-)upOVlzairih# zpqgiv;VEJpDaeJ!R-nk^t5Ax!fB&z|UF0_~Om~~WR*cZw8buQdNxJ;wXvYb3&=2*F zni@2gH4x(_2N<dN8;uI0H&IIkKiJUM?WzMB{9XrhS4cq-vUD9)>sX|R@ceZY%59Sh t)dl;g#2yvg*$Rm45dCT3L)wT~#ub{qWWY!C{TyGqIRd`IH~1Fy{{lA87U=*0 delta 1337 zcmZ{k%TpXh9LGO1v+OLB3F1}-LXd}1l4S#|2P>2=#uzZLW?2YE5~3oL>=;2<$UcDJ zV}oMi`!&82-&z(&3lk<)P-S`W<V7!*NB;ni9;~ub;%{bGf`@ch_4M@b*ZuwUx2I>Z zcD2U%>7TXlfjD2S7+q>H&H<AO?pH7(iDa)eWyf2G4GBMBa)=g%%5>J6>$bA#oWb4n zm^{c~1<gvQ6?R0D6V|L1o3t`#Vgsip?9=&p>q(tHg=#-g$d6CPhOA6_ddi>|&1;UB zB<WYsGxmHwoXF%A0+B>(qLL5;CWB6gwlg?n@-WAoq*mWBY;v3vl9U@?utho2nlPy6 zq{*W^<}7I~!BLYZ7<0bW_6JXyoF?u3q3s@h(&P+51#@Q7IyaE9ho%debQpzELzE^= zp7x^KvW3ilL2rD@B;$>T3o~geZ>NNDQ0Cj&M32D?XLYhBIYGM+Xm2QpYo0ZORyJp6 z4f1H-F6K?nvEcj?_{;gV;#ieq@E-5$eBfbz=yV2uR4zH!gN<V$K33>6wwA7&lxCk^ zX+ChXVi>a1L?&ZryC<z&&d%w4=CtY2z!wUQPE2of=JlFd!IHDz#WR><#Iw>@c@EY2 zMsM2oy#H2|kwNEYy>|O~P^t(>g*oR>eR%Kgb>btpMXzyRs=ZowIT*c4XS+-H@g-GR z-uQh*GBp;Rd?;45xI^r}Q!KlkS@!UP#G<m6#Vx$ZlH?6Z^d;d?z4f`kMR|I?mwmQZ zq`!l}hQO*iAqDj7#FW2fSyd*s2>y9VIUx&a@(i!jJ93Rgf3&UM<)PIgDUU{FQQ9g$ zr9)08#;x4tvox2cZR&>0x*-f+<u#e9dLKerW<jzAfqP}gjV?zou`?>&RA9`rz~zyd zRZ`0|lm^q$t3`iwYqV^R$Ld?UUxYeo;vT78K9YANB2h;23<#h$)d`4vsb!F}0^%9g z?tw&IM!sWD31p4O!KK3k^7K<K)(^y!`&{fBR@BH{hi<W=hdQ~+5f0NvpRZq2TDhzr zk<8cSpcJWZZ0Z-vMtJ&q#n<dD>FaAeRZ@2u7p%!*bVL#YW2@-P8^7Jy`z~1tj);De zTKeT4r^JH+VK}<QgZBS>z&^=;bCcna&k6P6kjwOCky$37U19q=dHDuruQ0dLFDj+O vH~j2Ms>N^5(+X7cp!`O7%TIZmcjQ?mN$<)=Kl0nld?I6pyno8)d`aEERqgsa diff --git a/out/production/sp21-cs242-assignment1/Player.class b/out/production/sp21-cs242-assignment1/Player.class index d3baf62c663311ac8df80a26813c027b722e1778..a7f7f5cb0581e12e6fe2b2ac52b116e83a8c105c 100644 GIT binary patch literal 5830 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 BaX$b6 literal 4568 zcmbtY>3`JL6+O=$Gh<m^FxV_!I<#QS*u@EHO2F7aj3LvEfnWnQ6o{A+w(wYTG#bE3 z)1)ok(k<y4(w#0&_tfAaA#Iv&v`x2kNk8@v;a5t}l{AY3?HAyO^mKJ~mvhg(?+vg0 z=jtl}`tgQ_DpW@i(NTjX3QebtGe%$5uqXQVojh%(J%uIPEZg!16{@>89I8bOwNYp~ z>Y(%8{;V-;x(cxwf05j!ppsEEC@k|W<vlCgx6^fv*_4&@G}NP7Of1#WjAaTnX~WIr z6k1ZZ(e4+`79Fivq0lg4Oq)ZF?YT}iD;}4m_E18dRahNGn~rvLC`3d^yKdfBYDyj8 zqWqa}a&;}@SQEutb-WF0X?n2^P0tu^PJHO8A;!1gfAT-&SL<ngXgYH+si6xS1h#}i zU3V%#qCbGBSI672k@6YWnV#`XmtQDEQ~rm(rMq<8jZGCAdk!XPImMfw(>rwBi+3tC z`gt>o5yLhnB&d2nsPM60!+qEi#a5lg+(vT}a7nc`;~Hm0LWoy(CpX*{Whu&_j_ugN z%#BQDXEv*_s=GpWNFYypmSgvCI3nuz>lgw{9kp`9OmEib#*td=#-1o1(2>Nu7Ex(* zHs_hs)N=A9R9I}w>D%vGwm0gzrZL?gLrP&-(+2MRkA}V27sY-Z58*(OiHqGa_8D=W zwHZ&CtIv8yW7!idqvScJ;~)-^RXOWXvWg9mY-ZcMTgNz#D6E(^ri5H+!#iwwlU(II z!}f&FC9o@viplrrIELf2HDL-Ai}iw*>yP4Lg{9?AOxm8w(rY+@lRDB8QH-%4GO~G7 zgNaj7Oz4=DkhC&kg<Ha0ktBCDL*cZ<J*BX|I~i2BGPsZ&m7*9}v*A0h$AG5A;3#an z6H_rfqOfJ$$;T%gFK+W+T8JID?D(W%XL4)e#DBsyyj*X5mRg2u#=S{1e%7*W(_JIj z=X7|;3wZ2E!*ke7t=*MPkqqVibvTQ2QOxRiRCwN8o=!y-5@^!M?KRJNqWfMQkK=tL zicNvS@}gBA&9JH(r_Pf)-j5HkGFFb&vobO?*wLlwkvt*|b^_;hd<Y+=k26x^eWxVQ zV*C0wLrSpy>+w+?AH!3m6r1-=Yz|$E(HK6V<CFLl-JP=ROv;=vvO*2gxESr?Va<+w zTH)?7Vt9%Jz#)(mA?AXu41D8c)|3LI^R8>!Ufj#O_SP6aqcC`9jU2=06uP9?8OL7l zvBGD}xM9zhy#~d%owFNb_yYai3AHp$;CWWZ1=#`{C9{3DdBDlr8IEIl_az-)zU3W< zxzzNlI=+UlbKa#V&Ggjhlr=*-?&9EOnM;M03UuM3j&BBLWcKWK+_agI59Hmqb$mxU zyD8W*#yDDb`ZHIdcGQ}%4T8%Vl&F}?rG0f<MLQRnG1$*(z()6X$qh2ZhMWuyG^Q-u z+?$_1X}V)lKe9XJq>bz$!?ol&6h^#Bi-Rmy+}9MUWOI+mc0>w|dPaI`#F!~+lbv)? zYv-rOoFMm@Z5Fql*2NBHXNpdkD{&AO=92aUgpH>Mi@T5%SG;N2B1;)c@9k;&zjAM0 z#PXz_G0zd)l0gcrv`Mp#ehj5{pk#@!B*}9|`@!)fP)P~~##SRm<Ru?QojfbK+Y&JA zq@_)Fqf89?yWerVoaY)dBc?a$WO9v5a81K+@w+H~FVpxng|+2DZ`o&@DYGxwgMy7^ zw~^+c;*fZ@a+eAf1ET_5*37L<InGpmroVy<;bvALS@hu;D{&k3qZRta0a76fO$-^? z>?j8*$HX5wLxzG8kev;BRRxoR!{E=HVn@}ncs#BMV^W6kP}a!h%v=<IRakdR_P0wa zioYv#{(n^#E<gZl*s)dIr=zHq6CPL1a@^z&ILCDrp680kSFUU2aOvN9dgNWnvCY5p zaK?KbB{ldiuixX-uMt5t?|Twgpb~8hh$db}{rD9$E}*IR5|;N~gVuW)E9VeVm(a<_ z+IhSscv?r@u5o_Zy?~yCT0q}VXsR0D=e3K001Y(X$W;@TV<}cL<n;{tUOw$a3(r=q z_yM)zK?wLEe#9pRgC8>$<*!~~GF1?}s}Q-#+<CH(sVJYYBZ|1ri%Hdf%!e6GQ(ZD@ znaA?WxTmdv%_E7+Os0T=!{zuIe5H26(ZOgsE8=J=#nFOGejIhsaG7yeVS$DvvOw}Y zB?<*B30?n-z)F$w;;(?6&*9iShMONOV1)NTIC>R_!EZ*Yx3z_mi|FC&w#dWtSSKQe zeDqbED8MKna}}1aeqO1$o3D$xEI*#ZGFjSz<>ndQ%c&(8F31rL>j-!kSL=B&@5U(a z<47PwMr6qe4|n-#w=(E1+=DA2==l%;u~>)5ztN?xW0Tg%EV<cIS%|a1%0_tK5z-|U zB;$_szJxQ1+fFwZk0}I+49=r7(NSH%6BnTObi9ZU7Vwe7b2s1Ud4V<}K4V&m9<Z52 zzmMT;VM(`Qkk=wZy2zLp8KM+-M;M~$zT~$-u`+=~+Cjo^MD-0cMNuEc*~E2*9(2o9 zzJ9rs$~*%QquYzAR1dUQmZmcyPwl0u6w_!A(>PxxrMV@OA!f3RF%L7RT^Jy%i<xL4 z*us_VrA#*Cr*FzcB*jelEAs|4W}<qp6R2_?KP%DiCgqZclPKWhsUDwzLcAgYn?EhI z8))a7(TnKjn|7abJ>}FY2`5?ovrM=)Sw0gI?z7?j^C9tq3T|R`fPD;OKUWX2uMY4h z>?o@_MifTzAP({GIF928PT?qQ{%$B@(n(SZ0R<B$#H0qN@ya4h0!a}QPL~_#6ilw8 zS6jiN{=8JwK0e6=sgc?V$*O#kNvnd+#ceQRYC>maL|-i-dOS3;nnwCK2np;L=g`2X zo@<<x1w2>ox`4h8C-e-*-Xko$%OT}ecv>BLl5ZlYYS3t%M=)Ncp^h;^iLFCgrGT$o zK)v`W;2U$O3s&E%m|x9)_dUuce~dUkPMn{taMiKc)$%A!^CTF$>Y*EPr6iI{T%M{h zp+XZ1zbMVtVQNc(B(kQqkp5*O@*gk2(**Vz-;fLzDu;$-CH>1&J$~ss{uQ?$*(0j( W8%qD+U;l)^P$tm4j=$j_SoL40i6w~u diff --git a/out/production/sp21-cs242-assignment1/RuleController.class b/out/production/sp21-cs242-assignment1/RuleController.class index 4cd51c49ff5cbf5b60e2373a96937b5d4bb4fb78..176269a21e1de069cbaeeff448911a44caf29392 100644 GIT binary patch delta 14 VcmX?We%5@03Kyf}W>u~gf&eL-1jGOU delta 14 VcmX?We%5@03KwJIW>u~gf&eO81mpk! diff --git a/out/test/sp21-cs242-assignment1/PlayerTest.class b/out/test/sp21-cs242-assignment1/PlayerTest.class new file mode 100644 index 0000000000000000000000000000000000000000..014a5f9933fb477faa6762523256715174095f82 GIT binary patch literal 2482 zcma)8TW=I)7=FGzblUBd?iRM3isjH^50pj07HBEdaw={qwxxvv>U4J~Q>HWP>?~N1 zH{N)KiID_iH1UQ@qLRf(qFx(KjQkrz#OIxzZMQ&-7oGj)``+(8JkRsK)8GF2>1P0g z_$Yx0q8eg4;;2(dE*dwCjBPjznTh#DGv_PR4Ox!m4=Y5wx@R=hE5uG2OJ)KZ5^}4N z8(m}FGY#Bm(y<QB3R=N7mQAmykj@4kOTJ}iMm*10&RRu(Fo6_WG_2RL0cnNxFR)>} z1(V^^^j+~$lhvSxjm+#^5G8?DY}T<wGHJ+r#?4W~%NJ$0O~*F8q|kKLa`IVo!La2> zVPjY5@|m<WY*$FFLNMm|=7Q-Z(2kutcA-O|-g5jI!!DTt9%BvIjh8ia>F7p}LZXt< zv{_{4>pP5M(e!-Fb&AKWqA_oqjIHJ*vpqWcu$MM&LC)pc#7)P{SMn1)=QQk7*tD9= zNY&X1&vThm22p{0zm5ZVO`&;#q{#Jg!!ejNtIpQE67m5Y)Nn}0VS%Kv=1gH7p=OFX zUO#8q<hB(<I*y28J&(kefVShPj$;@hzc&PeiK_~&Yv~CQ3kV+7aU3V;A?G^2VL76P zuIH)jCLjYirQ>vvR~Syxkn+yxcmr95xL2~JsAP7Mi&1*?T$?+LbQTjD&gpm)ldNRz zF$=Yd<jcwn#Kfd4TcK!hY)%5VVp_*}%rLbI6URgSj5y&9s-AWlF6g)@9nv5;Px*%D zOL~`dT*ehj(Q`{qo)xOG1m4Cw8Vnut;<tH~!BLxnAY^&7XnAISg;09)OFW2;x_RoV zIcquQ+0xRy=}n7h6k4)w&ah_;&yx3WGv;5jcu5Zn63q=Nw9D^#%1+9hwQT#8JMGp` z%P3L+GtNpE^G01E=pyn|g@!t|tIfg)36aILTLDm6EMRRq%Y|x6JuhnZp&H7o@)%~^ zCYGJMK5i7kdNxm%9N$_pXRM;dDn}g0B`(rD3T;`}TgWVyIEeTxSib3HjDnR3i%$D2 zdLrl~;ctbzR3PY}yZ{QBC+i$D7!YF>Sybz1XKoQM0?MfE7R}jfX3&<VH)}ZrXDDZf zb1*UGmb{#Kk_shR6*);FdxdFi=R}BbwyNYNnF(CQgTFc`<haW4SIJJ#L#Xe#h#=3W z9D~!)<WsL0;3^jQ23+H5L@uk#h;j|wjt*^2=D)?~kDy(QJw(I!o(IsQWh8$^>)F2K zt7UBJD`V^7*ydPex4n!V{qgV7c^4b{((y8S@1pS$G8Z4>m0yDG9dyBa{j2ur_&3kk zY@yS^bo@sQm+|_Y)x%Gfy7#mo)x?5o_M(yNHq>+ertlJ<?Hr#w2*^(MdM8`93m$rL zi#A_!5=zy>tSp6(VPTQgZsYlN*sQmkI4q%=o(FIN4z3W;2)=;Jm0)%|#HqlwAXl+} zm-ZfadJunth<eH?Qm0|J(x7Q*)sW)VT~8T4BD=uf^jf67@Zj?oD6OFWHGOH^c^snt z#|u%fz;|*LzWx}u#`@C2z<7V0&`tH%rQ>%n8{nNx*ZmI)V$V`=CZHfzrC@LkhxA#) zN)V<(S!iDqFraL|P!<g+JIpUP&`-(+NW(!Aa0vVOtvJH}5=Qwvjib24>Hi5v@D&I9 zeVoAWwEv4ILf>gZl)|GG`tFDH?W6S#QWc|*TevBN(BEfxk1LV&pDRQ@4v7@ndZATl zyC8g3X;VsAYis#W-j=Jpk<Tat0G(C7vc2UH{0+SiFqhP7z+FY6g}H)XlLkzp2~+66 zbWmYy#aWnT1GOVkRe{Xvp`M_F;#wo3db}S9O8WjlAXXsNvb&78?m~;*LoE6OI-j2b R0su9xACpP(0be5c@L!QlDV6{L literal 0 HcmV?d00001 diff --git a/out/test/sp21-cs242-assignment1/RuleControllerTest.class b/out/test/sp21-cs242-assignment1/RuleControllerTest.class index 9999d71a7bba788c9c2c9c63cffae4034f977b94..793251c85707ab4b1dbfc5249475c7a9f8342b6a 100644 GIT binary patch literal 11480 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 delta 3938 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 diff --git a/out/test/sp21-cs242-assignment1/cardDealTest.class b/out/test/sp21-cs242-assignment1/cardDealTest.class index 33cd2ce1b1236cb0a8e86a00b7ae092483bc6674..5c5c2ef16a4255dd6527815e558eee16eaf2d000 100644 GIT binary patch delta 222 zcmWNL%}N3R6otRp$PBI3ncPX5S{YUfE)>n*CIgK?=tl!970oAbAqpb6l9quBeSu&$ zZrb<|G8-4ZhftThIQMYwcki`zTmNY~oGw({c+m-AkQXiCvHFgglJKG7=ZIsH1V|I) zi4)#9WxyHVgqd^BiU?~i*m238EB=To1~JQ2Yf3aNE3R>p;gBpoawI5H;D!fG9=W9< zzRevY%1o%R;NIG5T_yf3=!>8=LF@9vD=8T^<$jfSNj{_+bZIfB!&JH@pZwDM8Xj!^ E0nOJblK=n! delta 222 zcmWNLJ4=EA7=@p25ykn-FUQP8O}tb?gIDl^cv*x}E4xTq_!Ar?K?J903>@qa2;bt; z;*SuQ2LDH(hZo+L1Lr*F-CA2~*>jjCPL4RiLkNq4ZUwJBbbJ~~A1+Qceo~x~B|w`X zT^UD&`R1HC5mrQ56Jtl5e-iAuFpjyj%gzVmDkVf3lMG$~{NzZIr>LHWc8d}((r=U* zQ)Nnx1$Fz+H88Gk6>TcoQnan^J3%@!K61ko_dN3|J<vZBdd%qaBhWAJUmxzx0iH)G A2LJ#7 diff --git a/src/Test/PlayerTest.java b/src/Test/PlayerTest.java new file mode 100644 index 0000000..62be5d0 --- /dev/null +++ b/src/Test/PlayerTest.java @@ -0,0 +1,85 @@ +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.*; + + +/** + * The last part of test: + * Test the behavior of player when they ACTUALLY PLAY A CARD + * <p> + * Dependency: Game, ruleController (all test done), cardManager, CmdUI, GUI + * <p> + * Notice ruleController only judge validity & do update in game state + * and pass them as information for player. Thus whether player could behave + * correctly with given information should be tested. + */ + +class PlayerTest { + + @Test + /** + * Test when a card is played, it goes to the discard pile + * Run 100 times to cancel randomness + */ + void TestUserPlayWillGoToDiscardPile() { + for (int i = 0; i < 100; i++) { + Game game = new Game(1); + Player player = game.players.get(0); + player.drawCards(50); + + ArrayList<Integer> legalCards = player.findLegalCard(); + int cardToPlay = legalCards.get(0); + + // make sure this play is legal + assert (player.optionPlayOwnedCard(cardToPlay)); + + // make sure the top of discard of pile is the card just played + assert (game.gameCardManager.getDiscardPile().get(0) == cardToPlay); + + //make sure the player does not own this card anymore + assert (!player.getCards().contains(cardToPlay)); + } + } + + + /** + * Test the situation where player choose to draw a card + * Run 100 times to cancel randomness + */ + @Test + void testOptionDrawAndPlay() { + for (int i = 0; i < 100; i++) { + Game game = new Game(1); + Player player = game.players.get(0); + int cardPlayerWillGet = game.gameCardManager.getCardPile().get(0); + boolean newCardIsValid = game.ruler.isValidPlay(player, cardPlayerWillGet, false); + boolean played = player.optionDrawCardAndPlay(); + + if (newCardIsValid) { + // player should immediately play the card + assert (played); + assert (game.gameCardManager.getDiscardPile().get(0) == cardPlayerWillGet); + assert (!player.getCards().contains(cardPlayerWillGet)); + + } else { + assert (!played); + assert (player.getCards().contains(cardPlayerWillGet)); + } + } + } + + + @Test + /** + * Test 3 + * Test game will end when a user wins + */ + void testGameCloseWhenPlayerWin() { + Game game = new Game(1); + game.gameStart(); + assert(game.rounds == 7); + } +} \ No newline at end of file diff --git a/src/Test/RuleControllerTest.java b/src/Test/RuleControllerTest.java index ddae6d4..2760713 100644 --- a/src/Test/RuleControllerTest.java +++ b/src/Test/RuleControllerTest.java @@ -255,16 +255,12 @@ class RuleControllerTest { RuleController ruler = new RuleController(); Player player = playerAllCards(); // a player who owns all cards - setCurrentState(ruler, "red", "none", "8", 0); - - ArrayList<Integer> validByRuler = getAllLegalCardsByRuler(ruler, player); - ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player, - ruler.getMatchableColor(), ruler.getMatchableNumber(), ruler.getMatchableSymbol()); - // current player plays red 0 + setCurrentState(ruler, "red", "none", "8", 0); ruler.isValidPlay(player, 25, true); assert(checkStateUpdatedCorrectly(ruler, "red", "none", "0", 0)); + // current player plays red skip card setCurrentState(ruler, "red", "none", "8", 0); ruler.isValidPlay(player, 20,true); @@ -356,6 +352,49 @@ class RuleControllerTest { } + /** + * 13. Test checkSkipAndDraw + * If a player should be skipped this round, he should then draw the cumulative penalty cards + * Behavior of card Manager is also checked in this test case + */ + @Test + void testCheckSkipAndDraw() { + Game game = new Game(1); + Player player = player_AllColor_Y_WildDraw4_Y(); // he cannot play wildDraw4 anyway + player.playerID = 2; + player.gameController = game; + player.ruler = game.ruler; + + // case 1: Red skip - player should not be skipped + int playerNumCheckPoint1 = player.getCards().size(); + int pileNumCheckPoint1 = game.gameCardManager.numCardLeft(); + setCurrentState(game.ruler, "red", "skip", "none", 3); + assert(game.ruler.checkSkipAndDraw(player)); + assert(player.getCards().size() == playerNumCheckPoint1); + assert(game.gameCardManager.numCardLeft() == pileNumCheckPoint1); + + // case2: Blue draw2 - player should be skipped and draw 2 + int playerNumCheckPoint2 = player.getCards().size(); + int pileNumCheckPoint2 = game.gameCardManager.numCardLeft(); + setCurrentState(game.ruler, "blue", "draw2", "none", 1); + game.ruler.increasePenaltyDraw(2); + assert(game.ruler.checkSkipAndDraw(player)); + assert(player.getCards().size() == playerNumCheckPoint2 + 2); + assert(game.gameCardManager.numCardLeft() == pileNumCheckPoint2 - 2); + game.ruler.resetPenaltyDraw(); + + + // case3: wildDraw4 - player should be skipped and draw 4 + int playerNumCheckPoint3 = player.getCards().size(); + int pileNumCheckPoint3 = game.gameCardManager.numCardLeft(); + setCurrentState(game.ruler, "blue", "draw2", "none", 2); + game.ruler.increasePenaltyDraw(4); + assert(game.ruler.checkSkipAndDraw(player)); + assert(player.getCards().size() == playerNumCheckPoint3 + 4); + assert (game.gameCardManager.numCardLeft() == pileNumCheckPoint3 - 4); + game.ruler.resetPenaltyDraw(); + + } @@ -433,7 +472,7 @@ class RuleControllerTest { * @return */ private Player player_Red_N_WildDraw4_Y() { - Player player = new Player(0, null); + Player player = new Player(0, null, true); player.addOneCard(26); // green 1 player.addOneCard(51); // blue 1 player.addOneCard(76); // yellow 1 @@ -448,7 +487,7 @@ class RuleControllerTest { * @return */ private Player player_AllColor_Y_WildDraw4_Y() { - Player player = new Player(0, null); + Player player = new Player(0, null, true); player.addOneCard(1); // red 1 player.addOneCard(26); // green 1 player.addOneCard(51); // blue 1 @@ -463,7 +502,7 @@ class RuleControllerTest { * This player should not be able to play wildDraw4 card */ private Player playerAllCards() { - Player player = new Player(0, null); + Player player = new Player(0, null, true); for (int i = 1; i <= 108; i++) { player.addOneCard(i); } @@ -485,6 +524,9 @@ class RuleControllerTest { ruler.setNextPlayerSkiplevel(level); } + /** + * check all game states are correct based on passed ground truth + */ private boolean checkStateUpdatedCorrectly(RuleController ruler, String truthColor, String truthSymbol, diff --git a/src/Test/cardDealTest.java b/src/Test/cardDealTest.java index 130070a..ef4a56a 100644 --- a/src/Test/cardDealTest.java +++ b/src/Test/cardDealTest.java @@ -15,7 +15,8 @@ class cardDealTest { @Test /** - * Test card manager can initialize 108 cards correctly + * Test 1 + * make sure card manager can initialize 108 cards correctly */ void testInitialization() throws Exception { CardManager cardManager = new CardManager(); @@ -27,6 +28,7 @@ class cardDealTest { @Test /** + * Test 2 * Given n players, test behavior of initial deal, as well as behavior of draw pile * dependencies: Player.drawCards, CardManager.* */ @@ -54,6 +56,7 @@ class cardDealTest { @Test /** + * Test 3 * Test the behavior of Player.drawCards * under the condition where draw pile is not enough to draw, should draw from discard pile instead * case 1: completely draw from discard pile @@ -80,6 +83,7 @@ class cardDealTest { @Test /** + * Test 4 * Test the behavior of Player.drawCards * under the condition where draw pile is not enough to draw, should draw from discard pile instead * case 2: partially from draw pile, partially from discard pile diff --git a/src/UNO/CardManager.java b/src/UNO/CardManager.java index 949e588..5c8da46 100644 --- a/src/UNO/CardManager.java +++ b/src/UNO/CardManager.java @@ -87,9 +87,15 @@ public class CardManager { public int numLeftDiscardPile() { return discardPile.size(); } /** - * get all the cards currently in card pile as a Array list + * get all the cards currently in draw pile as a Array list */ public ArrayList<Integer> getCardPile() { return cardPile; } + /** + * get all the cards currently in discard pile as a Array list + */ + public ArrayList<Integer> getDiscardPile() { return discardPile; } + + } diff --git a/src/UNO/CardParser.java b/src/UNO/CardParser.java index b5d740b..f43ce3a 100644 --- a/src/UNO/CardParser.java +++ b/src/UNO/CardParser.java @@ -110,7 +110,7 @@ class CardParser { * judge whether a card is a wild card - that is, whether user can decalre a color * @param cardID id of card */ - public boolean isWildCard(int cardID) { + public boolean isNonColorCard(int cardID) { return cardID > COLORED_CARD_NUM; } } \ No newline at end of file diff --git a/src/UNO/CmdUI.java b/src/UNO/CmdUI.java index 9da9702..d73f23c 100644 --- a/src/UNO/CmdUI.java +++ b/src/UNO/CmdUI.java @@ -1,5 +1,9 @@ import java.util.Scanner; + +/** + * Prepared for assignment 1.1 + */ public class CmdUI { Player player; CardParser parser; @@ -70,8 +74,7 @@ public class CmdUI { } } - if (parser.isWildCard(cardID)) { - // to implement + if (parser.isNonColorCard(cardID)) { int colorChosen = -1; while (colorChosen < 0) { promptChooseColor(); @@ -90,7 +93,7 @@ public class CmdUI { player.getCards().remove(chosenCardIndex); gameController.gameCardManager.insertOneCardToDiscardPile(cardID); - if (parser.isWildCard(cardID)) { + if (parser.isNonColorCard(cardID)) { // to implement int colorChosen = -1; while (colorChosen < 0) { diff --git a/src/UNO/Game.java b/src/UNO/Game.java index 7d5ec00..b42773b 100644 --- a/src/UNO/Game.java +++ b/src/UNO/Game.java @@ -10,7 +10,7 @@ public class Game { private static CardParser parser = new CardParser(); private static final int INIT_DRAW = 7; // every player get 7 cards at beginning - private int rounds = 1; + public int rounds = 1; public RuleController ruler; public CardManager gameCardManager; public ArrayList<Player> players; @@ -31,7 +31,7 @@ public class Game { // playerID starts from 0 !!!!! for (int i = 0; i < playerNum; i++) { - Player player = new Player(i, this); + Player player = new Player(i, this, true); player.drawCards(INIT_DRAW); players.add(player); } @@ -63,7 +63,7 @@ public class Game { * Run one round of UNO * very import function ! */ - private void runOneRound() { + public void runOneRound() { ruler.reportCurrentState(this); System.out.println("It's now Player " + (currentPlayerID + 1) + "'s turn..."); Player currentPlayer = players.get(currentPlayerID); @@ -72,9 +72,21 @@ public class Game { } public void gameStart() { - while (rounds <= 2) { - System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<< Round" + rounds + " >>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); - runOneRound(); + + // left for assignment 1.1 +// while (rounds <= 2) { +// System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<< Round" + rounds + " >>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); +// runOneRound(); +// updateNextPlayerID(); +// rounds++; +// } + + while (true) { + Player currentPlayer = players.get(currentPlayerID); + currentPlayer.runOneRoundForTesting(); + if (currentPlayer.playerWin()) { + break; + } updateNextPlayerID(); rounds++; } diff --git a/src/UNO/Player.java b/src/UNO/Player.java index cbf50ab..4aa2296 100644 --- a/src/UNO/Player.java +++ b/src/UNO/Player.java @@ -1,24 +1,24 @@ -import java.lang.reflect.Array; +import javax.xml.stream.FactoryConfigurationError; import java.util.*; public class Player { public static CardParser parser; private final ArrayList<Integer> cards; public int playerID; - public static Game gameController; - public static RuleController ruler; + public Game gameController; + public RuleController ruler; public CmdUI prompterCmd; public GUI prompterGUI; - public Player(int ID, Game game) { + public Player(int ID, Game game, Boolean useCmdAsUI) { playerID = ID; - cards = new ArrayList<Integer>(); + cards = new ArrayList<>(); gameController = game; ruler = (game != null) ? game.ruler : null; // for testing purpose parser = (game != null) ? RuleController.parser : null; - prompterCmd = new CmdUI(this); - prompterGUI = null; + prompterCmd = useCmdAsUI ? new CmdUI(this) : null; + prompterGUI = useCmdAsUI ? null : new GUI(this); } /** @@ -37,7 +37,7 @@ public class Player { System.out.println("\n\n==================================================================="); System.out.println("Currently have " + cards.size() + " cards:"); for (int i = 0; i < cards.size(); i++) { - System.out.println("[" + (i + 1) +"] " + parser.parseCardID(cards.get(i))); + System.out.println("[" + (i + 1) + "] " + parser.parseCardID(cards.get(i))); } System.out.println("===================================================================\n\n"); @@ -48,7 +48,8 @@ public class Player { } /** - * iterate through cards and see if any of the player's cards are playable + * iterate through cards and see if any of the player's cards are playable + * * @return an array list of legal cards */ public ArrayList<Integer> findLegalCard() { @@ -60,7 +61,8 @@ public class Player { } /** - * iterate through cards and see if any of the player's cards are playable + * iterate through cards and see if any of the player's cards are playable + * * @return an array list of the **indices** of legal cards from all cards */ public ArrayList<Integer> findLegalCardIndex() { @@ -81,7 +83,7 @@ public class Player { System.out.println("\n\n==================================================================="); System.out.println("The following cards are playable in current turn:"); for (int i = 0; i < legals.size(); i++) { - System.out.println("[" + (i + 1) +"] " + parser.parseCardID(legals.get(i))); + System.out.println("[" + (i + 1) + "] " + parser.parseCardID(legals.get(i))); } System.out.println("===================================================================\n\n"); @@ -93,9 +95,9 @@ public class Player { } - /** * getter for cards (private attribute for tracking all cards owned by a player) + * * @return the cards of the player */ public ArrayList<Integer> getCards() { @@ -104,6 +106,7 @@ public class Player { /** + * Prepared for assignment1.1 * Caller for player to play one round * skip, draw, play ... all behavior will be handled by this function */ @@ -116,10 +119,11 @@ public class Player { } /** - * Playing with cmd as UI + * Prepared for assignment1.1 + * Playing with cmd as UI */ public void playOneRoundCmd() { - if (ruler.checkSkipandDraw(this)) { + if (ruler.checkSkipAndDraw(this)) { prompterCmd.printForcedSkip(); } else { prompterCmd.promptTakeAction(); @@ -128,10 +132,11 @@ public class Player { } /** - * TO BE IMPLEMENTED... + * Prepared for assignment1.2 + * TO BE IMPLEMENTED... */ public void playOneRoundGUI() { -// if (ruler.shoudPlayerBeSkipped(this)) { +// if (ruler.shouldPlayerBeSkipped(this)) { // prompterGUI // } else {} @@ -144,4 +149,69 @@ public class Player { cards.add(cardID); } + /** + * For Assignment1.0 only + * Implement the logic of player playing a card. + * + * @Return whether this player successfully played the indicated card + */ + public boolean optionPlayOwnedCard(int cardID) { + if (ruler.checkSkipAndDraw(this)) { + return false; + } else { + + if (ruler.isValidPlay(this, cardID, true)) { + // maintain list-cards and discardPile + cards.remove(cards.indexOf(cardID)); + gameController.gameCardManager.insertOneCardToDiscardPile(cardID); + + if (parser.isNonColorCard(cardID)) { + // instead of choose colors + // we will forcefully set it to red for assignment 0 to make testing easier + ruler.setMatchableColor(parser.colorDict.get(1)); + } + + return true; + } + return false; + } + } + + /** + * For Assignment1.0 only + * Implement the logic when player choose to draw a card + * + * @Return whether this player successfully played the newly drawn card + */ + public boolean optionDrawCardAndPlay() { + if (ruler.checkSkipAndDraw(this)) { + return false; + } + drawCards(1); + int chosenCardIndex = getCards().size() - 1; + int newCard = cards.get(chosenCardIndex); + + if(ruler.isValidPlay(this, newCard, true)) { + cards.remove(chosenCardIndex); + gameController.gameCardManager.insertOneCardToDiscardPile(newCard); + + if (parser.isNonColorCard(newCard)) { + // instead of choose colors + // we will forcefully set it to red for assignment 0 to make testing easier + ruler.setMatchableColor(parser.colorDict.get(1)); + } + + return true; + } + return false; // played will be skipped + } + + public boolean playerWin() { + return cards.isEmpty(); + } + + public void runOneRoundForTesting() { + cards.remove(0); + } + } \ No newline at end of file diff --git a/src/UNO/RuleController.java b/src/UNO/RuleController.java index c84d310..7113e49 100644 --- a/src/UNO/RuleController.java +++ b/src/UNO/RuleController.java @@ -39,7 +39,7 @@ public class RuleController { * @param player the pending player * @return bool */ - public boolean checkSkipandDraw(Player player) { + public boolean checkSkipAndDraw(Player player) { if (nextPlayerSkipLevel == 3) { assert cumulativePenaltyDraw == 0; nextPlayerSkipLevel = 0; // the next player should no longer be skipped -- GitLab