From 521fac6e08804acc6674c36e3d5a92fc1de3211c Mon Sep 17 00:00:00 2001 From: Marshall Date: Sat, 31 Mar 2012 14:18:08 -0400 Subject: [PATCH] -The rest of the game engine. I screwed up the commit last time. --- bin/controller/PlayerController.class | Bin 0 -> 1332 bytes bin/img/blue.png | Bin 0 -> 3400 bytes bin/img/green.png | Bin 0 -> 3677 bytes bin/img/none.png | Bin 0 -> 2858 bytes bin/img/red.png | Bin 0 -> 3399 bytes bin/img/yellow.png | Bin 0 -> 3520 bytes bin/model/Board$TileColor.class | Bin 0 -> 1164 bytes bin/model/Board.class | Bin 0 -> 2713 bytes bin/model/CellPointer.class | Bin 0 -> 380 bytes bin/model/ComController.class | Bin 0 -> 410 bytes bin/model/Move.class | Bin 0 -> 736 bytes bin/model/Referee$Message$1.class | Bin 0 -> 584 bytes bin/model/Referee$Message$2.class | Bin 0 -> 562 bytes bin/model/Referee$Message$3.class | Bin 0 -> 552 bytes bin/model/Referee$Message$4.class | Bin 0 -> 582 bytes bin/model/Referee$Message.class | Bin 0 -> 1414 bytes bin/model/Referee.class | Bin 0 -> 3052 bytes .../comController/RandomComController.class | Bin 0 -> 1249 bytes .../BoardPanel$BoardPanelMouseListener.class | Bin 0 -> 1309 bytes bin/view/BoardPanel.class | Bin 0 -> 2975 bytes bin/view/MainFrame.class | Bin 0 -> 3405 bytes bin/view/MessagePanel.class | Bin 0 -> 911 bytes bin/view/ScorePanel.class | Bin 0 -> 1047 bytes bin/view/TileSelectionPanel$1.class | Bin 0 -> 1427 bytes bin/view/TileSelectionPanel$2.class | Bin 0 -> 1428 bytes bin/view/TileSelectionPanel$3.class | Bin 0 -> 1426 bytes bin/view/TileSelectionPanel$4.class | Bin 0 -> 1429 bytes bin/view/TileSelectionPanel.class | Bin 0 -> 4485 bytes src/controller/PlayerController.java | 40 +++ src/img/blue.png | Bin 0 -> 3400 bytes src/img/green.png | Bin 0 -> 3677 bytes src/img/none.png | Bin 0 -> 2858 bytes src/img/red.png | Bin 0 -> 3399 bytes src/img/yellow.png | Bin 0 -> 3520 bytes src/model/Board.java | 163 ++++++++++++ src/model/CellPointer.java | 11 + src/model/ComController.java | 13 + src/model/Move.java | 21 ++ src/model/Referee.java | 154 ++++++++++++ .../comController/RandomComController.java | 48 ++++ src/view/BoardPanel.java | 120 +++++++++ src/view/MainFrame.java | 134 ++++++++++ src/view/MessagePanel.java | 33 +++ src/view/ScorePanel.java | 33 +++ src/view/TileSelectionPanel.java | 236 ++++++++++++++++++ 45 files changed, 1006 insertions(+) create mode 100644 bin/controller/PlayerController.class create mode 100644 bin/img/blue.png create mode 100644 bin/img/green.png create mode 100644 bin/img/none.png create mode 100644 bin/img/red.png create mode 100644 bin/img/yellow.png create mode 100644 bin/model/Board$TileColor.class create mode 100644 bin/model/Board.class create mode 100644 bin/model/CellPointer.class create mode 100644 bin/model/ComController.class create mode 100644 bin/model/Move.class create mode 100644 bin/model/Referee$Message$1.class create mode 100644 bin/model/Referee$Message$2.class create mode 100644 bin/model/Referee$Message$3.class create mode 100644 bin/model/Referee$Message$4.class create mode 100644 bin/model/Referee$Message.class create mode 100644 bin/model/Referee.class create mode 100644 bin/model/comController/RandomComController.class create mode 100644 bin/view/BoardPanel$BoardPanelMouseListener.class create mode 100644 bin/view/BoardPanel.class create mode 100644 bin/view/MainFrame.class create mode 100644 bin/view/MessagePanel.class create mode 100644 bin/view/ScorePanel.class create mode 100644 bin/view/TileSelectionPanel$1.class create mode 100644 bin/view/TileSelectionPanel$2.class create mode 100644 bin/view/TileSelectionPanel$3.class create mode 100644 bin/view/TileSelectionPanel$4.class create mode 100644 bin/view/TileSelectionPanel.class create mode 100644 src/controller/PlayerController.java create mode 100644 src/img/blue.png create mode 100644 src/img/green.png create mode 100644 src/img/none.png create mode 100644 src/img/red.png create mode 100644 src/img/yellow.png create mode 100644 src/model/Board.java create mode 100644 src/model/CellPointer.java create mode 100644 src/model/ComController.java create mode 100644 src/model/Move.java create mode 100644 src/model/Referee.java create mode 100644 src/model/comController/RandomComController.java create mode 100644 src/view/BoardPanel.java create mode 100644 src/view/MainFrame.java create mode 100644 src/view/MessagePanel.java create mode 100644 src/view/ScorePanel.java create mode 100644 src/view/TileSelectionPanel.java diff --git a/bin/controller/PlayerController.class b/bin/controller/PlayerController.class new file mode 100644 index 0000000000000000000000000000000000000000..56e2858c41176f39c18dc62b3019264f6d6e4266 GIT binary patch literal 1332 zcmaJ<+fEZv6kVs&cG@xmEwo&UP!ORVgnGei5s^ldCRK?d5uY5U6C5&hl4-&4Pd=!z zA(6xn@S}|D%+#S)@#S3h*=y}}_S!#we)|sK7OE;D0(sMIwmsKzEU&!f7$=rj4Ff8o z0>cN!u~Bx6=6?Cb-hpMd1)`?qI07T}L$_f$&mUhToC1VN-hBOR7Q;`-(|5YW0VT{OxQIZvF zwbD)!0yzya#FH4uq>2fFY=G;luOW{F3vJe4Kar@*8dN0YX+}d5DS@H7-L#$`9qw7) zwz20}0-3sN8qSX4+49~EM%(Z07V-7}G?1T7G_2;yGxwM@iG8c>_dsBxSh}!1D$@eM zV3;NE6&1QbD)^NQq)@^&*@k6-<>EigxS)h=v}(6r1}?Di^g(S=8+}Z&wKp|R$144y zi=rkYcQoAfBPNaV+z(voGJhmdf!&k81@!g1BC9E;L$1^-_sBD?ryK>k(?4u0a?S*_ zTC>R+bc|NZYN>cEFwoQ@YZ@^k*Mm;F@E;RS;=&YrE{`CO_pkMJ%rhiaK%^AuV(sVpPGCR_*~6(jCR$$qjqUgPKwBP za6|4>9o*KVf3!M7)xZoJUEsLQAKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0007WNkl1_lZNn@|^pi4qx*Nk&F%KZEeG`XP!Pbi`3N9KZ>+ zP7o$Bm5L4^9EZNV*WvQgmU3wfH)n*LUr4w)=YN3+pBMllilQtQ+l%rqx5NEPTs-hM zzrQgY!Zcx;7!L9JimxvKNTra=A)kjVLza=xBOd37dw<96E!u6|-=p8hbjto%I*oD} zr>8hOL%j}B3Y2Z$se=R3G@8xU#w`}4X(R}t$(#}d(llBu z*25V_n7^63B#8`T4P38BmC8nBPE{)O@DK<$nb5_>24zk)8Y}OY|KW5!_^sjVerdIQ z;w+0)b>lLpRFy2t5AN!UvRO{JOopzn**L~jGN0q-29pV=(ZjaUZeu?8HZqMy=ybS_ zMx72uBX78;C-nPVagUF9e)fiYdBNu=SKM?8)AWWL47M=zGMh4RZ*N<`jmO?_&a}<> zFq`hN2IB~CUxKg&2eT;ym&L9Mg5({|;f>)M)TnaBMrO zt6{IV#!`KG8P%ma>T$#-f*eT-Dadh0VAX2$A~5&=BZ}dn`+m{&AhGNDIqCY!TVoY2 z$n%nA;qJ~yV67;q*Rj9v`*|t&+t*@&!QfxiKOX;CDE~(N#Uf-Gg+jone=XeZVQz=} eg}6wcp8){7+xkpWY>dGG0000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000AsNklNzYNIV-n zDnpNpo=rT!#T$Pv5WqwO7>)cnxN!hGc3=x`VQkEGrEXnU55#1eB5l_-i`jQx^L}}+ z{l52o1E7in0swFvSB)|Vf~$GwYPkOrr^B0V z-L{cI=VOPyLrxqAxb4{d9PvC#2FrZMTlC%`_tQ?>5Ck9@a4g4sID9ip_{e-hmTyq6 zu?*vreU5Pzgp`FVa>e(Duix%H$+KrN<_L|de$?Z?>v#lTT%s;7Upw)IS;8l;3;>X4 z&t?hVPJBUn5j51GS!_p{j{Ij5Q<|t zW;gMUF8ojiM;9`|<5iYp1mRNj(Ls7k$*a*pdMiaA3BtvwZ{M?fO5(m}_hS?x2p6Xg zaxA4JF2`o$R7emmNk^2w^ztqW^X2ZO@;EYoA_ymYB^7qEXM%7XsFofZ=DYjXEAQZ4 zln1BNG$@bbU6coBMq8A}@h-}PvtsT#6{hT&YHb)U2xr6aCap(FT$8r-8s-v&Goj5c zLzj{`m!ZpyUKfN@K}fr$A5~vfMuw{O?UsJtPK^IP*J|p)jklD+;l|sorXCTOO$;&g z+Q$$Wt+Wh*(O&x)h8V>45MIkbw{5u6xNh69*D@fw!9mr!LFa^B*H$^1UDr0~oIuq& zDSfL$?;XOQ=`@X%DG80k_@qPcmDp4R06MKhBe+i^ceT~1>PK+j4eJBx9X|j7hTuNO z_^8J(9G>(Lpp zV^^o4`;Psg*D~;rZ?jz7?_tI1e(Iy}fpxp3ztz-pQKpp{cOFHKJ)t8dqyCfghO%VT v@3LZUGuk3;)L#~^(oy?ku7<0{pYdw|6%&MTg0x9)00000NkvXXu0mjfczox> literal 0 HcmV?d00001 diff --git a/bin/img/none.png b/bin/img/none.png new file mode 100644 index 0000000000000000000000000000000000000000..482d3ad79db99a419b2e373fa0d82e3068c570ef GIT binary patch literal 2858 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 literal 0 HcmV?d00001 diff --git a/bin/img/yellow.png b/bin/img/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..7ed368787dcd375fec1a47a452e955b305b1c1f1 GIT binary patch literal 3520 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 literal 0 HcmV?d00001 diff --git a/bin/model/Board.class b/bin/model/Board.class new file mode 100644 index 0000000000000000000000000000000000000000..cea2a672574a713e61039407b37f3853547afb56 GIT binary patch literal 2713 zcma)8ZETZO6n@Ta_r7aaWOVE1K0wCjKG_&JWE;3KJ{)u#GT2}f#!FYB(6!ihAW9T) zKO`!MF&cqrSfYywB#JPC7~&uQkSH2sOo)Gs{?VA27!wnM*5|(KMuE+kY`5p0d(Ly7 zd(OG1z46bd*8wa+uL&i{8i@7>!_}*zR;=HIQ;@yaI$%|Yt;p``j$M0$frKEleM?(k zONYNxAgzLFEzw9kVMP*MR(LSzAefP|+0@ZZn{0mcZCcaT(beql>ul{=qfH!wj9og2 zprE(cpB8oA=1@4;5)DUV4FaPv6bU6(3LK?nT>@td*}36>*Mo;J-NZB(1U?Tum}Vkh zFk=j;B^VBGjD{kKV9bp?6lm*0Ml5Y@E$ecj7_&^wq~oMvJ$MAO8LPdceT^W03T|!& zp5wt>%oCXLU_!GNRF$U8(-<^NfuJum-5-hs+Xn}B1!J47T^hmbj|Qx8mlX@?eM;#} z>2xG!M`HXBP~Vxb0{hym{V8*E_c)&-edBbmwCuW=nQ9NpU}$Nv2jwtKED_|` zB_B+L!qv^On03e>iYMHtg;y_i9xTISEQr<5+WAWT_xDFbS&z1>_n-ldtRU^0!(o;= zWoqNHzG3!KC>lwbuk_$?G_h|&teKUF@@9FZWnn1?`4!A4&o;7+FOZ`yBiGS5f_aV=BgiYihP-V>#aHm~MHG#q zWJpPIws9``>ySv17Jm5HhMmuK4vB!kPR!uyg%3F>L@xU>hx5scM&x4wEoP4e#X^*F z=jAzjn3VGQu-U`BPzCiqIFnqI2@&89XPNgl0|+WnmEymSrkcO2{1S4DYKv<>;zmJp z(Rg6=yYXD9cr;JN)6!Tx(Q{x7G^2`1aTDf(2CcY+MYUXNDmyEgfcMoq*HF9d3YNAz z>M~Mdy;ED&86&9FESl)dfm6{1e9iWzc?o!bjpD`(wnlvhDjwvb+I{qIj%nBWA z>dX;Tq;lgkHJydy7xbC;kQp+Wnls4snP-#V=$M+6hT!J|AQh8?$dGAs8;09w>TG@a zU)h?HV%e1Fq?m0CkCD7-lkA_Ga~X5*r|`#2~H<(=|||)jV~+FL3tM6_-uYFlu%m0bs-zQl#j3sEtIm1o%(ep>F#?RdUhV}Rh8^nZP3ehGr zIg1yfQ>w68mSU?c!!~I`kE}(n`06JC&C@S^;VBk~81D&Ux!ftOS+URL=y zt_pEPEx@a45nfYuIH8u~q*{m9)mEHRy?9IQz}w2AegLOc9B0&Xcvqdoduo`U=XrBI zFoyK3R2Rkv2Bi(~>w!Y4jd@j=rB0xonRcLD9m7USPL!xu@FWLM25OkcO_U6TnAtJu z8g-qv?oaA$N!H5KW2fSmowm*-mmF+nv`lOvle~#oT@$go7)uYxAygy@WpY58$TLxF zqLzO`p7YghIPbtMS};6!kZVh6s=xVrN=lS+dAUsU6mredVwNY#(C!B?^;gX*_EnNI Z(=l;M77E?=x|JOT4o=|^7xXk0{0k`IF|hyu literal 0 HcmV?d00001 diff --git a/bin/model/CellPointer.class b/bin/model/CellPointer.class new file mode 100644 index 0000000000000000000000000000000000000000..5c54f1af3d0bb13521c996573b2d707113bdc9b3 GIT binary patch literal 380 zcmZWkO-sW-5Pg%Rsn*!0t>1dkTib&tAEmic(IGjHB}e!YJHIKf^Wo}fJ|@0Cf0%9!g?7nQPg1cG>)J!gr@iihNCGF5pc z5KBvGxgb2#g|5y8wO*R`$AVx;ng)DC5mvA+@O%C7Dg>@2|A-P&&)Wp+Tq_~P(A7=L3i{|;3?T{`9hzUM$ot^=QdXt+EK-S4mox=;E1bz z9_%qv2{UmzmQkqHNox?@vBUMX25(p!>@Uz994rvOvgDyd-$6hh@YOgJqDh)AD~CU0 W*uW+c39!XqS!UbJ+~OS~54+!@fBy``rmQPd6uR=@3VKVmQE8#dMLNlrdR7aX znNihT&>8PU4;J1ET6cMw*Z0&!2RHFl;EveehlAq)9s+?A#nUzf-2hFr1mQR@_49g_ z>FQNwg%MYn#--vz_{fCIm@;AGaAx6t*I*|0}9iuX*5N$_9Hx|-?7 zd^_Pler;dsUec4pkD+C2j9G)Zha<)|(S*3cGfckVC-R9-a>ekmC5DWB3PHL{ahtmf cA3avib~2ohVONL&8Nx3<#gJIYu*1&(0o=S&p#T5? literal 0 HcmV?d00001 diff --git a/bin/model/Move.class b/bin/model/Move.class new file mode 100644 index 0000000000000000000000000000000000000000..169f9e5edabf94fcd2de33b57a9713c78f08be42 GIT binary patch literal 736 zcmZ`$T}vBL5IwW`Sa-8ECaK!A^&?dwNo(`qV@oMrC=}8vC;=Zg>m}WA-IdMi?`okU z_}~xdk19PkyNKBIWoGW2nKLuz{{C}&2jBpEHY|aAo}4K?_?lcP8)d=DG`I=|I*2EO z!|_ywnV=FTI!OiV!@TxW5~OFlCy`dZ0p1C$@IufkU|(r{ltgi+3{-s|#ZmS_u-{#P z|A(ZTeaXMFxW~z5 z8miA!O5m7zZ;iTK;Y%E=)Yrjmre-!eoU~9{8#{v91Bf*Dx}!r0O8iO-O``*&rcs8z zM8tthTjT4L6{fD2BkAQ3b`h=~`BAt9QOfCn*nUf=;WrEA*4@6wZr2Y-M+ z%J^EE7$Z%#vu}51-t7DO{`drNi4z?Ofznb<$!R{&j69;sfP7!hsnXJs6ew)H6xg}8 zT|2lDC|3K=axI&Vbmz@s;MwlH-K&iRl3ljVKtno<6fy$!ZOr~w|8{7w-?v@5UoFSv zJ<72|0%l)Lq%)G99oF$-GFaHYKzX}UrPUTN0<}pdkgwMM=QUsoSWnUpIK4Gfo)s*} znyBT=Dj@I7x0Y&64S~#1t-J}{*HFmC zI2OqLd8~jQ&$?ql@Swsk!7GIwu65pBAsL+;=NG5q9mZS4*yVpFVrH4ejkwM-0tRx} zW8^qEh&}3z;hkn4zA_{b%EJa=(yvsDr5cVRRvrb$P5UD6Ojc?rq1;JFT6FLO5axd1 literal 0 HcmV?d00001 diff --git a/bin/model/Referee$Message$2.class b/bin/model/Referee$Message$2.class new file mode 100644 index 0000000000000000000000000000000000000000..bbf633afd90c09ef72e151bc192a01b52ad0c8e4 GIT binary patch literal 562 zcmZutO;5r=5PeIFEfxHze2DRY2?x+12_{}JhJ>ggDIUadUtolq(k5-;cj?K*gFnC@ zWt^=&Xk?S!nb~>o&By20`v-sv92v+6RF=Vvy!HbW0q_a`Ks|0o(*Qfi{azf#w zoOmQ)JHb?XV;QmOHAmTxX6fc4q0|vfNVc(NcM3I3*fx@4$1dMd6y&43sM4b%Z zEVei{*t>+D{F|p|$KnmqdA5Lw0(RJPJJ?G#T5MHLv-e-vWT5D( g08six)l#a4g9KINEYk92_H1TqsG!=*C0z9I4P_{Hh5!Hn literal 0 HcmV?d00001 diff --git a/bin/model/Referee$Message$3.class b/bin/model/Referee$Message$3.class new file mode 100644 index 0000000000000000000000000000000000000000..dbcf49bc4a68dbd197c849accbb6901e6b5e99fa GIT binary patch literal 552 zcmZut%TB^T6g`&~S}ORcJk^B@7N9{EByKQ<#ArfNT!>*mzzAbXo3zF6(v^t|KfsSN z-j*&jb}@7AojK>+$Jh7ACxAYV4CDy)wZD*V??FDvK+4uwhM`!>R^Nb5sAhf=3RlWg z(KVsgcAmwH=()mM_9juFyyaljnG*CHwzZ(4SVA5ap_|2YGW`d!!JeZ$dB0iDWbi0v zt|ZuwKNs#)1S-zcM?G4pkkHI_YV`*MGxE2c5i0G@|9(x_1Q4u=zX|5@PQ}Ga=|V2z z@wl5?Z|?dbk2jXl%3m;H@spY*iSvWjPajlAG|W;5X<8N!0|7smP$1o YCaemojN9@xj%-$HsG~V7CRz;f18R_S6951J literal 0 HcmV?d00001 diff --git a/bin/model/Referee$Message$4.class b/bin/model/Referee$Message$4.class new file mode 100644 index 0000000000000000000000000000000000000000..1d2b460c3d3a148d46f6ea237907dceda984b878 GIT binary patch literal 582 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 literal 0 HcmV?d00001 diff --git a/bin/model/comController/RandomComController.class b/bin/model/comController/RandomComController.class new file mode 100644 index 0000000000000000000000000000000000000000..936c99cc82ee17c3de8891faf0cbed2ba891cbba GIT binary patch literal 1249 zcmah|+fEZv6kVq+9T)~^MFgZ(KrU?&@P-!(6)6R)0~kP*#Ka6`)Z#Fs!$3@o@xgzQ z#3yYO5=s03Kf+Hz*Xa~2M&l%>XW#eQ`>cLH`1%dNWy~rF2=s3_Yo;|^a5l1z?YWL+ zneOm{VXsL;l}$lNpxF;T<`4+E3>P?|uN&LO@RnD!Dh1L4;jyA!^fCgGgzhI#I)=NJ zPA)Sq%hoD_sMnyNRzU;9{;Z)wLzDDJ1cHg=avj)7Lk+?LO?uHb=e9OhO?SyywM>b@ zDHztW;TEM{F^0Tn#Z7@^1;BqtCG6m;%ZVC}K^9P+n%=Cl%|4BZ!)j7b*CB>83gQAS zRYUeH6)iLCSdOdVEIK*xq<%jq&{|#gcTif6+O6Rndf3V~UwL`kV^SiY%*(0!H1wlQ zpk`HWP(>003Q_{~RV_7~$Dj{XHW%nfYq%lx@JdeC=N~BGzEmHBT!w;ifvB%%P0PCH6m8FRRgB@L ze8&mamY|kZjABw+vI2vL?5N5}|6@&M>X2ldPPjaIo&q0h(K8CqXN?z?S63IEEw^A! zmjm1W!ssDMH32Pe+oqefjLl7xEU7zsG<1PO^RGf$Nxo4EP$pCPTSsk{-T?1tYG4m) zY9HFl9vZ(O`l%e+%-_axfe6zZ5J40tX*=a7p@owCqG&}MOA55(v|n0uv0aG1cO`V_ zf$>0Q2VJSph(^M@=o&wgGL(8_@m(bJff9z^|NJ3c3S&N$OY@=pPma;a)6X-+Ga~Em zprwS1yc$cm!b>UPn!b_%h z3E3{mgoo(HBhvUWdQm_ho*;pBdN(kDmuxSWkn+c?EFpxqm|`YLg*V8tQ-IZ9V}?=? kw;3OSa)5dTF(KkZ;c!@PK2Li9cW{@t%G?-x=o9U~0F3hik^lez literal 0 HcmV?d00001 diff --git a/bin/view/BoardPanel$BoardPanelMouseListener.class b/bin/view/BoardPanel$BoardPanelMouseListener.class new file mode 100644 index 0000000000000000000000000000000000000000..7a35d038ecaed774093ebc5a94a86623d759442e GIT binary patch literal 1309 zcmah|?M~D{6g{)MP$HDxT zzalW`U#MMS=Xw~0=`#V_x#X?Y+`2%a8t+msxETv3`b^|evS49|@g29WJtG!+(W9kN z3kG@wihdZ;=HbB(C2!=8B7u@02U68#5^DX-SkSErxED+Rj}&fLB)kFv>p-(rRblXf zb_H%a{=Zn+&;(W7x``Rg8JOkHE^uIB9=8N~WDrmzqiOas6Rv;2Bq(p2-cdqSF|h#G zfFsa<&S9a9MS{HxnS2MGyNsMr=u3|T{ zT2*YU@?+;A#r+oc8pmmD(T33n1?K*O5G@FSwKIqZogthK5Dz;;EOmf*)EQ#+N{AdD RXAC?+g?BS!X9nxY{RXH<`RD)u literal 0 HcmV?d00001 diff --git a/bin/view/BoardPanel.class b/bin/view/BoardPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..5e509b29d6ef12adb9df6a530f1c8d14f8870529 GIT binary patch literal 2975 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 literal 0 HcmV?d00001 diff --git a/bin/view/ScorePanel.class b/bin/view/ScorePanel.class new file mode 100644 index 0000000000000000000000000000000000000000..91b8f44a0bbf7aa3bdf6d85728066ed7a81df278 GIT binary patch literal 1047 zcmZuwYflqF6g|@x7B-88Qb6ALZVR$1J}IJ7V*+W65v;*)({_M0+g-A|1^iEbF_Dr; z;t%jg8P9At^3XQjy>sWzx#ylU{q_6DPXJ4(7)S|Z4;*!9Z#Miuy_24D4P*pzpXGr( zvcp5i+qE~6e6PT4l2?s(;6z_+*^c(?_i86l;hwC!N?yHpHS}F|XE>GsG7n)XOUAbiz1ZqbGiUrwf%Wo=I_tOdP^{zOc z6RnbO;nH5QCXlJH+(a6A3xgODNEeDV17nxRi#wSZMZO;b6BaBC=xEBq6=Y3DGZtns zM*!Ju3X}>lQ(GQJcExY)`=0Wma`AsjP1^C)+jgt2f~~GXxvJlwK$0?1u_T#^_MA{) zsCvl_4w3Zr#5P!br^+S#t8U7Jxr*VfvO+f+dx7FZd(yF6#2 zh()c1EijS{aqdXDSTk`SO9md$unSsSc!);=eY+}(v0@JE8t;jPr+7vy?$sLoVj zJ(1!Zbi$^rPn0dJ;5oq}ze|=B}-w{kRdp+KZk#GYyxgsWRv4(#H+{T@x z-$J}5TIMS&x|qGpfxI<_700OrL!dzXF4HP|>beJ-K8-24gdaxvM#y$&9Cu-w7w W8B;T!YnJTh&LPkIMSd0cU;6_LwAw%b literal 0 HcmV?d00001 diff --git a/bin/view/TileSelectionPanel$1.class b/bin/view/TileSelectionPanel$1.class new file mode 100644 index 0000000000000000000000000000000000000000..4b449c9088b291c5008455b6e33faabb6802058c GIT binary patch literal 1427 zcmai!eNWR+6vm&+=E_Eei3*N)wdyvMG8ILKye%^^DKdFkqKSXpb=Oh6v`Je)KbA(3 z_=g|B4`n>Jo5QzlS(^5o-u~`6&vWj+|M>b1z&)&M=wrwnIpWydairK5QrMy6xfSjT zX%sZX8Pfawh?|nT4Rf=$PwzD(7$%}DKMqZCB;3&4@D2lEIYB5~;WH${Jtr{c32t?u z7irOw<2vCo!Ll7!<*E$vl2;c=Fr3$+p+AKfhIAy6W{73gf+5Rs#q-01n(%jcO$vr# z%d@$xa^F#LD;ZZsF^qTG%qUP%`hn`CBpv&$s54Aut^ajeR!tXk)fBE^OhblYv_qdd z#xcRr&uv=-fl*+{cj?wTpjM^1CEf^Mh++y;n9(pzt^e^t$5mWoNH#=Rk^H?j-A3hgAP(bz$VhD(73;dz$4K{nHCtx(BH{@LNhG1w^*RBRH5t) zm7oQ{?r#XzMzA*GL2ty%9*Bp%5wCk77JDOjS40etA_X3!NcT8tw}fSS8YWc?tYB?5 I6UjlTpDoo;~M%&-VL|uipUN!>WNUhTO3yPV8+@iY+098+(Dj!F?gE zIRi;XUKw&Z@zez|)Fj58B+1S7g;j|cUsU( zv}n=uy?BXW`If5+I}FKkP!(w~TrgpvCxZm~O{9@!NaWRme#i60`qAO82)FsJ6bu7S z;BvXcLr=wxWKtEyFw$x>YmSOC4^<~+>A7!2m0>*Z{IAoBYPwX|$>1u64dfVxTJ&jR z1fvW++;v41S+fkqHr+ah)T*>M#hwU-C}l8?Ndptq`X4V$T*GySbWOw?lD|`mPvi@Z z8~AY;NGU?Qo-Q{Nr8F$uGH{dON*%Qt@UUtr+slCrLKC->IT16EV zamT}Ue zM7$qVO*~PP*{f!IMV}^`IrD{2=b|h*Z50_<)}<(?wZ7zJ(+5n_peN|+2FqsEywg!l z(UnGqvc2@QfG+w0nc~zZn8h#XdrwgpE~=b(f`SPLNm-ax0t7|RH5t~ zm7)cJ{0+gH2-ZYA=!|&V0r9XiBJO}#=!`gRi%8&+R^Ty8bWf6Yi&&zk0aC@nQ>-lK Iv>cTB37IG?fB*mh literal 0 HcmV?d00001 diff --git a/bin/view/TileSelectionPanel$3.class b/bin/view/TileSelectionPanel$3.class new file mode 100644 index 0000000000000000000000000000000000000000..1f7ed427f5471489e432c7f30d3c6683bfe62835 GIT binary patch literal 1426 zcmai!T~pIQ6o%iWwV@?KMFq>Z8nrD-z>1V+3x zc;Ro+QDnUE2l%5L&!)Bb)pk0W%JTit6nnxA%@uDq5S9~!!WBM4BHVHU zW18Sr3wn_j%{#6WE)Xo+a#e1VAzt#TA_<1$Iy7{r5JR7iB+?AAtXj}#Ij(rHyHgSV z2CqoL&~JG*mz&&oRNP3$RZ$GXtu`|XRFuA>Iw?uVek!UAV_EBeot9P8#oT5JXE3B8 z!!X#QPaVS;Vd&9~R^YB>;Lgk~7ZwgA=@oYpaet4AWy<7jJ<9!E35{Thwea2t1i zd0BQt5|g~_iL5O@b3zr>jb8Q16%~@e!J~myz1dVx&u47>7 zw3>E0s0q4~NKv+jp61X+KOmK#{0u$+1-&0A>cR0pvK|8s z%A*D)lm7($5Q7I8{fP4i$f-DX2=fTqO9cThk;W^U_SX@3AlfL?00SBNH@QY=hS}y8 zv-FiJlpUcGv;cVX8-g_vtckeZ8S%CQ;zno0yAFuC&WQJI5i#716u5;V-Q%R)JQnDw QpHwk$2TO~YNDfN<1Rdfmq5uE@ literal 0 HcmV?d00001 diff --git a/bin/view/TileSelectionPanel$4.class b/bin/view/TileSelectionPanel$4.class new file mode 100644 index 0000000000000000000000000000000000000000..fe89236206e29910f48a9a87f5a174046a828988 GIT binary patch literal 1429 zcmai!T~pIQ6o%iWwV@?KMFq>Z8nrD-Kta(W0-ZYJOb`YTNAH$&Ex{$3NkY+|;f#9W zg%@6UucOF#;ScafIi5{x@vH50GRZmFJbTXjp6&M^U%vskh9wOh44JAU_RS4Pigh7{ z9Xg)7%3UFiX$^6P^bW6bQ*yUru59hldkqPOp(xAuLsL|R8=A}BULY(d2!$(rhD5mS z1jZ!6ttRvWEt+#&C!8l(w&|+eCPTdFl|>Q^$8~7vOd*CI9Z94aVp+AI$8ub8e{Xk7 z_#1pn3Wi?Gv$@>lzN6xLGOmhZ7;LtgF-=A3yQ-6-bnK_1%rKI*{?}!W z8Zr$1P5RU^h#`hfZrdUVj46hEi*Bu5YE_zR;)(EuD5NlgF%6^C`X4WJoW(hYWJQFl zl0R39k7je0?YW`vNhy4@mM%6Dg(M7I)Np~}bPcuSaldRR+l!v`d>xmNB~KoeENkT< z^;0k9uVqwH9+x$Yla4L6({Tk8)O8@jh|VyOZ33)`IH_X_SC4d}$KmEWJ&wkL`xTn7 z!4?Mnva{rdq$k)xJki@PKd>GAIYnNX8K z(^qnB=>?8kSr*~8SJrV`jb@h`?#1Xh(a`DlTsjy<$!V)V!$MSwvO3b2tZW#8F`D!k zUB|%EX*KY4Rugn3k)muDJ_7dZukX(6W;e)&{rz@k&bjBF zdmi68=br!XsWSi;;bR3^0yBCIz0bSZi0I9FL=Ra;EV@yP>JbGlfvG#RUTv2*-e*KR zylWHu9D%tBz8>l^4XfX)^;n(WCVji9$2+z5h%QhN*G)r8n*;i35c}<6MeC0 z+|r^}ix%n8vuTI?2?19-X@P0MF((GKc0E!fklkVGdQ>3Ki2Hg>Q;%9yceB6*Qx6L$ zroLULfWYKnS1hbYq$!fYojLt_BogZrxURUlHL%&YX4~eK^+A8JEmvG0)68(Oblw+> z#7u##tpV;?W<(9EmhP8aqOY`tmil;v8xv5ZVg_c>h?3G41#>QqmTkL&YXq)J_bJe& zb?AXmESiUFQLNxPT5YGmw#5#yit90-&ejLF__qao8yW>B*>Ukkb<4Y@DOlsiT$IS; zO9iHsj9n{jabq?X$kj5Q?W`tqC=aeFZOMZ`g$flDr4=`-SSSy4uWs`D8|@RNz#GemPYt@h4gL-{?%t z@Tq7)E3??4TN@)a3g}Kf-WNVvYx1j zp_>`w;YL)8*clAu!GxuN8J{G*^J;yT*A9t_9`sU%C}k^h>SJ`#4$3YS{kV;bj@J@i zNz*G51(n(`ZUpFnML@8VX2=17(QIjR}r%yeWxXz@Zf?!X>dy>|-CD#?gs zr_8^q;%m5@ZfN1~`dCj~4;pbxk4mu3OLIf-Wy|!A5nvZk@bz&FsdQs6_9(b#9GOLK z?2|J0jU!X##(pVtzrgg-EUh+;aJ|-%Ec*i}l0Yg_@Bp!YsT36ZL{T0e z532YczR$w#pr%gU=;)LqfrvPWAE@}DT*{M6eMZ>ol-wVy_=)6llo;V%lJheaKOg1v zOU^G;{1S(VvOZhkE^1um#sNI4;xRl0?>W)Pj=b9AW5^kpLvBUlZ z8``Lofhe`ovBNkjvwn=nJ5|RneGmgGp2P{xB*PYCnWnTmI|*ljAr-?o>6D-oRK_vQ zIES}hi*opwv_bAUrD6o9StY~{J6@V}$`z;d6NQ!ZkJhlEv0n>Zow6q3t8#@76-Pxp4HWQVyJFWNVl%d%`&t&*6EV*efp#tn``e78wdHkMieLyolYb zNjW?v$9y6pj zIBn+BceM&>qJSERvhsZqEgsi7#y;W@P3xru$LK`|^BCj_{AVK+7^*f!okZt?A?&PpjQTe6FZIeh_Ur^*!S@QOZUA4T z@;)j*ghgajr!%f4qc)u}g^cnP!%mTm^#nWC^)@&vk&h}mbQ2@Fn9n8fp&AYRccKQp zSjKT%%Ym|j17jr~L_Hqj_3u$?IKoh+VtzCctb9C-+p(Kr`Vvo4k^OIUDu@&m6ilRB zydiQ$!mQ5@C9quDID$Lc2!yW;;VzPuBiJj+Z#ZQ22=+0It7AmgAS;M*7I%%{K-)0B6_juv#&po5@5;wRWfKPRBl-Ag+2lbyyr8^n2#;JwjIs%_5gcyIlH4V|&ag52 zN*gOPY|OdR#_9|kl`Czm&9E_dbfX=LLYI{D5Xys|@*zCc>XB|HKPr^V%XyR0C#c5u$ zpJv^kK{tLy?EVIO@LSxCv$zM(@JjG39>6(b^f_Yqd1^e*oi9@IC9Yn;3!FJG;}yJ% zSMd?2%|F-<|B2V}FT8>O;7yT*i$V^U>3B;N;cZcjcSIT9WixnBEXMny1|Ntzd?@^E z;z4{YHsQ~r6`zP(@fTs>ufoLN#O?UIxRaV??NmANOF%Q1Yfsa1-T_5BZTdAUra;8$ z!$j6>q1ZuBCc;&aEAQWlI=Wzw1E6&PXWP!fb*%Lyo;`Egz0Na$7uZu=8xFzMO5!CF z*-7FR5;;lY_au}g@j8iIhiH2eXOGdq0;XUVF0vcVXPdnU4_onKzLzlkKE78m{2Tdp z+KSUhr`hhwJ|^2h3G&w{cdcI{(mW{gZ7(db*^)<-@ zxaA$@%jqifDI*Wf@f2|!r7-0fH7B`;GVj^?-p2=gd+1~YAL37Sg}lQ%zrBg~zQlXK G^Zq}J)NCIB literal 0 HcmV?d00001 diff --git a/src/controller/PlayerController.java b/src/controller/PlayerController.java new file mode 100644 index 0000000..78f51c3 --- /dev/null +++ b/src/controller/PlayerController.java @@ -0,0 +1,40 @@ +package controller; + +import model.Board.TileColor; +import model.CellPointer; +import model.Move; + +public class PlayerController { + private final CellPointer cell = new CellPointer(0, 0); + private TileColor color = TileColor.BLUE; + private boolean ready = false; + + public void denyMove() { + ready = false; + } + + public TileColor getColor() { + return color; + } + + public Move getMove() { + ready = false; + return new Move(cell, color); + + } + + public boolean isReady() { + return ready; + } + + public void setCell(int row, int col) { + cell.r = row; + cell.c = col; + + ready = true; + } + + public void setColor(TileColor clr) { + color = clr; + } +} diff --git a/src/img/blue.png b/src/img/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f1eb446953eaed0388f0b127070aece9a78d50c2 GIT binary patch literal 3400 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 literal 0 HcmV?d00001 diff --git a/src/img/none.png b/src/img/none.png new file mode 100644 index 0000000000000000000000000000000000000000..482d3ad79db99a419b2e373fa0d82e3068c570ef GIT binary patch literal 2858 zcmV+_3)S?AP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00010NklKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0007VNkl1_lZNn}CbLM2QT@BqO7>pF#Lo{Sd_tI^w7s4&a1} z6NE`jrJ@5^jzeGGW4OHBws2_-H)n*LUr4w)=YN3^p9laV3ZpC%*$eY8x5NEPT-5(p zzrQgYqTffqkKqunulV``fJ6eB401Ur3KRvo9HLQyxc7J5-lEmQ{XKd;OsDLRC6g$X zaC(ZfGt_F3Wk0=$|JXJ)o1|$Z%LMS2ER&{@VbI41e=Co;PKO!|ipM>$mMb2oMuR$? zb>kKbGEF);@yS}QN`*|57K=6EW;4=t%4XLfbL-%Mbe(3iz&OVtT_;Ieo6IdqB3&oP z35GMxb^d0{mCcfA2EcW@R4#8s=2p2(4-dX@lL=j1Y*6M_y}s&x`7h2e{NEa$?w4lM zBhIo&(>5-1OVh}*yx^{`D4iCBOQq=gnu%jgCG$CMZZMe$nmueAtrq5UzL9A(Lc1+= zHfpyq8u8(tp3v(F#XUaa`I!&*@`BG#p}6T3{XQRVFxbM>%WBHPy}fM#Hy-oh+-Y0z zVKv=jPR1eLz9eZ25LQzbE|b{;j@6Wf%jdU%V>M;r6a|TdP+2mGVv!G5ETU8riaS0= zp}>bbJVdoB6j!a{=!g#&i$PV9P79KyQczXIV%!^lsE19FW4d8@-yv+9>U9wdj%|l^ zHSBf+EY+8nVO^@j9!G2<$jN5c6yz*NV3kVvBCzHEM;ODy<@?1j{KT&3=VTbGZjDtq zU(ZXHg}XZsfwiilR>S_j*XN}GZ(ojs!QfxiKOX;CDE~(Ng#r`>`MkfVKNxQJFt@|~ dK3u5J&j1iG`b^2Y0}=oL002ovPDHLkV1h-=Rq+4- literal 0 HcmV?d00001 diff --git a/src/img/yellow.png b/src/img/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..7ed368787dcd375fec1a47a452e955b305b1c1f1 GIT binary patch literal 3520 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 uAAuPD-uk5e#^4;bqaSlea7T97ehvU remove = new ArrayList(); + ArrayList hold; + int count; + + // Check up-and-down. + count = 0; + hold = new ArrayList(); + loop: for (int row = cp.r; row >= 0; row--) { + if (board[row][cp.c] == tile) { + hold.add(new CellPointer(row, cp.c)); + count++; + } else { + break loop; + } + } + + loop: for (int row = cp.r + 1; row < NUM_ROWS; row++) { + if (board[row][cp.c] == tile) { + hold.add(new CellPointer(row, cp.c)); + count++; + } else { + break loop; + } + } + + if (count >= ROW_REMOVAL_SIZE) { + remove.addAll(hold); + } + + // Check left-and-right. + count = 0; + hold = new ArrayList(); + loop: for (int col = cp.c; col >= 0; col--) { + if (board[cp.r][col] == tile) { + hold.add(new CellPointer(cp.r, col)); + count++; + } else { + break loop; + } + } + + loop: for (int col = cp.c + 1; col < NUM_COLS; col++) { + if (board[cp.r][col] == tile) { + hold.add(new CellPointer(cp.r, col)); + count++; + } else { + break loop; + } + } + + if (count >= ROW_REMOVAL_SIZE) { + remove.addAll(hold); + } + + // Check descending diagonal. + count = 0; + hold = new ArrayList(); + int row = cp.r; + int col = cp.c; + loop: while (row >= 0 && col >= 0) { + if (board[row][col] == tile) { + hold.add(new CellPointer(row, col)); + count++; + } else { + break loop; + } + + row--; + col--; + } + + row = cp.r + 1; + col = cp.c + 1; + loop: while (row < NUM_ROWS && col < NUM_COLS) { + if (board[row][col] == tile) { + hold.add(new CellPointer(row, col)); + count++; + } else { + break loop; + } + + row++; + col++; + } + + if (count >= ROW_REMOVAL_SIZE) { + remove.addAll(hold); + } + + // Check ascending diagonal. + count = 0; + hold = new ArrayList(); + + row = cp.r; + col = cp.c; + loop: while (row < NUM_ROWS && col >= 0) { + if (board[row][col] == tile) { + hold.add(new CellPointer(row, col)); + count++; + } else { + break loop; + } + + row++; + col--; + } + + row = cp.r - 1; + col = cp.c + 1; + loop: while (row >= 0 && col < NUM_COLS) { + if (board[row][col] == tile) { + hold.add(new CellPointer(row, col)); + count++; + } else { + break loop; + } + + row--; + col++; + } + + if (count >= ROW_REMOVAL_SIZE) { + remove.addAll(hold); + } + + for (CellPointer cell : remove) { + board[cell.r][cell.c] = TileColor.NONE; + } + } + } +} diff --git a/src/model/CellPointer.java b/src/model/CellPointer.java new file mode 100644 index 0000000..8ffd57c --- /dev/null +++ b/src/model/CellPointer.java @@ -0,0 +1,11 @@ +package model; + +public class CellPointer { + public CellPointer(int row, int col) { + r = row; + c = col; + } + + public int r; + public int c; +} diff --git a/src/model/ComController.java b/src/model/ComController.java new file mode 100644 index 0000000..c64ce00 --- /dev/null +++ b/src/model/ComController.java @@ -0,0 +1,13 @@ +package model; + + +public abstract class ComController { + + protected Board board = null; + + public ComController(Board brd) { + board = brd; + } + + public abstract Move getMove(); +} diff --git a/src/model/Move.java b/src/model/Move.java new file mode 100644 index 0000000..db586d6 --- /dev/null +++ b/src/model/Move.java @@ -0,0 +1,21 @@ +package model; + +import model.Board.TileColor; + +public class Move { + private final TileColor color; + private final CellPointer cp; + + public Move(CellPointer cllPntr, TileColor tlClr) { + cp = cllPntr; + color = tlClr; + } + + public CellPointer getCell() { + return cp; + } + + public TileColor getColor() { + return color; + } +} diff --git a/src/model/Referee.java b/src/model/Referee.java new file mode 100644 index 0000000..119c445 --- /dev/null +++ b/src/model/Referee.java @@ -0,0 +1,154 @@ +package model; + +import javax.security.auth.Refreshable; + +import model.Board.TileColor; +import model.comController.RandomComController; +import controller.PlayerController; + +public class Referee implements Refreshable { + + public enum Message { + COM_TURN { + @Override + public String toString() { + return "Waiting for the computer's move."; + } + }, + GAME_OVER { + @Override + public String toString() { + return "Game over!"; + } + }, + NONE { + @Override + public String toString() { + return ""; + } + }, + PLAYER_TURN { + @Override + public String toString() { + return "Waiting for the player's move."; + } + } + } + + private final Board board; + + private final ComController cc; + + private final PlayerController pc = new PlayerController(); + + private boolean playerTurn; + private boolean refresh = true; + private int score = 0; + + public Referee() { + board = new Board(); + cc = new RandomComController(board); + playerTurn = true; + } + + public void doSomething() { + Move mv; + + if (playerTurn && pc.isReady()) { + mv = pc.getMove(); + + if (board.getTile(mv.getCell().r, mv.getCell().c) == TileColor.NONE) { + playToken(pc.getMove()); + + refresh = true; + } + + else { + pc.denyMove(); + } + } + + else if (!playerTurn) { + mv = cc.getMove(); + + playToken(mv); + + refresh = true; + } + } + + public ComController getCom() { + return cc; + } + + public String getMessage() { + if (isOver()) { + return Message.GAME_OVER.toString(); + } + + else if (isPlayersTurn()) { + return Message.PLAYER_TURN.toString(); + } + + else { + return Message.COM_TURN.toString(); + } + } + + public PlayerController getPlayer() { + return pc; + } + + public int getScore() { + return score; + } + + public TileColor getTile(int r, int c) { + return board.getTile(r, c); + } + + @Override + public boolean isCurrent() { + return !refresh; + } + + public boolean isOver() { + for (int r = 0; r < Board.NUM_ROWS; r++) { + for (int c = 0; c < Board.NUM_COLS; c++) { + if (board.getTile(r, c) == TileColor.NONE) { + return false; + } + } + } + + return true; + } + + public void playToken(Move move) { + + board.setTile(move.getCell(), move.getColor()); + + if (playerTurn) { + incrementScore(); + } + + incrementTurn(); + } + + @Override + public void refresh() { + refresh = false; + } + + private void incrementScore() { + score++; + } + + private void incrementTurn() { + playerTurn = !playerTurn; + } + + private boolean isPlayersTurn() { + return playerTurn; + } +} diff --git a/src/model/comController/RandomComController.java b/src/model/comController/RandomComController.java new file mode 100644 index 0000000..b85a472 --- /dev/null +++ b/src/model/comController/RandomComController.java @@ -0,0 +1,48 @@ +package model.comController; + +import java.util.Random; + +import model.Board; +import model.Board.TileColor; +import model.CellPointer; +import model.ComController; +import model.Move; + +public class RandomComController extends ComController { + + private final Random rand = new Random(); + + public RandomComController(Board brd) { + super(brd); + } + + @Override + public Move getMove() { + TileColor tile = TileColor.BLUE; + int r = -1; + int c = -1; + + while (tile != TileColor.NONE) { + r = rand.nextInt(Board.NUM_ROWS); + c = rand.nextInt(Board.NUM_COLS); + + tile = board.getTile(r, c); + } + + switch (rand.nextInt(4)) { + case 0: + tile = TileColor.BLUE; + break; + case 1: + tile = TileColor.GREEN; + break; + case 2: + tile = TileColor.RED; + break; + case 3: + tile = TileColor.YELLOW; + } + + return new Move(new CellPointer(r, c), tile); + } +} diff --git a/src/view/BoardPanel.java b/src/view/BoardPanel.java new file mode 100644 index 0000000..0a7eadd --- /dev/null +++ b/src/view/BoardPanel.java @@ -0,0 +1,120 @@ +package view; + +import java.awt.GridLayout; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.net.URL; + +import javax.security.auth.Refreshable; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import model.Board; +import model.Referee; + +public class BoardPanel extends JPanel implements Refreshable { + private class BoardPanelMouseListener implements MouseListener { + + private final int col; + private final int row; + + public BoardPanelMouseListener(int r, int c) { + row = r; + col = c; + } + + @Override + public void mouseClicked(MouseEvent e) { + referee.getPlayer().setCell(row, col); + } + + @Override + public void mouseEntered(MouseEvent arg0) { + // Nothing. + } + + @Override + public void mouseExited(MouseEvent arg0) { + // Nothing. + } + + @Override + public void mousePressed(MouseEvent arg0) { + // Nothing. + } + + @Override + public void mouseReleased(MouseEvent arg0) { + // Nothing. + } + + } + + public static final URL BLUE_ICON = ClassLoader + .getSystemResource("img/blue.png"); + + public static final URL GREEN_ICON = ClassLoader + .getSystemResource("img/green.png"); + public static final URL NONE_ICON = ClassLoader + .getSystemResource("img/none.png"); + public static final URL RED_ICON = ClassLoader + .getSystemResource("img/red.png"); + public static final URL YELLOW_ICON = ClassLoader + .getSystemResource("img/yellow.png"); + /** + * + */ + private static final long serialVersionUID = 1L; + + private final JLabel[][] board = new JLabel[Board.NUM_ROWS][Board.NUM_COLS]; + private final Referee referee; + + // private final ImageIcon[][] icons = new + // ImageIcon[Board.NUM_ROWS][Board.NUM_COLS]; + + public BoardPanel(Referee ref) { + referee = ref; + setLayout(new GridLayout(Board.NUM_ROWS, Board.NUM_COLS)); + + for (int r = 0; r < Board.NUM_ROWS; r++) { + for (int c = 0; c < Board.NUM_COLS; c++) { + board[r][c] = new JLabel(new ImageIcon(NONE_ICON)); + board[r][c].addMouseListener(new BoardPanelMouseListener(r, c)); + add(board[r][c]); + } + } + + refresh(); + } + + @Override + public boolean isCurrent() { + return true; + } + + @Override + public void refresh() { + for (int r = 0; r < Board.NUM_ROWS; r++) { + for (int c = 0; c < Board.NUM_COLS; c++) { + switch (referee.getTile(r, c)) { + case BLUE: + board[r][c].setIcon(new ImageIcon(BLUE_ICON)); + break; + case GREEN: + board[r][c].setIcon(new ImageIcon(GREEN_ICON)); + break; + case RED: + board[r][c].setIcon(new ImageIcon(RED_ICON)); + break; + case YELLOW: + board[r][c].setIcon(new ImageIcon(YELLOW_ICON)); + break; + default: + board[r][c].setIcon(new ImageIcon(NONE_ICON)); + } + } + } + repaint(); + } +} diff --git a/src/view/MainFrame.java b/src/view/MainFrame.java new file mode 100644 index 0000000..3aac3cf --- /dev/null +++ b/src/view/MainFrame.java @@ -0,0 +1,134 @@ +package view; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.ArrayList; + +import javax.security.auth.RefreshFailedException; +import javax.security.auth.Refreshable; +import javax.swing.JFrame; + +import model.Referee; + +public class MainFrame extends JFrame { + /** + * + */ + private static final long serialVersionUID = 1L; + + public static void main(String[] args) { + new MainFrame(); + } + + private final ArrayList elements = new ArrayList(); + + private final Referee game; + + public MainFrame() { + game = new Referee(); + + init(); + + // Set up window. + setDefaultCloseOperation(MainFrame.EXIT_ON_CLOSE); + setResizable(false); + + pack(); + setLocationRelativeTo(null); + setVisible(true); + + run(); + } + + private void init() { + // Create objects. + ScorePanel sp = new ScorePanel(game); + BoardPanel bp = new BoardPanel(game); + MessagePanel mp = new MessagePanel(game); + TileSelectionPanel tp = new TileSelectionPanel(game); + + // Add refreshables. + elements.add(sp); + elements.add(bp); + elements.add(mp); + elements.add(tp); + + // Add stuff to panel. + GridBagLayout layout = new GridBagLayout(); + GridBagConstraints con; + + con = new GridBagConstraints(); + con.anchor = GridBagConstraints.WEST; + con.fill = GridBagConstraints.BOTH; + con.gridheight = 1; + con.gridwidth = 1; + con.gridx = 0; + con.gridy = 0; + con.weightx = 1; + layout.setConstraints(sp, con); + + con = new GridBagConstraints(); + con.anchor = GridBagConstraints.EAST; + con.fill = GridBagConstraints.BOTH; + con.gridheight = 1; + con.gridwidth = 1; + con.gridx = 1; + con.gridy = 0; + con.weightx = 1; + layout.setConstraints(mp, con); + + con = new GridBagConstraints(); + con.anchor = GridBagConstraints.NORTH; + con.fill = GridBagConstraints.BOTH; + con.gridwidth = 2; + con.gridx = 0; + con.gridy = 1; + layout.setConstraints(bp, con); + + con = new GridBagConstraints(); + con.anchor = GridBagConstraints.NORTH; + con.fill = GridBagConstraints.BOTH; + con.gridwidth = 2; + con.gridx = 0; + con.gridy = 2; + con.insets = new Insets(10, 0, 10, 0); + layout.setConstraints(tp, con); + + setLayout(layout); + add(sp); + add(mp); + add(bp); + add(tp); + } + + private void refresh() { + boolean change = false; + + for (Refreshable r : elements) { + + if (!game.isCurrent() || !r.isCurrent()) { + try { + r.refresh(); + change = true; + } catch (RefreshFailedException e) { + e.printStackTrace(); + } + } + } + + if (change) { + game.refresh(); + repaint(); + pack(); + } + } + + private void run() { + while (!game.isOver()) { + game.doSomething(); + + refresh(); + } + } +} diff --git a/src/view/MessagePanel.java b/src/view/MessagePanel.java new file mode 100644 index 0000000..cec2761 --- /dev/null +++ b/src/view/MessagePanel.java @@ -0,0 +1,33 @@ +package view; + +import javax.security.auth.Refreshable; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import model.Referee; + +public class MessagePanel extends JPanel implements Refreshable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private final JLabel message = new JLabel(); + private final Referee referee; + + public MessagePanel(Referee ref) { + referee = ref; + add(message); + } + + @Override + public boolean isCurrent() { + return true; + } + + @Override + public void refresh() { + message.setText(referee.getMessage()); + } +} diff --git a/src/view/ScorePanel.java b/src/view/ScorePanel.java new file mode 100644 index 0000000..ea1d43e --- /dev/null +++ b/src/view/ScorePanel.java @@ -0,0 +1,33 @@ +package view; + +import javax.security.auth.Refreshable; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import model.Referee; + +public class ScorePanel extends JPanel implements Refreshable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private final JLabel message = new JLabel(); + private final Referee referee; + + public ScorePanel(Referee ref) { + referee = ref; + add(message); + } + + @Override + public boolean isCurrent() { + return true; + } + + @Override + public void refresh() { + message.setText("Score: " + referee.getScore()); + } +} diff --git a/src/view/TileSelectionPanel.java b/src/view/TileSelectionPanel.java new file mode 100644 index 0000000..1be432d --- /dev/null +++ b/src/view/TileSelectionPanel.java @@ -0,0 +1,236 @@ +package view; + +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import javax.security.auth.RefreshFailedException; +import javax.security.auth.Refreshable; +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import model.Board.TileColor; +import model.Referee; + +public class TileSelectionPanel extends JPanel implements Refreshable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private final JLabel blue = new JLabel(new ImageIcon(BoardPanel.BLUE_ICON)); + private final JLabel green = new JLabel( + new ImageIcon(BoardPanel.GREEN_ICON)); + private boolean isCurrent = true; + private final JLabel red = new JLabel(new ImageIcon(BoardPanel.RED_ICON)); + private final Referee referee; + private final JLabel yellow = new JLabel(new ImageIcon( + BoardPanel.YELLOW_ICON)); + + public TileSelectionPanel(Referee ref) { + referee = ref; + + initLayout(); + initActions(); + } + + @Override + public boolean isCurrent() { + return isCurrent; + } + + @Override + public void refresh() throws RefreshFailedException { + TileColor tile = referee.getPlayer().getColor(); + + blue.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); + green.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); + red.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); + yellow.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); + + switch (tile) { + case GREEN: + green.setBorder(BorderFactory.createLineBorder(Color.RED, 3)); + break; + case RED: + red.setBorder(BorderFactory.createLineBorder(Color.RED, 3)); + break; + case YELLOW: + yellow.setBorder(BorderFactory.createLineBorder(Color.RED, 3)); + break; + default: + blue.setBorder(BorderFactory.createLineBorder(Color.RED, 3)); + break; + } + + isCurrent = true; + } + + private void initActions() { + blue.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent arg0) { + referee.getPlayer().setColor(TileColor.BLUE); + isCurrent = false; + } + + @Override + public void mouseEntered(MouseEvent arg0) { + } + + @Override + public void mouseExited(MouseEvent arg0) { + } + + @Override + public void mousePressed(MouseEvent arg0) { + } + + @Override + public void mouseReleased(MouseEvent arg0) { + } + }); + green.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent arg0) { + referee.getPlayer().setColor(TileColor.GREEN); + isCurrent = false; + } + + @Override + public void mouseEntered(MouseEvent arg0) { + } + + @Override + public void mouseExited(MouseEvent arg0) { + } + + @Override + public void mousePressed(MouseEvent arg0) { + } + + @Override + public void mouseReleased(MouseEvent arg0) { + } + }); + red.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent arg0) { + referee.getPlayer().setColor(TileColor.RED); + isCurrent = false; + } + + @Override + public void mouseEntered(MouseEvent arg0) { + } + + @Override + public void mouseExited(MouseEvent arg0) { + } + + @Override + public void mousePressed(MouseEvent arg0) { + } + + @Override + public void mouseReleased(MouseEvent arg0) { + } + }); + yellow.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent arg0) { + referee.getPlayer().setColor(TileColor.YELLOW); + isCurrent = false; + } + + @Override + public void mouseEntered(MouseEvent arg0) { + } + + @Override + public void mouseExited(MouseEvent arg0) { + } + + @Override + public void mousePressed(MouseEvent arg0) { + } + + @Override + public void mouseReleased(MouseEvent arg0) { + } + }); + } + + private void initLayout() { + GridBagLayout layout = new GridBagLayout(); + GridBagConstraints con; + JLabel spacer1 = new JLabel(); + JLabel spacer2 = new JLabel(); + + con = new GridBagConstraints(); + con.gridheight = 1; + con.gridwidth = 1; + con.gridx = 0; + con.gridy = 0; + con.weightx = 1; + layout.setConstraints(spacer1, con); + + con = new GridBagConstraints(); + con.gridheight = 1; + con.gridwidth = 1; + con.gridx = 1; + con.gridy = 0; + con.insets = new Insets(5, 5, 5, 5); + con.weightx = 0; + layout.setConstraints(blue, con); + + con = new GridBagConstraints(); + con.gridheight = 1; + con.gridwidth = 1; + con.gridx = 2; + con.gridy = 0; + con.insets = new Insets(5, 5, 5, 5); + con.weightx = 0; + layout.setConstraints(green, con); + + con = new GridBagConstraints(); + con.gridheight = 1; + con.gridwidth = 1; + con.gridx = 3; + con.gridy = 0; + con.insets = new Insets(5, 5, 5, 5); + con.weightx = 0; + layout.setConstraints(red, con); + + con = new GridBagConstraints(); + con.gridheight = 1; + con.gridwidth = 1; + con.gridx = 4; + con.gridy = 0; + con.insets = new Insets(5, 5, 5, 5); + con.weightx = 0; + layout.setConstraints(yellow, con); + + con = new GridBagConstraints(); + con.gridheight = 1; + con.gridwidth = 1; + con.gridx = 5; + con.gridy = 0; + con.weightx = 1; + layout.setConstraints(spacer2, con); + + setLayout(layout); + add(spacer1); + add(blue); + add(green); + add(red); + add(yellow); + add(spacer2); + } +}