From 50d9ee2f58ddf4fbf34a1f23e1491605057780c4 Mon Sep 17 00:00:00 2001 From: Vincent <xefal77@gmail.com> Date: Sun, 27 Oct 2024 16:58:15 +0100 Subject: [PATCH] changements UI --- bin/controller/GameController.class | Bin 6397 -> 6646 bytes bin/controller/HowToPlayListener.class | Bin 0 -> 525 bytes bin/controller/MenuController.class | Bin 671 -> 567 bytes bin/controller/QuiListener.class | Bin 389 -> 389 bytes bin/controller/ScoreGameContext.class | Bin 0 -> 4674 bytes bin/controller/SerieListener.class | Bin 0 -> 573 bytes bin/controller/SeriesSelector.class | Bin 0 -> 1445 bytes bin/main/Main.class | Bin 2106 -> 2260 bytes bin/model/Pocket.class | Bin 0 -> 1091 bytes bin/model/Tile.class | Bin 950 -> 977 bytes bin/view/ButtonHoverListener.class | Bin 817 -> 795 bytes bin/view/GameView$1.class | Bin 514 -> 0 bytes bin/view/GameView.class | Bin 3150 -> 3477 bytes bin/view/HexagonTile$1.class | Bin 754 -> 754 bytes bin/view/HexagonTile.class | Bin 3009 -> 2843 bytes bin/view/HowToPlayView.class | Bin 0 -> 1653 bytes bin/view/MenuView.class | Bin 3150 -> 6798 bytes src/main/Main.java | 21 +-- src/main/java/controller/GameController.java | 79 ++++----- .../java/controller/HowToPlayListener.java | 20 +++ src/main/java/controller/MenuController.java | 14 +- src/main/java/controller/QuiListener.java | 3 +- src/main/java/controller/ResListener.java | 17 -- .../java/controller/ScoreGameContext.java | 142 ++++++++++++++++ src/main/java/controller/SerieListener.java | 19 +++ src/main/java/controller/SeriesSelector.java | 12 ++ src/main/java/model/Pocket.java | 41 +++++ src/main/java/model/Tile.java | 40 +++-- src/main/java/view/ButtonHoverListener.java | 15 +- src/main/java/view/GameView.java | 43 ++--- src/main/java/view/HexagonTile.java | 14 +- src/main/java/view/HowToPlayView.java | 35 ++++ src/main/java/view/MenuView.java | 156 ++++++++++++++---- 33 files changed, 514 insertions(+), 157 deletions(-) create mode 100644 bin/controller/HowToPlayListener.class create mode 100644 bin/controller/ScoreGameContext.class create mode 100644 bin/controller/SerieListener.class create mode 100644 bin/controller/SeriesSelector.class create mode 100644 bin/model/Pocket.class delete mode 100644 bin/view/GameView$1.class create mode 100644 bin/view/HowToPlayView.class create mode 100644 src/main/java/controller/HowToPlayListener.java delete mode 100644 src/main/java/controller/ResListener.java create mode 100644 src/main/java/controller/ScoreGameContext.java create mode 100644 src/main/java/controller/SerieListener.java create mode 100644 src/main/java/controller/SeriesSelector.java create mode 100644 src/main/java/model/Pocket.java create mode 100644 src/main/java/view/HowToPlayView.java diff --git a/bin/controller/GameController.class b/bin/controller/GameController.class index f6fe2f84aef354edcfd0c044696c5ae576433050..e1fb7aea9d15bd6dcae3a6dcd4e22008de983c96 100644 GIT binary patch delta 3179 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 Fe*qRkk@Wxo delta 3055 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 diff --git a/bin/controller/HowToPlayListener.class b/bin/controller/HowToPlayListener.class new file mode 100644 index 0000000000000000000000000000000000000000..0e5f2ae8d069dbad3f7a7e1663795520fea7cef4 GIT binary patch literal 525 zcmZuuT}uK%6g{(UZf;h7rG048n{LrUFFhDRL=s^oBtpH7I>pGk8{?|=vw}(}=m+$p zqC55>NDp)8-nr+TIdkXZ^YtCT9@cGGNXHOG#=??~2(milEG%1Cv9QVzz2i#wAw#Cx z;RAl}_J-2Gbx$jbcSV`{`_h-;0Yk3%AE4A=Fpq+^U|6h5U!3>5O`+<%>FE>R3T5Ee zgt`e-SF{;6zC~O<3|%pxd)>n^<XGorEoNT^ebo{bsRgnp!LT0GJpNFXy-@f<?P!y6 z%wa8#7;J{rK#HOJhig!!+wnN^C@|z(fgh^C^Msm!e#ICPTF&)2z4)Tp5iOcSVSF@g za6*X`$2NN+Y{;G*ztb#Umm1ilF<W4mrDbSy^aTdxWQO8ARSwk#?Y1)lbGDvgJW|E5 zKyiWo1%x#T9V0YN4~ZY%F7<Rb^@hlm^8{lA^K9FE!OS#2N$eDoNE0(j3<Iezj}~%8 literal 0 HcmV?d00001 diff --git a/bin/controller/MenuController.class b/bin/controller/MenuController.class index a0fdbcd2f9637a90bc49318a84c98b11692c0aba..faf78fb7440c8d5d289d6844ae3d8ce046ac8f38 100644 GIT binary patch delta 346 zcmaJ+yH3MU3_Z8K?QKI^Xee!Y1-cbfR52iilr9V`>3}L#VlE!86cQ;(VWZ!GGBNQD zEQtgXAHa|B7YHX4EZCCmWBVM-FO^KLKEK~S0Gy+5poVn=8)zw52Ff|uL_6<nDRdON z0@bnhbvzN64BWfmmb}rF{N*&S9QR(+LxJa9IPN0w<1p|%3P&>vHAOS>Xb}gYb2Jx_ zmrN3PdOSO=qo=TKVh6hdonN%;rFL}`lTV?-o{4?fCJu0z*y1Yr5*Nv{a8|8|;=lR= z_Tb;^=tJ?dxe4|<432Az#{9M9+&j)7hAB$#DBom|DJsL06xG*)VRE#Jy&7bj$rc*u MqRAo+9+lAi0eyx`?*IS* delta 384 zcmZ9I%}&BV6ot>w!r)LWMMVXFK>PtjyD`xOqlOI|qK1ueY0Shl!8U0JS@;wU58yMn zDTySy_dR?K<E?~+&Ln5@ow@f+=8pB3WbgC)?H#}|4g}`0Bv8OI$BKX!!zzlgQ{q?? z;M41Mjtv13!zPLxWsV9%>eO)^b;eK)Pb#6hxH7TDQ8loQ9frca=PKXp_oZ+5WYBd2 zC0*%r>>AiZ%|QKs)ukNHsth!+AAXcrGyLitnGaG?#Nbi32TFM^gH@|{pBy=~+seI` ze&DqjvVV+`!&+938Y#7NH|rcV*!eRm$kNB-#b}$zky=DIGy#oHyD<i9Mo3Jc-HxG0 sND`$c;6&*u%}pSPG7*f|-=I8c0ZGy{bedHj8I)n*kRD@LAU}b{A6|4!t^fc4 diff --git a/bin/controller/QuiListener.class b/bin/controller/QuiListener.class index 180a921b94ea0b1148a47d48272e0f6e5d60bf5c..28b48c02e9c8c6900c6b0e737886a5fac5e77988 100644 GIT binary patch delta 19 acmZo=Ze`w3#mLRYz{tSEz`(%7zzYB+m;!A8 delta 19 acmZo=Ze`w3#mLRgz{tSEz`(%7zzYB+qXKRK diff --git a/bin/controller/ScoreGameContext.class b/bin/controller/ScoreGameContext.class new file mode 100644 index 0000000000000000000000000000000000000000..4b2cf7c70ec9b9e12a5130d4b8c98507eb32dd40 GIT binary patch literal 4674 zcmaJ_`F~Vb760DM@+OnlK!!|USjw=aAt8iT8Zbc$4O?ge)KF4rK^`-YWMDEAW?o1_ z>7t;tw$>^wmWoSJ!B$jSA()_8H(G0}t-E!te)LEG01D#wyf<OqWKuJE_uYH$x#ynq zJ<Gi_um5-C5`ZQ6XOPXdQZ(W|Y3|psJqWKu*`eVhL1@lkr%W4V*o9ab;)n%dVz>0V zgw|b#HYB9kqhW6uLP%*y%ez;@z96cQktQ2NJFFlj^~uuxrRc{%0E0mszylf%1~C&4 zO7l>N+I>uVhlKmE^gb@lCuDd;7C$Pz$3jqeTqd3nH9i$W2|g{or$X@H@lsUcv(g+5 zvUxg0%Z`QM!?7Tq#c>VKY52TCS(njcwxm;*IbbPFX^XL&NhgzLreSS<rdh$4jiocD zf@)O=+Wj_Tmzh+kY};e(HwGHA{fSgp!+M)a{?gubY_Dmx8@&n>Y?g*TE0Js<L1sG= zT`9xr6NwFlv&)>J(Qh?uN+(iQb6Zb3ZYDVpdCkkYT61J)3nh1OR$-<~8Y#<)SNoSG zQVDB0H?Da<b8Q)8Oq#z%!P`PrWY<K>+|bvv%gk&xb|pzEj~U5WU(&G54hJSrjqu;p zVHvT#G}&g;a6-cu6hgZbsrbfBOU5L>W0u0=nz44b=2YKoW->-1wRy1DY@T0e4$(I< zW{26;W2USu-Iy|CmKj%AS|qJV`nck^Y51bTj4sn!8Q){XD0Ndho3Ik;)S7fAw~xY{ zBI&L3$I7RfeZBEfKvpHPy-8zGAwbc2h$NOe(tVkjxh5enhV3a=;4PHc(y<!rbu7gP zbu7b&6e@)3gwr}B+f96REXN&16ZF51JJF(}3C$Y5q~pt2ui<$OCv|)UU)Aw7oYHX` zU)S*hUexgooKcvRmrluZS2H1~xG(qCTM2TeC23@{W>&{HWktEY;zq>k_?A#7?oXKg z4eQJSqbr@-O#5_vTQ)h1mvp?0@95ZojXKWZyoMni7w}yspc4++sF8|Ct!^`siDnZA z%xsf}VI3p5sGz&kLC5#-eI1w3$^Gt3r>(4&F?!ogt2-UfPVnOg0lcE)hxn0>R&?sP zM}S<7AM5xDeyXDbn{`~qt2#E}?f_mB)}QHk9Y5Fc2Hp(d7ee`^j<;m+wvJz+S;w!X zS&iQW@LQSwT>!t=@CO}#6!oULD#%!GQb!x9q`^wDan~LOE5jrYcdKP)3@e>sR5(To zYV>Mukk12VR(=(|O!vf+ron|SI-RFb<x<BLS7c-$=6qu_R@CG|*j1$hjQ`A_Ex&M@ zB$k>$;)cFe1*=ExAdl8<WH;Egl@(zdD@e*7RF3kypdh!OO5J7V(qxN~?4$L8M3%{s zl&sb`?Lbn_^?8W6vQnlTfZUl{Rm03If{*;3-aeu>S|;3DIEn10<bZLL3Ov~{n6=Cv z%1n#Qup=OmZrGGz`R=e-=6blJlU9XfDdobHOmSVVsMy<Z6;G39siEb0%cKMf<M<{C zIvq@wAl|{B6rxTlMf($0ca)Bj8X8qm`om7Cs8X2RW9*f~FJ@Ss<YF&t87!m<H8ta) zHd^G|8ZyGhV->|UBOZ6WHL0jx%DjjADpb48c5;GMer%c$zuVf)Ocz0kI)`7>uxO2K zoSU#aoyi-ku(oLDv2}VJJKfvo9Ki(Z;r5b@qvksB+Ai{E%%1dq+cm|SOVrQXVD^vd z9kY+UxTF6Vb(a*YTO7ROs^=lt3X4XM!YI?;ISZq^Osn5C#r0BCRdmdjYJhhdsqZzd zt>Tr5_t>XaJZcxOCJB?UBvIZYHy{b*S?nTKcwt}wWF;pDEDe8_I{7z+xp^sx)c*8d zv%wMO#NZku#^N`q;aygOwsd-L9}C#C?)b<pa_aj!+LJW1a~;m+VhvrCf`#@?!Zn#Q z=sp)|oIuQpXfcw>4i-M1r~ja1iwqi1H-(%3KObiCKDz|q^|VCJdG<==%(mY=^6fWI zcwTr{*!`89=fQqsyoy(K#WQIQ+qLA_#v8DQ@7mf6P_=dEQBu3$JUq1*;oW)xzVq<2 ztFaq6kJ4Jtc?4e~x57HMH&YgPVfSJ(N-+iHi10HNb1@C`F`ZnkSnuqko+ei*x&Lj; zs6B_$VU#Jb;~$1@cS?qE(=f^vhA}~*t!@|-6^>&MI~5AAAk@BK7?Y$|xq-c~^s1V? z5$_NtAIA!LPigXb8vSAaME^-NM0{cY5F$-lM7xY>we?|tL>t1?rhsf(9|;U&ng^YS z{p$4fw@zO_`ZA`6W(?tGM>n?yi$*n=*-oYfLx}R3HG<iI@NYebAPIAJ5}ec5->e<N zT*0Ws#%LSy0iyKREaEepNX_HbteW`Wg1d>*R@7oA>ahn4kwpUrun326E1n|l7;dNi zOYuDYe2HFun|}T)SHH_U+`s7KyC``Xw5yn}q3t@EG!2dHY6xkl)KI0NT>%TOOSCvs zz!j8SMFqL8P<n~ntQ-&FJ@^rz#A6pRb8Gzt%oAwqhEVNk^o4zbXsos_>>I)@O@2Wz zLdVsV&<8Uegzpe^qxGlISX&qIPY?U*hcN#*Y6uy}^&>P?;EHJCs5(J8;vL3<5_Cqi zvxj~3!U<s|W4(iGj$@&4c+cKIbU7xl-+~}kVIpIADsi5}Nc#ZsSjlgW8)?%HwkEG? z`-rhco&(r|Bk06Y+-svY0iJ7^q+zCd4?C~e$;5kI4v04xs%6|FOC2R9>3!SIDv2*K zU5E_8JW-4IFC!4qUWLzdCgNulMVdGa)6hs$X(SNwokDq}R9>3*G`yb1U^sXjA+dKs z#5Y2}3pC;2nHyGC+u5=mVcH@Q(#Wr?%Mqh3Cho^>80bPT61Fwd;Jb#!bhh~W8fI(w zF#lJmtCAxna(B%o;S02s$*!8}&S8<S_c@%H{vvl|pgDg&zN+~w<<rJz2cHa|!xvGx zRn~ZSvc2^JZaZ5@@y6XW;VGne<L^f+TDMaub!TnGp5fl|Cwk4}BZW_bemkFid=3?A z;g;oS>b0efa@jf*P;z>WLvzc@>t2@+!!@X&1}VBJ&6MqBk=@52%b=TSe2_u+B>MOz zYCle55U()+-@ya;4-PUPA5@iiNLAxuwG@xo_EccPqKZlURH%8*n{MMbkX%5n;E3xG zWxO!_f+LJ|yYif4p|;11Wqf<SGMC#m{RlJVQU2=j7*}s$^g9)Q2HzshCrc&ZoMP^` ziBE9hy`+_}F!k^)Kb3^|J4(`Diof9REI$!EOnNo^)Lr4DcKb=YebR0}W4F)P?dSdn DLEEY# literal 0 HcmV?d00001 diff --git a/bin/controller/SerieListener.class b/bin/controller/SerieListener.class new file mode 100644 index 0000000000000000000000000000000000000000..33e475035ef83fb450ce6af472e39802b1107fc3 GIT binary patch literal 573 zcmaJ;O;5r=6r635N?8T!7YK;nYEA6Hg9nU>A!<m7nqa(_vXYY0CT+prWdfRb@CW## zjBo1~B*x2Z-`kma)3<N$FRuWOv8yAC^&FP4Az@R;7Rnkb8n!i58CD0*NVLKri9+8O z5ks}({#5qm!ex_z$0G7Xd^H~RB$>4tvL{~PC8rDx^B-w@|BfNk3j2bg(D4HCX>sfH zeA#i_#0!HP5#5K;Nc2;)p)+x8=OMAhL<EU_mQv2;cT<|_-EbVa;=+>#Mpx$QcyS^E z5gke?2S<%#895Fec@1@r9W)rqb3eEsV<@IGeJ2>$*S(=|6NdVqF}^1;sHO~4ne$v+ z8U^)3r=JdrX$2;20(<lnSuki&V91E{R)$PTr$T*>6~a}jj;L1YELhKA*1-&lRhvP5 xq!z7>&_ISzC(M%#Cy|sEQTj44$v`0nx2B|>LVZH!SFNXaCDIziH;AWT?E{ZvfkXfR literal 0 HcmV?d00001 diff --git a/bin/controller/SeriesSelector.class b/bin/controller/SeriesSelector.class new file mode 100644 index 0000000000000000000000000000000000000000..4b9fc6abda15957edb84e5ff9140253d5eadcb5f GIT binary patch literal 1445 zcmcIkTTc@~6#j-wmu?rRU_q`{EJ{%+-asv)Qst7=OI(B)pQi073)|ghcM9@P{0n{5 z2QirV(l_I8GM?$ybQ=iq#cg(GcIJHNJLfy6^Yi!d4*-i;*P-M50If%KjAAT`aZC(= zA*tgMrZimEp&_MVTEi8F$dct)a+#rXCcVYbm2*pip+9dq;zhMw5Z)#)*t9d~OYX@v zUKZPy+%bh`37^boHWX^y=H)_(r%tg+%`@nxTlI=!)oM5ju%@s@QM%sTF5l+{VlWuu zE3PYj>G8^QA$Q!8-ygx%I1HL*45Tru;hKT#xS?UrKnC-4aI*)u4BW;Y4R;MJV3DDB z-x3EI73vl(l<zphNYQnq=i0XLGVKu%uZkgKbLT_mWnq`X(s2*>bwu%ibn&VV!!RY9 zZ<)QWI*!sM%P^{TKW6*`i{Pdj-$={0WJ8~r<?OqABG0Apl#|n3C;>wen1{X;W#V<K zk|7ZwEI0GYvm9wkPw;Y9M;1#AX|rCVIwV=ruh*2Emg_k6nn((n+!fVisa`8{&#Tww zh`Y@9M9y`JT&e=nii+h(s$rr%HKL##D6zpty6wyiT1CZSlO&07HceD|OT$A0%UCgR z4si`RRhy>_Q!VWRNiz9H%TS^Dd#)PckReuXeQ8*w=FGe9UbVttY&eeaayIvU)poza z)J=au%dB&!WD7qP0J9;zn-PX~+JKvf6%jW7_rrklY;3r9nx1pqwoOZ_7D}BECkQqu z*Xmz+KK=i!n<BjnsTBMpvS($WVU1z>L=vY}gkkb*JG!Hybb+a-lP)c~7ijFIuL+tN z&E2y{V4rEh&_`pWv8l#>#A#Hf3+SL9Ff?|o=5Ofyf-YKj178toVf%;zM5hQ7h{bi) zvrQjU4SGQT4(;ve5qh>;xPUWC7V4Vqz#yK`tP}DPp5ZY@$Q$Ua14Cppj0^Nm(&@!N DB#etH literal 0 HcmV?d00001 diff --git a/bin/main/Main.class b/bin/main/Main.class index 9c0bb69318782619dca3e7c6c6a47c65c88f7d7f..e9b291ca26fd235cce9339e8f52cc7836544f715 100644 GIT binary patch delta 936 zcmZ{jNmCP16otQzNgh0&k}xSC1P~MnB+fWbI7^&R5$7hf(iqd20cWHB1FL_5f50ls zDx{>!jXTSwYxn*Iwba{LXt}Vu>YToPPTxMa>%Mof&+*E~pYPrS!#vk?kZh3qb(-~T zP;As}VzXuo!vSoqV;kE8*ip+)cGa+3vxmKkeF5)RjA-gfDh_Dk0Uy*fk_?JNio==~ zj%bc@Omm#k05Ub26Phq56{lW2dSab^@jY4TBw-QT?|G$SsbJ4$oYJ&6RjiM4CPqSN z%y5=-it~nXE?Csww%vR>BcPZtT;!7Cvf&C>4cEA?unm)B4O1i(j^PG3Em{w`*=g4) zblK%8*XwfgrGi(UvnO-Cj$+#2(r3{)W6#;?oSna!K6o$d%$8g)A4oI)2dk$dO|o9_ zUM}Yp(qm4+b&6w7&dHX%g5egqe+?NYUmp46H*|7aA?-Y76?Y5;iiQ$p89tpU7u{^S z8ZC9#o-_0YabkbtoSdBTM?y_CbKDJn;Jr83LgCPsc+n~So5P~BfAqg8cdR{cvD^O= z?r!_P$-f$|_)8*9b@vSqcw*=$;rB!~TTlH9k+0!r7JdG!$a4QzB<fE_Q}GVjAtaN0 znuK7N|1#Rr+%3<dQo%B6>0wn>`4nwy4HQjCFh&jCqROyU^;h(CB~UkD1p82|rj9k@ z>!*pev@;<7r1%HrT1T2x6^CVkS6BOmf6%K~^9?2Yxm3k;5I*QF>U|=T5_T<8Kk=5> z@kQdo4Wo-R3O8kvgY#6H7ipOoNDjVb`S=1WP7EdIX&oO5&(qe>zQD@Y(!r7xNER&^ zml+x)VKXaa;X7!RFSbj%l`=(#oU??Soi3J0dSvDS9t&&f@Q@0R#62jrk$OlxDbgWQ FzX7svw^9HA delta 775 zcmYL{OHUJF6o#L#wEfC3gaHazXpu|7mV!kT@q#xLZ-9Uo5WJRBpj=vP3nDC7xOHRZ zKe$&DAdvV2Oxzh)Zd@4S(ycMZGu@a;-uHZS&dhnv%=uioZ*714yZ-^`W6PkPNR`B0 z21ki&x($xeV{n`kj`Wssl0HXHm2#RhKF%8Sb53*K@e7)Z1{Fj!mkcV27z}XP;0lA9 zs|Gb(a}L*i+%Rx+Q!}LSzJ9f(hHamUZ8s29SOeK?Az#QPR!35Wh3ss;!pn$7Q0$h; zC}Wy&liS=;l&&PwnfQo^=B~*-CNz^K_n9)8=7Hv+$s-<{JRzugYLZ|^Q9YMVE~Hbr zrgWx|%dV{_W|mW$q)Fo}Es|bLtS92jiOhU_a3h&oEu^y<lUY*s7u8~E=1k^U(4<Wk zS+WDJMqdNVCM#s@QCCe#GcESKD_osr)fw`cq9nJLQPf7F_BWUR{X5rpWtV$4Rjd8U z-P{_TP#F1CVIrMR3y8uUnU2aFIg>okP1*?BZ#=!~h5gm@)4i!^vwwLT?H}H*{(AXQ zNDGC0IMI-tLgGr?)3J+sD}ka>)LXn+PAP|Jk~n0K>H2_^F>r}i;FG#i1iqMksmHgS zY!9YrD_S_pXvg9Rej?H^DzzPiiP1@1t}eP|W%@*0<p~S-AHtgOZ}fnsTw8`SiSusB zCIz}gJbpmM)GpT00hQua!+TVZbjEh@Pad#TGu08>rFOE@y+d8qp*;fs=V=jMr;AUv s%%WPD{Ia@r!V?g(ppb;5L%Y<tgm_)tklqD0SSwZ_b1C63De}ku0hUX7i2wiq diff --git a/bin/model/Pocket.class b/bin/model/Pocket.class new file mode 100644 index 0000000000000000000000000000000000000000..11cc732a15aedc06df27f6163ce5ba4b0d71b7ae GIT binary patch literal 1091 zcmZ`%YflqF6g{(TS=uhoQne^552X*KzL7vk3<=Q$m86YEzfHHBvasDH?N*~d$WMOI zL?me95Aa7B&&)2iR?KGayv{xM+%xm@*S8-4R<V|Wg==YKaoxmn28n1<%%X&{3KbP@ zsBkkw)QX9!iCY5M(CKuf>(}2MIs&<!cF=UZYQ4X?E|3ac&*=(G?Ci@ovfAUaT6034 zq-$==mtn8N-1)yxH=?C{8&-D%*ALe>i67Z;eK*_`I9EKQQt5?2a*F~~Dc5(N_1X=m zQ<n{oJL4@U9FQfDFP6^W5HJa>x$l{hD3+dZEt}0c8(??EVNI%{We0vp2fF_Sy`}|i zr_&<E)T!>>z&@Y_ieRi3O8elcJUmruOV93kGIVNopq$Cnf?mgVwzY_Cl)0j;w2;GX z3u723bKl#?vb#rrElgn2#2pKFF>B!-?pt`E!YUqGC}5V_qw9(&1tv9zC;e9Sd1K$P zL+yc**e543UG7E((HdoBWXnL_dWk)co*Kh@Bk+;u2^3<iegj*9=dp+z_{3wL&&uLs zH2AS2J!1o4YkEEnlk*&A81vj&<0CaV=F7(r<;oF^@^>U&9V2;!)Mp;>l`u{t$(Uud zkS6gAsRhpCLQFHqQ4o<Te}VDoPuhsyoMNO=jH==SM+MCgnmWOVz{eqcp63^FDaIFd zFMy@+l@pi-UiO7$wE6<2DgHTJj<XiytZbY$YW!11X}*H1al%%dFsnMK@c)1*ovT%* r<D!OkW1OZzTfM->mN)}<M1fQb1AQ7?t3JO*|K4z)%RFBs!obpR9R|)Q literal 0 HcmV?d00001 diff --git a/bin/model/Tile.class b/bin/model/Tile.class index 127aa6af34093ebd01916e0f201131ada450f0a6..cd877385dbf38369da966c22fa88bbb36042fdd7 100644 GIT binary patch delta 362 zcmYL^ze>YU6vn@M6LU?XwN08fCb3l$t!PEapp&>cI0^LuEEtMITM6A=UCSK>2OmH( zh=W6BaqIhtcy18oz<2)KbAIQZH?a`?&+qpVzzKR5meDmKuqm*m{I-%<Ng}W#usiQR z$u>LonxkxXmF4;Hc5*(=2ia(xO=k0tOF3o%^W_68?@j2iV8X^aR?x*N64b!pqDk7I zjc4FwKr4KN8}7eCFP~v4AEpH>=!L@}twAGoh@fUYGEjvnOzRIepk~z;E0A$hzc8-r z#@%T|+0rjnOA7_p(|@!>p9BIzhlGvDIu+gk`$EKMLmR#v@<ThW4q$YQ%02nQeY;1s cJ?aS%$^}ov0mV@jyK+ry*hiFa5TB#-1B2}{nE(I) delta 355 zcmY+9Jx{_=7=_R62iJc1K}#uk(W+EIgAOKYjDt>1SX|%_G};h|LQ+vj{R^a<CJrnt z4i3h_fghlgf5`Z@VKFy(-t(Sw?@8_t|KN?U-_I$4Bh+=wVNC<aI>$yjt10{xn;csl zwNc|GaoPFk`{2asM8j6pxsLk7n_v*Pqc{$`eFml8+-@@Ht-)=45e40=h(T-9*z1LN zp@~Hll1DZbIusbtV4{q9cvyf>8G}vvsq7>bxnx+B*yK5xw`&w>cWE!eP3~o%3(_Uh zW7&W3NSCop%+qg<A<+Q};u(3Nj$!V+LlOHEDC~`V2^KL&w}C1Ikwdc1IApRaSeexv i&T4G&1f3ex3G}60DlT9Dx45WfH7X<{VDx-7%e_D4M=@gn diff --git a/bin/view/ButtonHoverListener.class b/bin/view/ButtonHoverListener.class index 6315df6a6dbee8bec7594514aa0a6a014ce54104..874630d056484c58ef08eccb5342be6aa1911d4b 100644 GIT binary patch delta 438 zcma)%J4*vW6ot>^HD;V_b~l>DjqkUsunK~Rjc8*dsGViN6pFZ#grv-GkU&8E30473 zKtZ$<3;&G0cxJT_E1Prg+{^vWnQrPPwf^?`@C0B3O9~1_i4lbuyfo4%85va=!??tR zg2bf6l*IJa=KHpVtblb^Zj^&^vmWe*=V4XD!i>fsv_=M6Vpd}g^8%U1X{8zL)GrPy z)mo^rfW`Ka*lKsgWh+fv(9$(`>|Aro8VC8vQf<Bt=`L8;{62*Lh}f}%R|g&Ygtd?O zJrY0D4+pn)jjL#y?D9y!p;|<Om;`_2(NxeXht@ZLj|t4WwA@4L1@am>(>+7(ulRRJ w^e|vZv54f7VR(x1T*mXLL!2<ON9-`M|Dq;IUHyyA6I&p#NUZl8n~(epUqfp*uK)l5 delta 439 zcmajayGjE=7>40@*0__bo3ome=VP)7u7x0CBia~6D-kRMf+&(ej7G5V8YCcyR}s(% z3Zk7@cuC?vLBT?>nfZ2S=9zD9?Y6!2{`vR}EK+jlBcsVWSmZ)D44E`+(ul(-W14Y? zAQPHN&D7Px$7Yn6B63tYtN4{>!(Xc%*Xk}&rd?dZCe64+2y13t@)Q(Fv-#XVX&zP& z{EgMqMx$1B@hG-d)v~tp<#M^O+qzKo6;lT(U>T~L1d_Q2C2mZ{xO{D+CBdBcfbyQO z_Ts$7xsL6(=B@N)?>%-~mK6yZBXSsdK|r3A5?<=i{|&9nMP@Zu?4Vx>-jFouh2U1n zyCcvcWFV^xC4@j)IMO2_J+cA~$RFvJ6>soI-QgeB{)0^kn-(@BZ0<Lk>fWFJ0;j|^ As{jB1 diff --git a/bin/view/GameView$1.class b/bin/view/GameView$1.class deleted file mode 100644 index 09a5b533f4ea99dfc2b011aa855466e82c064217..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 514 zcmZ`$TT22#6#mBB>bB;k`vnS<GK03BdN6_zv%n-Od|%x|PUx)ct_uCDpbPZS59mil zXQT*&24=o<zH`oZ&dhv#zP$rD!g>lZ%$tZKZz6{U1B(Wh1rlLb2E_w`Ok*TzY}cJW zwb-a|=vXQlo(SYie`32WfmqdZNta1Q&0)Vy{;kvQF_Z0h{eh=Qh1V3w2XX}prN+H8 za%^WD+BD*bUH!?aX}6*U%^Pp%cj!!Nk@U|T`?`?Z)KsVE1ybEzQrPue11lDiSQSV% zDG1NKAheKxVPQ>^nW?)J4+X3XrO2=LoFJe;VB^1ePF-gZlFt)NNeDzsddN(N$0fh+ zOZUoA)Waq}Yn)$LWV5<ITM^z#q`)^~tH8cy%<|qdMEMnwNA?6}_)IVYTYOqbf9Dq& rCko{!h!;eEv&{*=%{_Lw=PXx7kU^F)#vhu;+=R(tiP2=07$dJQT?1=n diff --git a/bin/view/GameView.class b/bin/view/GameView.class index 7671e64103794498ed0a92b1832dbbd14560c867..ad40ca61a8b3a96581b2262fd350d86f2331dd62 100644 GIT binary patch literal 3477 zcmZ`+S#%p$8UDsgMxKrn%ZU@ajuVBpi7Y!+(mipKCRXCasT`ZwvFny?EM3c!${Kex zvYpZb1xgooC@Ezvg|f6PO^KyYL)oE}vKO9s=Zyz=;Dy8C`)4Fua-Cz(UH<L<`@MSY ze=olR;CB4YKnRwODFby#HDLg08B_?<2Iq{98JTSz=M5OJWOJVkSs7+^<P2<rB|MHm z=45rhtlSXtGJ84-2DV{dFbg^sL%3kzT09{8cQ^6a2W9(^(7s2<dkyTu`wZ;I!y&w1 z#|I4DfDa1oBeMFCjz<l2<1v9euHy*<z4);3enik8mDR^|d|U)j+5MvIetbf}pOn?7 znkfF$vVBrkpAqdZ%J7tq&l)&{rwx1#pBK_Egz!a~zhvOcct%WkSO&`4hOg*&Rzp+9 zwbLV3PGvQ0NuIant;KkL!Omskr+sLjhD|xO=#AM~HR7syTP<j4P0AcUr53G>lM@ul zHfF3@m2h&N>twUa)zFztt?c3_Ymg*wNfF{&)eK$L42d;pvRqR+f%<4@ucoeuCx(PZ zKIOP7X-%zTl@Aq~8E0O(2`B4N)fV6KxV7NLeTW>EbKF@gTPE0W$j;f`5e*H|!R~QR z2`8=SnxvgmX9}}Z${n+&vV??FuChE;cFjpTSHsq5_f<TbQaMk#LRAhyeN?2k213fd zDWi;0r{Jd40KKiDSqvU$5N?!^nHb00839?Z8X?fHni$2HiE|hu(`i+Rq*Y|BKpA-x zU&C`et0v|HF6El|Iwmx<t%&P)+_Z9&)&-~FnfM02Y2sUW-oy*|HmzGH$_#^vVT_o# z2ltvdiBl%tCMs@7_!gV^4!%pbuT3LS`Fkb?aeA#{<zR+JC9(%2`-Jj26K};?6EBK| zm++E_ci`SKqwj{}_N>a~Z6_zx)c5<i%+Q^%@=TwOb<_?rSBRHP+=ZlxqBx?nigayS z3USHA5YA}WSw%PG6!L0fMk!`cr6h#*iiscKWfRNzp@|>im9=*I!8Y+@vF0cEsfnNA z=O%uEUz+%pY=14QSH+m$;I(p$Diz!BELLJPj^FBd-Nf(kdlP@aA9>7(>!fBZ=4-^0 z_(u*#Bnp4h@n;i%!5b$2D%v#rA*o~+0~Q?|^fNw`S8M{FBwt%JD3`3oHZkhC>=u2J zw(TT2uBNR*)=Olayc(WkfqQg6+YC{GZggjvU8*gB4OuxWqg-EzPRddH0Up!HqeX0+ z@H#19(pi<|Jg>$a4cn^ZB%IkfC&%3KWz<_~mR<L{_$t+hr_QTXz_F!@cEqtM=N>t_ zu|Ih%aTmQp6$Y4i8P_S~D0*`hdC)L~x`kBik<-d`RXVVtTE~@a^mRNJy;}cTuUEXe z;nq?GT}_lQvW}G=Rj#e_8sdSTl>{lb^s5~#?E9kY995Oql|~zsif>69y}g?5NjvYU zob><QRZdd#j7|K_RK9?X(pzmS%czTZ4Urn(tSvd8$Dpsr?Y!+b-G-<iEs0XUmAbDI zrBFtB6L#90(ZIes$N&+rCP0<mT-z_${~H$qPK|s`<U6J8%nbX+hMDrhEX<|Z>4&GM zc`WY>SIx1yyrAWm<G#l6;^6iwuSjc<igf$@MDM6>#X-*<uu`7mURb$TPR!1E7Xp-q zT~eEawRg*u->TyQ3C)ngtI+SL&4yZ1(JfY^+e$?RB@<kZ6(H}vT5T5z39hZPcE(O0 z<26_-uqyr67bvO@&sp~u6kjz1eA9tnom?JV)ybvc&+N<o%$DoVyk`8FR{`f%x$pd$ zS03jEXzaQZ9Pb9S$DtDftvObL7F$N$WEii8aj_*`Lj4jN%AkLT@j^@92Q|i8Hx!}A zI5ZJ!OqOs>5oRph`1f$#KZ|INX+>-#W)m?jO9;neMYJwqGp8-F*kx>PZ7X6c3ARmY z^(C|~p@W-iCtEv9*uI1=l61X<9YyRUM`WmX8M}O?>h3P#Ek#@x>utS05OBjJX~QCt zUx)COuzLx6xZ2ZMM3iE?g+$Qd5@Ji}Sw^owgm_O0d(Xu77IC9&`1KSKk2Msr?-Jdl zVUpu{K4QVAVFR{sY(os~*oO|>O88N9G636otMA~Yz7tc3V48uN!*zHF*W(F3U7y4r zJdG%x=j-+odhj|Qwr^lB{((6DLrMR|O`49IH50cmpnMtxVPOCpxd)=l*iSd!l<c8X zZ|<RzjYZr-E9jE?2>%0@^t`yD@m6xmZ-5Z)Kr;?d=Y!adK1$<rqb%J*J^z3MbnvZ| zxw(kjF5~ueWA+dscdS4T5OSEiaOd_S4$2}x^{qN6IPOkn*-@H&jHdPT-~^B3%cFeU zzo?QN_w0%>%Q!UI(@?_UYNJ|=;O`2K6mh4Y5l5L3L%l&V^z;^SY{ECazQv&3SI{pI zs?-sr$VKL@?~jDQ_%W8pWy$%3_^zW$!j4r5g6i^7t8P5PUk~tW?j&7!3SF$WUcP{C oW33(L<0ipcJI65Dd~kWJvj<saj}Y<{YwH<SmWFqdzYg#EKi6QOrvLx| delta 1667 zcmZ9MX?Igq6o#Lhp*Oufr4uPg0RvJfH-%zllrpx^mJ~tkKm@IkMhvtGbf5*%I8Qhr zS8&F81Q80o0g4EM!}5d6Z+_6lPjLAQT<()}fwHphIeR+$?DySg=WxZZ6Vt!^bN(W* zh@UKcv;}ClSV@P;X1zyE?zPCHO)FdUvQ;nlncQztKwG{jo!at%mSS3ZFu*pwcbUX3 z%6Le7wrk77CJBoP?68>0&H&veJ!y*yk~$=1vddyByS375(q}P^etm90$L!J4pvjOv zEal8(OFnzqr=>@<Z@-ov&6oU-X*I2-$90iU=;cY1rz~oDS|57G;#r>4@y}PAyb$0; zO9(ii4KG=|%qzO?ojUSWElK(^4w}5?G#I}Z<kcmTiT>pV-YRFWXRGsvr?xgii$USK z_&}&D9%>y(bjSM?hj0u^cf|I@hHCl-6Ups0>(=(hdg6-LIqY<LCp8`64aJ+hrFffn z49d5qlKs7@?(TSRO``<Xiy9y5S2VLuv4M?>RjgLrt#8Y#kBhfg@h<N<m%YL22uBt5 zG$=N)aqQxn*kFH6L!u|1>`SDQiip1JeLip&`YH<|e5hE%T7wGbnpt6K_eY9Gnw*2a z8R-ZgD?Z^<#b<o3_<}EQMzb-Nj7tx{QXJ#B;%iPQzTu?e6vK+soKcKu)zwl)UwxKy z2EqSQvN|=?65E>^5R?(lD@HkPazXK}$wkF?Tym~?Cpb0!pdG={U@x0|ueich#Si+{ zA9Y=YdlK=%ENAT^I6eNAeqUAd>~`mv|D1CuZ;r9bxs<oUBZleb-y6s20<zT9r@B+U z2L6tw=GHX^#V!B$ES1cC@&47ZZ9BL3rUsH-24z(@$4JspV7S0)X>M$4?QGn%Dth|2 zfMKM4S~SR)1RHk6b`QkmIj@uv13w<!NRd3cVcA{!klls->@F>r-G?Exw8*+1jA|J~ zuUN0z84SDB<KngRT>SPZdC?4}OTaGi|5@Vs%OyW;8!nc(3dE&GD70;taU>R&3j6 zC@L*+DV2b-sNu~peuSX7%3H#tOo*27bBSkjhKVk>*x}MixyXvBoGa94<qKw*Ji-)7 zFjbqisW8K>BZNko7PZq7A*LxArmwfFU2fBgd?A+^w$G*Vlpry<OV)ORvX%<kGAzbZ zB>E)EnIRKATcr6+p^lKSH(gk%q=Q*(rHUT$_EXIP=5UmGoRIlG%>pjUFkeZtSm>3Z z$&n|LrX6ODGE*3t)e;tds=~v}cCmAqy`d6sD2F+G@_KdUauAjhkQxeECiN|s8dgX$ znZvQ<G3kr$%o1TREFg<q($!~})8+536Vu$BNh~#DSteRx#blRxTFAL>zrjZCzIx%K zK^Ryg*wzY^M!8SsdhEUnV_^1Q2Qx}-H0;Z8M-J3{H!Y}&t=#V{3tSco$VJi8#Tk~k z+}V+Z>@Btg?^%{=i&PTK_5Mf+N3uNBY1=T%T$XD|+O|T&3uY7CplGiA!6K~*$YTu( iDU;>7R)&T0B~o!j>h9zo611|LHug#X4AJ%LZ~Yfz=3Wp0 diff --git a/bin/view/HexagonTile$1.class b/bin/view/HexagonTile$1.class index 29970983ad6f76674b6177c45aa1d6348b70b49a..1927cf8300689e07f5b298323314f22cba14ec06 100644 GIT binary patch delta 13 Ucmeyw`iXVJ5+=sD$xE4h0VweWD*ylh delta 13 Ucmeyw`iXVJ5+=rk$xE4h0Vw+gEdT%j diff --git a/bin/view/HexagonTile.class b/bin/view/HexagonTile.class index 1d2ae2af19de63520db1a29bb8d8507ea79a96ed..e4b508cb6347c4cc73a8ea4fa7da6f9662d653c2 100644 GIT binary patch delta 1475 zcmZ8hU2_v<6n=KIn@zT_A*2mW+N97*izI;{0ySxclwzs26iW-Gl#hlawCPtgjZ^^* zDjF5B;`#}SiXZjcw&SFXopHt+o$<y$;f>yS>vU}OoHbU*i+$eroOjPT&w1Xn`(5Sr zb@?AxzWEkFBW87MMYkPWaEPIYp;yCU9V(9KWb`o{<+u7Z9AjgE;W)zy9Xd|(?vxz? z46+$#IL&54LsE&wKz0RE>^{RVq+|FD(i}Cy_Naz29X@pHm_UZ%L57EPbRf$x$&llW z58DyOSshb&gw018&M}<Va6zZ_F*Y98kk@cg!xMAAHA+=aN+?fe<5Rt<Y&M>r=t&KY zrzUcf5~_`u>@|+bA?YcjAdfUP;*!8!*deeJy9DmUb_uSL_}O?kK9vjaOH<fnIx`_i zwWkH1K|$bI4%vr$jgZBYcn;4CTxPfr_Y1s$D+2q`F7P6z1zy5cftT55U|K@OYT~`| z$#kM8m(7f(IQ1(6ui`a<*KtL|8v<|Qnm{KG2wcZo#++sIz}o^h@Q%Q{4DT`A#QOpt zFnq{_KH_>a_*lay0-rLW&)D-h!xvoKv0A(}GnUD6*)IjY!nCnd`PGQ37wh!#OfoeV z?oE%Si0e=)S5mJnlPw8o{H!hox6oJs7Ram??PS)^TuDM&?T{$<-GmXtuI-Sb#%`^4 zdlQ=3L+5^4C0f<M*N|svBOyv?HJz1&_h2_+#JH+$=;RX@6vAp6P9Keq9}d*e`5wgh zEjsycLgoJnYw4vH>@^cEYc-*NOVy*5f>p?6F^MYBjh6ELLQaj2&Kvt}u@+|_<aaA> zwTLw{aE9jLEMjfQYc0YRl8SJUr<^^DsOWdO7qG5~O7qw=M>%9fjh}46d>2V_m_!*s z69!3&A?h+meV(H}m_`MZ71V3cC8<SPMuViGO;9w=Qi;_C;>4_4EW1><>a^ZOgakB+ zd85`~fEiU0k)Y45B#CiSbt}XCIGf#Sp0J4OOR6;U=l3OEl&gwV2i4c9dpGsJ9&L0N zt)y(b$;uA-4_KrnA}sTOm#8dKn4rMHMfmy`;EyV+oZ7kCaN!neBG&4Hzu>Xn!uruf zK4SBgtPP`yi0)ReVU1Vu*gSd>wKEX^?CVU53tpv&+r8#xl7dufE6NBvXt+92jsr9S zT?pbJDf$2@*-hknaEQ*1;s{Ql&t&h0vJ9c2Lt5E}W{bu0J8VmQ;rwZpTDf7`Kwt0& zX!F=OJCFKc5e<f;Y*T&{S$EL0d3F(jerMfUTz1wiAV{tdJsWw}{-)PJ#6Xv;;5ckJ zN#DaMqQ(~;CoxYG(F74pmPFNTL1N>u&_~o|rZ`AlfPy9Z)or7li_(U18||Dn8u|{5 G!~PeObpUbz delta 1685 zcmYjRTXz#x6#h;!laovjZ3rEj+KaT<Qkp;jp;}s?g$k{5DYOWcTSGf-18ssy1TSc~ zRIB0z9P0%X6)#mmZ3|9Wb}iTPMc4Ap-{6~1KKP)l1-SQ+RZZ4>bM|-kKIhx}>@$}Z z{#26t_0A7J0(b~B23DXefEc<Nb~8LKvB!Xpy#^UQ3{SAvK8gKo9AG%eaL9mxUITF) zX0tDVDEgVR7zWrJlo--lT0pjm1k*<dayZIS!we%Fn&g?3#4!Vv=rWK-h9S%Fl!0wH z&TxX^X<qi309N8z1JB_ko6j@6z>t$TWzhRH8)qcWN{mXpD4;r$Nh`f+IG)K^nW?|( zgm}rW@PxzVbz6_bkH=&26WQ37bo|&*qA#<mt*OJ_>WPUl`=sYcQzKqhSc3*d^?F$0 zL97-C%>}h3MyzBekxD8w;uVEgaZcei4%v(?c9l1rdmV2myvgtwwkn**1&Oy5Y-T#} zsKVPAS9k~SD!hja3h!fFpm=VBjqyyPuPd8Q9kqCiiwc+Ufx?IEdKn)ne2h;Nwqu9F z6?`gCHWxW)rAA_%_9;!buX{uLK2!J{Unop4e97<?zE-%(aE%3j!#cjjcM_8dQ!H<q znd=NUSXANM(wkDlsWi*^Ucte*y-52bJd*0ShGX4{VN0N3(8}&gW#d^Yj4k!E^(GNr z)*#g?o7tR7cU$RnJdqU8>N=Ko2pBY-=j?0xtw@X-4)DUm<))E`55RrX8PGcbL7T57 zY_fmztrpF;PgcowSno2+<wCQWynJK<C4?K$;?DHQMLC`cK_e`qE-$Cft3V<3oj@x# zvKP%%(3@lR`Ww(DX&~_5f>mT~LK`8wuAn!&&STe~A+-r;-fKj7{ufe%M~KnkDQGF7 zq`5cp;eV1!NpolHB7aMJNqw}!)J%6<2SpBo69`79G2cNbTIzGKASxUb5>w2~EX<zJ z!Won}2)omzQ};Hu&-){}-PExAsa%Ii=OBqmVjbO>^*BxCU^&Im?x04(5TaGw#xfz% zu1GdDWnSFxBrQOm1Du=J!F>%rZ-X>t(02vhrZn~5pzm0NKVte#VnX$Kw=xIi6UY_0 zw&s9sk{c;EwSG#kUpKWOeuB-WBydnMD#gUzt9kLXVLhD+=rjx}bTO5>k_6XM)z(nm zT4~&db{wKPi==WYP0(&*o)CAj1ObT{CzTWK50sX17X@>Cp7sze5&Z{?DP_8u`IKkr zJQS_iJB!Mm8Qi~C^ET+F&Kb9pUVUinCKfgN%El_j!oHiRI@;IhFV7p*WEiG?5k;k1 z*q;j<4i-;9vBBd9Ms><^rj#mDQ|flry%t$c;y|Ca0NvsR*g?s5B7&WCa=Ylny68N1 z(`Y;P(*FQ@+=NX|SV?RXchKzhdjE$17WWr_2=bYPFS`V=C-MvAG-@ZOu_WT4&K@$B z<d%|EPfuiW7SWzy^?aNQR?lD=QOoJ6<)*(UuhwmW1Jtz#;YTms$GF>6&FG_B)ld6b uByzx&6@c_dNKT=bE^nv1#7@!<3KsOqUPYr2ExQu)XcY8Qs@w1+0{;Tc$}OV+ diff --git a/bin/view/HowToPlayView.class b/bin/view/HowToPlayView.class new file mode 100644 index 0000000000000000000000000000000000000000..689894b8ac0b4853510db2bba55ca88baafbc3f1 GIT binary patch literal 1653 zcmZ`(O;j6I6#j-Jykr<4Nl8meTc-XXgwSZKR7q(C0s<z0gaRr4J(6cSI+?-A1ZdYD z*Y4bVj>p4s<tFjSDH}E(H||`ya_vUlxU$|i!FJMfoaDT@_s(~J-o4*@KmGH=34oi} z4I`yO$2db;MF0~F*Hna%k;=;quc!#)x>Rm3yc))9Dta)<a5Ie8RrKKvsZTLvgLf#N zRBlP|bQrh8xD&>k3^OW{m{l={oQh#g%Vl0J3k+{DEGp=}WmtxLTfv3V{KtHsA7<(Y zhE>fhFF3p=vSXVHf^&97DCo}{mRM=jc7?OScTKYN7F}Ncq`>z)oneV#S%F%#8%|j) z7!nd+v=27yHIqNsG{nI*nSuP~>{?A&uD)zHgrngq-X>&6_BCz^Q+~-SNcg|Z+J|}m zz;3wmV?o0TRu%L~M1~)@nK|3Ey@+cX-og5_Ve@=fn6iM?LScSoLtkFKJHIX?70LJ{ z$bxOT3L=Zb+!wA<<`S@>;V!5dUYTd9YJ0Xt+t9FuZ4D*dQ;^P`9_^XDEF9hBdYRWw zj~uQ~>1EUSv?270V;in6tdDG~e0ro{a?P$2v?A)d+n|QkpF*p=QNAzqdc)BhmcB=Y zxcYr@$g7l7!NjU#P-^ZPw$<rguub8*luF17>NE?Z?k_uMQ0wdDCU>>N@UDjU@V<r* zu%qEaaKi4>s4^XcQ*h2dgyo#UO}qMRcRk9`ymmU7<TX93V5H43uX$~DdAN+piEl;M zA=+i{Nx}t2<vQqt&(TCU(a*^)$xo5GaN8_UFyw=^Z3S-eDnTWZjV{q6rC#!xCAwA} zyJ1ymLq0!`H6A{3X7$%3z0XcZN3HF+jN-Nl6Zb`w7B8SoJ7XGEOA>yY4%6s@j2GY) zsv+g`pfk~?Q+BM~mNuRLGb#wtR-|jce-d;Y$WnF$cg4C<H7YYCb_RYj@c#=ecThAQ z5~~s<<?XV^s&!$~dtYqWPj}y0(%2?3XqYZA`6%?eisxv3o|MnQ=sE)aOpV8tU<+Nx z2$Wg~7ShKEmC|JCZi0~#F2(Ry4BtlUG5pv<qzUyHJ*BwTLhs7NG5SjJ{$TV<3(+QG z6Y+CR45TNTNNjni^MslTdg28shCFdlirw9hC{7?5ES7@FP_YzBb{D5ulATP31Cx<N zBoY1!Gf9?+T%S^tlv5@OL<ic5l4?8CF_NV~RBhqn_ZX5{(@9mnK8q;dJU&UKo4B-< zigj(rlrNgNoEmT9%6GKuF1$eNCK9wp=nn5e6dEq07dOz4Y0?Uap@=x$83U*g&c=B> z#2~(=>$-`Hc!VMRj7#{1Y`;>Ef1@t{PW}CZI{YF<9YNP)d<m6dm|=t=K<)PZUs4p{ NZ{%niqh38@{{kmQp&I}I literal 0 HcmV?d00001 diff --git a/bin/view/MenuView.class b/bin/view/MenuView.class index 6e6ee660c6fd36e9bc8478bef846348ac4c97681..8fc06790094c6f8b79a02f2b03a54b267159109f 100644 GIT binary patch literal 6798 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 AlmGw# delta 1734 zcmZvdYfzL`7{`Byy}Y}xuiOM=6%a&p-4#(xw8b<8Bn;3*#nnnF3Go8vl2}%&-Ly1Q z-!i+{#j-NZG~C^EQ#0+N%`|>#nyC*>Uz@&l@mte#7L~@Do%8>n=YO8_>~o%Td3R0y zE<bwt@6%_2X<Ra?V}(Jx!F?tUR+yx5zn5B88g!T#dhh`gFP(a1l|h$@#cFM=F<5J| zj&2V<ChK|7B!dkaB04~?hlez8^w6hylflC#BY4Cln!#p+M@<TOOb<P75cROdq?oPR ze!|0(nx8Uw+GOm2(=)oaM#Cx%+ca#~@T|deCKGk;#q7|^4zDD>)8KiNDRgRMmxdQK z>=vkEk6yrD1KT8|C)V<!hnF<()fL&NdoOF)Z}JMS8oXxkx_wnGv9F{xk2cr0cXzC< z?diR6Sdr7Tx_x8&riw^kS9fQ{-1&N_+8*g>vd1`g+96k=qm_mB9@ivKD+es*G2g!A znmn$RH!R-dEk(ATU(w#zTT$1wuA@8B)zfX!%G(wPdB-ks`wZT-IK+E)joX*U`xYN? zSbKbEafG85bGg%A@Af&GXtsB{3yNB3R;1sE+PJR0v%}&ej_FAs+vnZGt6Mp4aTf~| zLpOGH^i|C6?VjJUA=0C8FQ{)_)LgG!PgvA5N8xFyZ!2!7(P9I0>;fY{`wki{KB3>@ zq=p#%c8RyZOPqwor<}648pHBAP152s&RCq~l*Ks>pL5<mYWPO;1qT$)wvI@zMH@>j zE^yJ}OD-CGW$`uN*sHz4{&8kZxt#u`;}_dM4k@ye>9^Y3tT|3c`^uH}w^qphBRvwO zL^i5U&a+20RWg=dn$9%El4**iNGX;grC5rTV%d)rOEH99C|USI!9^0}oSc^-psofI zs6djma1uv2fir<ChC7KNh9}w-IH?V9IE&x2IFcF3VqXF?&X9otE1ab!I1&tvlP*y* z!htxM*;#S26AX)!6C-y}&Kr<p3?J0;uWLRD=#v@E!o!7I$|Z7Cnh|GY$f;xdB)Ni+ zOC}eFeXayWF-D0|9L_FDFgix*fH5Xzlx5abxikG$#)MpVu8|7jNd@ufAYO4D8}@k< zjEmuyzw{@u!rC*nmhsn=XgISnv-024e=8BtzK%FS&CWOzuG!^DCQ1z}LZ%3%KB?Ix z>6BgX_;qJ;P>Nj{Ofn^$X%74n+!AAIFe64)&=HL>E$E0bU1qwajS9xOHRv1^N>hRa zx$aSx65NA=UkkF@kmOPwXNFGKoqb!JnJ45>C>9IGDHqJb$uRQBp@>|0K=Wvf;$ww8 zY`u(RyU4p4#eR8;4#~MZPAO+7<FdR;Kj7yl#`7})ekI7Cl&dr*svIiRSSG1iOjZq4 zs(DONZA?`ws8U@_QyZABHWN}?s8%*J)P82F1I$tfsZqzMRndOx)H%7R7imyeXjI=b zSN%eh`c2+}zi5$+<$etuX?g7oxg0Pe5KJ&jZ%3}fA?NXSX*JSjw+*g1T|NlNwQ$Lm z@TD$An5Ea^6bdUDbp=jFC_OH{fhxIEYMbD)|MR8nX4hrndN=n7%8io`!i})_Z+2ZS LgZGM48q5Cy$3a}z diff --git a/src/main/Main.java b/src/main/Main.java index b2ac1d9..af0d52f 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -1,7 +1,8 @@ package main; import model.MenuModel; -import controller.*; +import controller.MenuController; +import controller.SeriesSelector; import view.*; import javax.sound.sampled.AudioInputStream; @@ -16,31 +17,31 @@ public class Main { MenuModel model = new MenuModel(); MenuView view = new MenuView(); + // Initialiser SeriesSelector et le passer à MenuView + SeriesSelector seriesSelector = new SeriesSelector(); + view.setSeriesSelector(seriesSelector); + + // Créer MenuController avec model, view et seriesSelector + new MenuController(model, view, seriesSelector); + JFrame frame = App.getInstance(); frame.add(view); - - // Créer le contrôleur - new MenuController(model, view); - frame.setVisible(true); - // Chargement de la musique PlayMusic("/Music/audio.wav"); }); } - public static void PlayMusic(String location){ + public static void PlayMusic(String location) { try { - // Utilisation de getResource pour charger l'audio URL url = Main.class.getResource(location); - if (url != null) { AudioInputStream audioInput = AudioSystem.getAudioInputStream(url); Clip clip = AudioSystem.getClip(); clip.open(audioInput); clip.start(); } else { - System.out.println("fichier introuvable"); + System.out.println("Fichier audio introuvable"); } } catch (Exception e) { System.out.println(e); diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 7d49ad6..58b7fe6 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -20,8 +20,9 @@ public class GameController implements TilePlacer { private TileDatabaseManager dbManager; private List<Tile> currentTiles; private int tileIndex; + private ScoreGameContext scoreGameContext; // Nouveau contexte pour le score - public GameController(GameContext gameContext, JPanel gridPanel, HexagonTile nextTilePreview) { + public GameController(GameContext gameContext, JPanel gridPanel, HexagonTile nextTilePreview, JLabel scoreLabel) { this.gameContext = gameContext; this.gridPanel = gridPanel; this.hexagonMap = gameContext.getHexagonMap(); @@ -31,6 +32,9 @@ public class GameController implements TilePlacer { this.dbManager = new TileDatabaseManager(); this.tileIndex = 0; + // Initialisation de ScoreGameContext + this.scoreGameContext = new ScoreGameContext(gameContext, scoreLabel); + loadSeries(1); // Charger la série par défaut (ex. série 1) updatePreview(); } @@ -40,7 +44,6 @@ public class GameController implements TilePlacer { tileIndex = 0; System.out.println("Série " + idSeries + " chargée avec " + currentTiles.size() + " tuiles."); } - @Override public void placeTile(Point position) { @@ -52,7 +55,7 @@ public class GameController implements TilePlacer { } System.out.println("Placement de la tuile avec ID : " + (nextTile != null ? nextTile.getId() : "null") + " à la position : " + position); - + hexTile.setTile(nextTile); // Place la tuile actuelle gridPanel.revalidate(); gridPanel.repaint(); @@ -69,46 +72,49 @@ public class GameController implements TilePlacer { gameContext.repaintGrid(gridPanel); generateNextTile(); // Génère la tuile suivante + + // Calcul et mise à jour du score + scoreGameContext.calculateScore(); } } - - public void initializeGame(CameraController cameraController) { generateNextTile(); // Génère la première tuile et assigne une tuile valide à `nextTile` - + Tile initialTile = getNextTile(); // Récupère la tuile générée if (initialTile == null) { System.out.println("Erreur : aucune tuile initiale générée."); return; // Arrête l'initialisation si aucune tuile n'a été générée } - + System.out.println("ID de la tuile initiale générée : " + initialTile.getId()); // Affiche l'ID de la tuile initiale - + int centerX = gridPanel.getPreferredSize().width / 2; int centerY = gridPanel.getPreferredSize().height / 2; - + Point initialPosition = new Point(0, 0); initialPosition.setLocation(centerX / 50, centerY / 50); // Calcule la position centrale - + placeInitialTile(initialPosition, cameraController, initialTile); // Place la première tuile - generateNextTile(); + // Calculer et mettre à jour le score incluant la première tuile + scoreGameContext.calculateScore(); + + generateNextTile(); // Génère la tuile suivante } - public void placeInitialTile(Point position, CameraController cameraController, Tile tile) { if (tile == null) { System.out.println("Erreur : tuile initiale non définie."); return; } - + System.out.println("Placement de la tuile initiale avec ID : " + tile.getId() + " à la position : " + position); - + addHexagonTile(position, gridPanel, 50, cameraController, tile); // Place la première tuile availablePositions.remove(position); // Marque la position comme occupée - + Point[] adjacentPositions = getAdjacentPositions(position); for (Point adj : adjacentPositions) { if (!hexagonMap.containsKey(adj)) { @@ -123,38 +129,37 @@ public class GameController implements TilePlacer { System.out.println("Erreur : position ou panel est null"); return; } - + int xOffset = position.x * (int) (hexSize * 3 / 2); int yOffset = position.y * (int) (Math.sqrt(3) * hexSize); - + if (cameraController != null) { Point viewOffset = cameraController.getViewOffset(); xOffset += viewOffset.x; yOffset += viewOffset.y; } - + if (position.x % 2 != 0) { yOffset += (int) (Math.sqrt(3) * hexSize / 2); } - + boolean isPlaceholder = (tile == null); // Si tile est null, c'est un placeholder HexagonTile hexTile = new HexagonTile(position, isPlaceholder); - + if (tile != null) { hexTile.setTile(tile); } else { System.out.println("Aucun tile n'a été fourni pour cette position : " + position); } - + hexTile.setBounds(xOffset, yOffset, hexSize, hexSize); hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions)); - + hexagonMap.put(position, hexTile); panel.add(hexTile); panel.revalidate(); panel.repaint(); } - public void generateNextTile() { if (tileIndex < currentTiles.size()) { @@ -167,9 +172,6 @@ public class GameController implements TilePlacer { System.out.println("Fin de la série. Plus de tuiles à placer."); } } - - - private void updatePreview() { if (nextTilePreview != null) { @@ -181,7 +183,6 @@ public class GameController implements TilePlacer { nextTilePreview.repaint(); } } - public Tile getNextTile() { return nextTile; @@ -190,21 +191,21 @@ public class GameController implements TilePlacer { private Point[] getAdjacentPositions(Point position) { if (position.x % 2 == 0) { return new Point[]{ - new Point(position.x + 1, position.y), - new Point(position.x - 1, position.y), - new Point(position.x, position.y + 1), - new Point(position.x, position.y - 1), - new Point(position.x + 1, position.y - 1), - new Point(position.x - 1, position.y - 1) + new Point(position.x + 1, position.y), + new Point(position.x - 1, position.y), + new Point(position.x, position.y + 1), + new Point(position.x, position.y - 1), + new Point(position.x + 1, position.y - 1), + new Point(position.x - 1, position.y - 1) }; } else { return new Point[]{ - new Point(position.x + 1, position.y), - new Point(position.x - 1, position.y), - new Point(position.x, position.y + 1), - new Point(position.x, position.y - 1), - new Point(position.x + 1, position.y + 1), - new Point(position.x - 1, position.y + 1) + new Point(position.x + 1, position.y), + new Point(position.x - 1, position.y), + new Point(position.x, position.y + 1), + new Point(position.x, position.y - 1), + new Point(position.x + 1, position.y + 1), + new Point(position.x - 1, position.y + 1) }; } } diff --git a/src/main/java/controller/HowToPlayListener.java b/src/main/java/controller/HowToPlayListener.java new file mode 100644 index 0000000..d327a5a --- /dev/null +++ b/src/main/java/controller/HowToPlayListener.java @@ -0,0 +1,20 @@ +package controller; + +import view.HowToPlayView; +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class HowToPlayListener implements ActionListener { + private JFrame parent; + + public HowToPlayListener(JFrame parent) { + this.parent = parent; + } + + @Override + public void actionPerformed(ActionEvent e) { + HowToPlayView howToPlayDialog = new HowToPlayView(parent); + howToPlayDialog.setVisible(true); + } +} diff --git a/src/main/java/controller/MenuController.java b/src/main/java/controller/MenuController.java index 7596a77..998827d 100644 --- a/src/main/java/controller/MenuController.java +++ b/src/main/java/controller/MenuController.java @@ -1,15 +1,15 @@ package controller; -import model.*; -import view.*; +import model.MenuModel; +import view.MenuView; public class MenuController { - public MenuController(MenuModel model, MenuView view) { + public MenuController(MenuModel model, MenuView view, SeriesSelector seriesSelector) { + // Assignation des action listeners aux boutons du menu + view.getQuiButton().addActionListener(new QuiListener()); // Quitte l'application - view.getResumeButton().addActionListener(new ResListener()); - view.getNewGameButton().addActionListener(new NewListener()); - view.getQuiButton().addActionListener(new QuiListener()); + // Définir le sélecteur de séries + view.setSeriesSelector(seriesSelector); } } - diff --git a/src/main/java/controller/QuiListener.java b/src/main/java/controller/QuiListener.java index e42a344..c7c95b5 100644 --- a/src/main/java/controller/QuiListener.java +++ b/src/main/java/controller/QuiListener.java @@ -1,12 +1,11 @@ package controller; -import java.awt.event.ActionListener; import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; public class QuiListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { System.exit(0); - } } diff --git a/src/main/java/controller/ResListener.java b/src/main/java/controller/ResListener.java deleted file mode 100644 index d53191e..0000000 --- a/src/main/java/controller/ResListener.java +++ /dev/null @@ -1,17 +0,0 @@ -package controller; -import view.App; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.SwingUtilities; - -import view.GameView; - -public class ResListener implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - SwingUtilities.invokeLater(() -> new GameView()); - App.getInstance().dispose(); - - } -} \ No newline at end of file diff --git a/src/main/java/controller/ScoreGameContext.java b/src/main/java/controller/ScoreGameContext.java new file mode 100644 index 0000000..f04a388 --- /dev/null +++ b/src/main/java/controller/ScoreGameContext.java @@ -0,0 +1,142 @@ +package controller; + +import model.Tile; +import model.TerrainType; +import model.Pocket; +import view.HexagonTile; + +import javax.swing.*; +import java.awt.Point; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class ScoreGameContext { + private GameContext gameContext; + private int score; + private JLabel scoreLabel; + private Map<Point, Pocket> pocketMap; // Map des Pockets pour chaque tuile + private Set<Pocket> pockets; // Ensemble de toutes les Pockets + + public ScoreGameContext(GameContext gameContext, JLabel scoreLabel) { + this.gameContext = gameContext; + this.scoreLabel = scoreLabel; + this.pocketMap = new HashMap<>(); + this.pockets = new HashSet<>(); + this.score = 0; + } + + // Méthode principale pour recalculer le score en reconstruisant toutes les Pockets + public void calculateScore() { + score = 0; + pockets.clear(); + pocketMap.clear(); + + // Parcourt chaque tuile dans la grille pour créer des Pockets par type de terrain + for (Map.Entry<Point, HexagonTile> entry : gameContext.getHexagonMap().entrySet()) { + Point position = entry.getKey(); + HexagonTile hexTile = entry.getValue(); + + if (hexTile.isFilled()) { + Tile tile = hexTile.getTile(); + + // Crée ou fusionne une Pocket pour chaque type de terrain de la tuile + for (int segment = 0; segment < 6; segment++) { + TerrainType terrainType = tile.getTerrainForSegment(segment); + if (terrainType != null) { + Pocket pocket = findOrCreatePocket(position, segment, terrainType); + pocketMap.put(position, pocket); + } + } + } + } + + // Calcule le score total en additionnant le score de chaque Pocket + System.out.println("Pockets and their sizes:"); + for (Pocket pocket : pockets) { + System.out.println("Pocket with terrain " + pocket.getTerrainType() + " has size " + pocket.getSize()); + score += pocket.calculateScore(); + } + + updateScoreDisplay(); + } + + // Recherche ou crée une Pocket pour un terrain spécifique dans une tuile + private Pocket findOrCreatePocket(Point position, int segment, TerrainType terrainType) { + Pocket newPocket = new Pocket(terrainType); + newPocket.addTile(position); + + // Vérifie les voisins pour fusionner les Pockets si les segments se touchent + for (int adjSegment = 0; adjSegment < 6; adjSegment++) { + Point neighborPos = getAdjacentPositionForSegment(position, adjSegment); + Pocket neighborPocket = pocketMap.get(neighborPos); + + if (neighborPocket != null && neighborPocket.getTerrainType() == terrainType) { + // Vérifie si les segments de terrain se touchent avant de fusionner les Pockets + if (areSegmentsConnected(position, neighborPos, segment, adjSegment, terrainType)) { + System.out.println("Merging pocket at " + position + " with pocket at " + neighborPos + " for terrain " + terrainType); + neighborPocket.merge(newPocket); + pockets.remove(newPocket); // Supprime la Pocket fusionnée + return neighborPocket; // Retourne la Pocket fusionnée + } + } + } + + System.out.println("New pocket created at " + position + " for terrain " + terrainType); + pockets.add(newPocket); // Ajoute la nouvelle Pocket si aucune fusion n'a eu lieu + return newPocket; + } + + // Vérifie si les segments de deux tuiles se touchent et partagent le même type de terrain + private boolean areSegmentsConnected(Point position1, Point position2, int segment1, int segment2, TerrainType terrainType) { + Tile tile1 = gameContext.getHexagonMap().get(position1).getTile(); + Tile tile2 = gameContext.getHexagonMap().get(position2).getTile(); + + if (tile1 == null || tile2 == null) return false; + + TerrainType terrainSegment1 = tile1.getTerrainForSegment(segment1); + TerrainType terrainSegment2 = tile2.getTerrainForSegment(segment2); + + boolean connected = terrainSegment1 == terrainType && terrainSegment2 == terrainType; + if (connected) { + System.out.println("Segments connected between " + position1 + " and " + position2 + " for terrain " + terrainType); + } + return connected; + } + + // Obtenir la position adjacente pour un segment spécifique (0 à 5) + private Point getAdjacentPositionForSegment(Point position, int segment) { + if (position.x % 2 == 0) { + switch (segment) { + case 0: return new Point(position.x + 1, position.y); + case 1: return new Point(position.x + 1, position.y - 1); + case 2: return new Point(position.x, position.y - 1); + case 3: return new Point(position.x - 1, position.y - 1); + case 4: return new Point(position.x - 1, position.y); + case 5: return new Point(position.x, position.y + 1); + default: return position; + } + } else { + switch (segment) { + case 0: return new Point(position.x + 1, position.y); + case 1: return new Point(position.x + 1, position.y + 1); + case 2: return new Point(position.x, position.y + 1); + case 3: return new Point(position.x - 1, position.y + 1); + case 4: return new Point(position.x - 1, position.y); + case 5: return new Point(position.x, position.y - 1); + default: return position; + } + } + } + + // Met à jour l'affichage du score dans GameView + private void updateScoreDisplay() { + System.out.println("Updated Score: " + score); // Débogage du score + scoreLabel.setText("Score: " + score); + } + + public int getScore() { + return score; + } +} diff --git a/src/main/java/controller/SerieListener.java b/src/main/java/controller/SerieListener.java new file mode 100644 index 0000000..6b60ead --- /dev/null +++ b/src/main/java/controller/SerieListener.java @@ -0,0 +1,19 @@ +package controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class SerieListener implements ActionListener { + private final GameController gameController; + private final int seriesNumber; + + public SerieListener(GameController gameController, int seriesNumber) { + this.gameController = gameController; + this.seriesNumber = seriesNumber; + } + + @Override + public void actionPerformed(ActionEvent e) { + gameController.loadSeries(seriesNumber); + } +} diff --git a/src/main/java/controller/SeriesSelector.java b/src/main/java/controller/SeriesSelector.java new file mode 100644 index 0000000..a573282 --- /dev/null +++ b/src/main/java/controller/SeriesSelector.java @@ -0,0 +1,12 @@ +package controller; + +import view.GameView; +import javax.swing.SwingUtilities; + +public class SeriesSelector { + + public void startGameWithSeries(int seriesId) { + SwingUtilities.invokeLater(() -> new GameView(seriesId)); // Démarre GameView avec l'ID de série donné + System.out.println("Série " + seriesId + " sélectionnée et jeu démarré."); + } +} diff --git a/src/main/java/model/Pocket.java b/src/main/java/model/Pocket.java new file mode 100644 index 0000000..4ae2071 --- /dev/null +++ b/src/main/java/model/Pocket.java @@ -0,0 +1,41 @@ +package model; + +import java.awt.Point; +import java.util.HashSet; +import java.util.Set; + +public class Pocket { + private TerrainType terrainType; // Type de terrain de cette Pocket + private Set<Point> tiles; // Ensemble des positions des tuiles de la Pocket + + public Pocket(TerrainType terrainType) { + this.terrainType = terrainType; + this.tiles = new HashSet<>(); + } + + public TerrainType getTerrainType() { + return terrainType; + } + + public int getSize() { + return tiles.size(); + } + + public void addTile(Point position) { + tiles.add(position); + } + + public boolean containsTile(Point position) { + return tiles.contains(position); + } + + public void merge(Pocket other) { + if (this.terrainType == other.terrainType) { + this.tiles.addAll(other.tiles); + } + } + + public int calculateScore() { + return getSize() * getSize(); // La taille au carré donne le score + } +} diff --git a/src/main/java/model/Tile.java b/src/main/java/model/Tile.java index 29cbfa6..ff5048a 100644 --- a/src/main/java/model/Tile.java +++ b/src/main/java/model/Tile.java @@ -1,17 +1,34 @@ package model; public class Tile { - private int id; // Ajoute l'attribut id - private TerrainType[] terrains; // 2 terrains maximum par tuile - private int segmentsForTerrain1; - private int rotation; + private int id; // ID de la tuile + private TerrainType[] terrains; // Tableau contenant deux types de terrains (ex. MER, FORET) + private int segmentsForTerrain1; // Nombre de segments pour le premier terrain + private int rotation; // Rotation de la tuile (en multiple de 60 degrés) - // Constructeur modifié pour inclure l'ID public Tile(int id, TerrainType terrain1, TerrainType terrain2, int segmentsForTerrain1) { this.id = id; this.terrains = new TerrainType[]{terrain1, terrain2}; this.segmentsForTerrain1 = segmentsForTerrain1; - this.rotation = 0; + this.rotation = 0; // Initialisation de la rotation à 0 + } + + // Renvoie le terrain pour l'index donné (0 ou 1) + public TerrainType getTerrain(int index) { + if (index >= 0 && index < terrains.length) { + return terrains[index]; + } + return null; // Retourne null si l'index est invalide + } + + // Méthode pour obtenir le terrain associé à un segment spécifique (prend en compte la rotation) + public TerrainType getTerrainForSegment(int segmentIndex) { + int adjustedIndex = (segmentIndex - rotation + 6) % 6; + if (adjustedIndex < segmentsForTerrain1) { + return terrains[0]; + } else { + return terrains[1]; + } } public void rotateClockwise() { @@ -19,9 +36,8 @@ public class Tile { } public void rotateCounterClockwise() { - rotation = (rotation + 5) % 6; // Tourner dans le sens inverse, équivalent à -1 dans un modulo 6 + rotation = (rotation + 5) % 6; // Tourner dans le sens inverse } - public int getRotation() { return rotation; @@ -30,12 +46,4 @@ public class Tile { public int getId() { return id; } - - public TerrainType getTerrain(int index) { - return index >= 0 && index < 2 ? terrains[index] : null; - } - - public int getSegmentsForTerrain(int index) { - return index == 0 ? segmentsForTerrain1 : 6 - segmentsForTerrain1; - } } diff --git a/src/main/java/view/ButtonHoverListener.java b/src/main/java/view/ButtonHoverListener.java index a97fc0b..81cbf30 100644 --- a/src/main/java/view/ButtonHoverListener.java +++ b/src/main/java/view/ButtonHoverListener.java @@ -1,28 +1,27 @@ package view; -import javax.swing.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.Color; public class ButtonHoverListener extends MouseAdapter { - private Color hoverColor = new Color(200, 150, 100); - private Color normalColor = new Color(243, 171, 115, 150); + private final Color hoverColor = new Color(200, 150, 100, 200); // Couleur de hover avec transparence + private final Color normalColor = new Color(243, 171, 115, 150); // Couleur normale avec transparence @Override public void mouseEntered(MouseEvent e) { - if (e.getSource() instanceof JButton) { - JButton button = (JButton) e.getSource(); + if (e.getSource() instanceof BtnPerso) { // Applique uniquement aux boutons de type BtnPerso + BtnPerso button = (BtnPerso) e.getSource(); button.setBackground(hoverColor); } } @Override public void mouseExited(MouseEvent e) { - if (e.getSource() instanceof JButton) { - JButton button = (JButton) e.getSource(); + if (e.getSource() instanceof BtnPerso) { // Applique uniquement aux boutons de type BtnPerso + BtnPerso button = (BtnPerso) e.getSource(); button.setBackground(normalColor); } } -} \ No newline at end of file +} diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 62469a2..dea6cc1 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -14,52 +14,48 @@ public class GameView extends JFrame { private GameController gameController; private CameraController cameraController; private GameContext gameContext; + private JLabel scoreLabel; - public GameView() { + // Couleurs pour le style + private final Color hoverColor = new Color(200, 150, 100); // Couleur de hover avec transparence + private final Color normalColor = new Color(243, 171, 115); // Couleur normale avec transparence + + public GameView(int seriesId) { setTitle("Jeu de Tuiles"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); setSize(1500, 750); setLocationRelativeTo(null); - // Initialiser le contexte de jeu gameContext = new GameContext(); - - // Créer la grille d'hexagones gridPanel = createHexagonGrid(); - - // Calculer et centrer la grille dans GameView centerGridPanel(); - add(gridPanel, BorderLayout.CENTER); - // Initialiser la preview pour la prochaine tuile nextTilePreview = new HexagonTile(null, false); + scoreLabel = new JLabel("Score: 0"); + scoreLabel.setForeground(Color.BLACK); // Texte noir pour contraste JPanel controlPanel = createControlPanel(); controlPanel.setPreferredSize(new Dimension(200, 600)); add(controlPanel, BorderLayout.EAST); - // Initialiser les contrôleurs avec le contexte de jeu - gameController = new GameController(gameContext, gridPanel, nextTilePreview); + gameController = new GameController(gameContext, gridPanel, nextTilePreview, scoreLabel); + gameController.loadSeries(seriesId); // Charge la série cameraController = new CameraController(gridPanel, gameContext); - // Ajouter un écouteur pour la molette de la souris MouseWheelController wheelController = new MouseWheelController(nextTilePreview, gameController); - addMouseWheelListener(wheelController); - // Appeler l'initialisation du jeu gameController.initializeGame(cameraController); - setVisible(true); } private JPanel createHexagonGrid() { JPanel panel = new JPanel(); - panel.setLayout(null); // Permet de placer des composants avec des coordonnées absolues - panel.setBackground(Color.WHITE); - panel.setPreferredSize(new Dimension(800, 800)); // Peut être ajusté si nécessaire + panel.setLayout(null); + panel.setBackground(normalColor); // Couleur de fond de la grille + panel.setPreferredSize(new Dimension(800, 800)); return panel; } @@ -67,23 +63,28 @@ public class GameView extends JFrame { int centerX = (getWidth() - gridPanel.getPreferredSize().width) / 2; int centerY = (getHeight() - gridPanel.getPreferredSize().height) / 2; gameContext.updateOffset(centerX, centerY); - gameContext.repaintGrid(gridPanel); // Rappel pour centrer initialement les tuiles + gameContext.repaintGrid(gridPanel); } private JPanel createControlPanel() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); - panel.setBackground(Color.LIGHT_GRAY); + panel.setBackground(normalColor); // Couleur normale pour le panneau de contrôle panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - panel.add(new JLabel("Prochaine tuile : ")); + JLabel nextTileLabel = new JLabel("Prochaine tuile : "); + nextTileLabel.setForeground(Color.BLACK); // Texte noir pour contraste + panel.add(nextTileLabel); panel.add(Box.createRigidArea(new Dimension(0, 10))); nextTilePreview.setPreferredSize(new Dimension(150, 150)); - nextTilePreview.setBackground(Color.GRAY); + nextTilePreview.setBackground(hoverColor); // Couleur hover pour différencier nextTilePreview.setOpaque(true); panel.add(nextTilePreview); + panel.add(Box.createRigidArea(new Dimension(0, 30))); + panel.add(scoreLabel); + return panel; } } diff --git a/src/main/java/view/HexagonTile.java b/src/main/java/view/HexagonTile.java index 09e7362..28945ee 100644 --- a/src/main/java/view/HexagonTile.java +++ b/src/main/java/view/HexagonTile.java @@ -10,7 +10,7 @@ import java.awt.geom.Path2D; public class HexagonTile extends JPanel { private Tile tile; private Point position; - private boolean isPlaceholder; // Nouveau champ pour indiquer si l'hexagone est un placeholder + private boolean isPlaceholder; // Indicateur si l'hexagone est un placeholder public HexagonTile(Point position, boolean isPlaceholder) { this.position = position; @@ -50,7 +50,7 @@ public class HexagonTile extends JPanel { g2d.setClip(largeHexagon); if (tile != null) { - drawTerrainSegments(g2d, centerX, centerY, largeRadius, tile.getRotation()); + drawTerrainSegments(g2d, centerX, centerY, largeRadius); } else { g2d.setColor(Color.LIGHT_GRAY); g2d.fill(largeHexagon); @@ -62,13 +62,11 @@ public class HexagonTile extends JPanel { g2d.draw(largeHexagon); } - private void drawTerrainSegments(Graphics2D g2d, int centerX, int centerY, int radius, int rotation) { - int segmentsTerrain1 = tile.getSegmentsForTerrain(0); + private void drawTerrainSegments(Graphics2D g2d, int centerX, int centerY, int radius) { + // Parcourt les segments de 0 à 5 pour dessiner chaque segment en fonction du terrain associé for (int i = 0; i < 6; i++) { - int segmentIndex = (i + rotation) % 6; - g2d.setColor(segmentIndex < segmentsTerrain1 ? - getTerrainColor(tile.getTerrain(0)) : - getTerrainColor(tile.getTerrain(1))); + TerrainType terrain = tile.getTerrainForSegment(i); // Récupère le terrain du segment, en prenant en compte la rotation + g2d.setColor(getTerrainColor(terrain)); g2d.fillArc(centerX - radius, centerY - radius, 2 * radius, 2 * radius, 60 * i, 60); } } diff --git a/src/main/java/view/HowToPlayView.java b/src/main/java/view/HowToPlayView.java new file mode 100644 index 0000000..e0fee4d --- /dev/null +++ b/src/main/java/view/HowToPlayView.java @@ -0,0 +1,35 @@ +package view; + +import javax.swing.*; +import java.awt.*; + +public class HowToPlayView extends JDialog { + + public HowToPlayView(JFrame parent) { + super(parent, "Comment Jouer", true); + + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setBackground(new Color(243, 171, 115, 200)); + + JLabel titleLabel = new JLabel("COMMENT JOUER"); + titleLabel.setFont(new Font("Helvetica", Font.BOLD, 30)); + titleLabel.setAlignmentX(Component.CENTER_ALIGNMENT); + panel.add(titleLabel); + + JLabel instruction1 = new JLabel("Déplacer la caméra : clique droit enfoncé"); + JLabel instruction2 = new JLabel("Poser des tuiles : clique gauche sur un petit hexagone"); + JLabel instruction3 = new JLabel("Orientation des tuiles : Molette de la souris"); + + for (JLabel label : new JLabel[]{instruction1, instruction2, instruction3}) { + label.setFont(new Font("Helvetica", Font.PLAIN, 20)); + label.setAlignmentX(Component.CENTER_ALIGNMENT); + panel.add(Box.createRigidArea(new Dimension(0, 10))); + panel.add(label); + } + + add(panel); + setSize(600, 400); + setLocationRelativeTo(parent); + } +} diff --git a/src/main/java/view/MenuView.java b/src/main/java/view/MenuView.java index 2a28573..c91e3fe 100644 --- a/src/main/java/view/MenuView.java +++ b/src/main/java/view/MenuView.java @@ -2,79 +2,177 @@ package view; import javax.swing.*; import java.awt.*; +import controller.SeriesSelector; public class MenuView extends JComponent { + private BtnPerso resumeButton; private BtnPerso newGameButton; private JButton quitButton; + private JPanel panelCote; + private JPanel howToPlayPanel; + private JPanel centeredPanel; + private JPanel seriesPanel; + private SeriesSelector seriesSelector; private Image backgroundImage; private ImageIcon logo; private ImageIcon quit; - private JPanel panelCoté; - private JLabel labelImg; + private JLabel labelImg; // Déclaration de labelImg public MenuView() { + initMenu(); + } - panelCoté = new JPanel(new GridBagLayout()); + public void setSeriesSelector(SeriesSelector seriesSelector) { + this.seriesSelector = seriesSelector; + } + + // Méthode pour afficher les boutons de sélection de série + public void showSeriesButtons() { + howToPlayPanel.setVisible(false); + centeredPanel.removeAll(); + centeredPanel.add(seriesPanel); + seriesPanel.setVisible(true); + + revalidate(); + repaint(); + } + + // Méthode pour afficher/masquer le panneau "Comment jouer" + private void toggleHowToPlay() { + seriesPanel.setVisible(false); + howToPlayPanel.setVisible(!howToPlayPanel.isVisible()); + centeredPanel.removeAll(); + centeredPanel.add(howToPlayPanel); + + revalidate(); + repaint(); + } + + private void initMenu() { + // Initialisation du panneau latéral + panelCote = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); - panelCoté.setBackground(new Color(243, 171, 115, 150)); - panelCoté.setPreferredSize(new Dimension(300, 0)); + panelCote.setBackground(new Color(243, 171, 115, 150)); + panelCote.setPreferredSize(new Dimension(300, 0)); - // Utilisation de getResource pour charger les images + // Charger les images backgroundImage = new ImageIcon(getClass().getResource("/java/view/img/bg.png")).getImage(); logo = new ImageIcon(getClass().getResource("/java/view/img/D.png")); quit = new ImageIcon(getClass().getResource("/java/view/img/quit.png")); - + // Redimensionnement des images Image quit1 = quit.getImage(); Image lg = logo.getImage(); Image resizedlg = lg.getScaledInstance(300, 300, Image.SCALE_SMOOTH); - ImageIcon logoIcon = new ImageIcon(resizedlg); - - labelImg = new JLabel(logoIcon); - - resumeButton = new BtnPerso("RESUME"); - newGameButton = new BtnPerso("NEW GAME"); + labelImg = new JLabel(new ImageIcon(resizedlg)); // Initialisation de labelImg + // Configuration du bouton "Quitter" avec une icône redimensionnée int buttonWidth = 65; int buttonHeight = 40; Image resizedImage = quit1.getScaledInstance(buttonWidth, buttonHeight, Image.SCALE_SMOOTH); ImageIcon resizedIcon = new ImageIcon(resizedImage); + // Boutons + resumeButton = new BtnPerso("JOUER"); + newGameButton = new BtnPerso("COMMENT JOUER"); quitButton = new JButton(resizedIcon); + + // Configurer le bouton "Quitter" pour enlever le fond et la bordure quitButton.setPreferredSize(new Dimension(buttonWidth, buttonHeight)); - quitButton.setPreferredSize(new Dimension(50, 50)); - quitButton.setBackground(new Color(243, 171, 115, 150)); - quitButton.setBorderPainted(false); - quitButton.setOpaque(true); - quitButton.setFocusPainted(false); + quitButton.setBackground(new Color(243, 171, 115, 150)); // Fond transparent similaire + quitButton.setBorderPainted(false); // Enlever la bordure pour un look plus propre + quitButton.setOpaque(true); // Rendre le fond visible + quitButton.setFocusPainted(false); // Enlever le focus autour du bouton - ButtonHoverListener hoverListener = new ButtonHoverListener(); - resumeButton.addMouseListener(hoverListener); - newGameButton.addMouseListener(hoverListener); - quitButton.addMouseListener(hoverListener); + // Ajout des listeners pour les boutons + resumeButton.addActionListener(e -> showSeriesButtons()); + newGameButton.addActionListener(e -> toggleHowToPlay()); + // Créer le panneau "Comment jouer" et le panneau de séries + howToPlayPanel = createHowToPlayPanel(); + howToPlayPanel.setVisible(false); + + seriesPanel = createSeriesPanel(); + seriesPanel.setVisible(false); + + // Panneau centré pour le contenu dynamique + centeredPanel = new JPanel(new GridBagLayout()); + centeredPanel.setOpaque(false); + centeredPanel.add(howToPlayPanel); + + // Ajout des composants au panneau latéral gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = new Insets(10, 10, 10, 10); gbc.weightx = 1.0; - gbc.gridx = 0; + + // Ajouter l'image de logo gbc.gridy = 0; + panelCote.add(labelImg, gbc); // Ajout de labelImg ici - panelCoté.add(labelImg, gbc); - + // Ajouter les boutons gbc.gridy = 1; - panelCoté.add(resumeButton, gbc); + panelCote.add(resumeButton, gbc); gbc.gridy = 2; - panelCoté.add(newGameButton, gbc); + panelCote.add(newGameButton, gbc); gbc.gridy = 3; - panelCoté.add(quitButton, gbc); + panelCote.add(quitButton, gbc); setLayout(new BorderLayout()); - add(panelCoté, BorderLayout.WEST); + add(panelCote, BorderLayout.WEST); + add(centeredPanel, BorderLayout.CENTER); + } + + private JPanel createHowToPlayPanel() { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setBackground(new Color(243, 171, 115, 200)); + panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + + JLabel titleLabel = new JLabel("COMMENT JOUER"); + titleLabel.setFont(new Font("Helvetica", Font.BOLD, 30)); + titleLabel.setAlignmentX(Component.CENTER_ALIGNMENT); + panel.add(titleLabel); + + String[] instructions = { + "Déplacer la caméra : clique droit enfoncé", + "Poser des tuiles : clique gauche sur un petit hexagone", + "Orientation des tuiles : Molette de la souris" + }; + + for (String text : instructions) { + JLabel label = new JLabel(text); + label.setFont(new Font("Helvetica", Font.PLAIN, 20)); + label.setAlignmentX(Component.CENTER_ALIGNMENT); + panel.add(Box.createRigidArea(new Dimension(0, 10))); + panel.add(label); + } + + panel.setPreferredSize(new Dimension(700, 350)); + return panel; + } + + private JPanel createSeriesPanel() { + JPanel panel = new JPanel(new GridLayout(2, 2, 10, 10)); + panel.setOpaque(false); + + for (int i = 1; i <= 4; i++) { + int seriesId = i; + BtnPerso seriesButton = new BtnPerso("Série " + seriesId); + seriesButton.addActionListener(e -> { + if (seriesSelector != null) { + seriesSelector.startGameWithSeries(seriesId); + } + }); + + seriesButton.addMouseListener(new ButtonHoverListener()); + panel.add(seriesButton); + } + return panel; } @Override