From b68751ce2c224062197bf4c7371ca629e5e8ef9d Mon Sep 17 00:00:00 2001 From: Vincent <xefal77@gmail.com> Date: Sun, 27 Oct 2024 23:07:11 +0100 Subject: [PATCH] Fix des scores --- bin/controller/GameContext.class | Bin 1950 -> 2592 bytes bin/controller/GameController.class | Bin 6231 -> 6231 bytes bin/controller/ScoreGameContext.class | Bin 4674 -> 4380 bytes bin/model/Pocket.class | Bin 1091 -> 1828 bytes bin/model/Tile.class | Bin 977 -> 1064 bytes bin/view/HexagonTile$1.class | Bin 754 -> 754 bytes bin/view/HexagonTile.class | Bin 2843 -> 3061 bytes src/main/java/controller/GameContext.java | 38 ++++- src/main/java/controller/GameController.java | 71 +------- .../java/controller/ScoreGameContext.java | 153 ++++++------------ src/main/java/model/Pocket.java | 111 +++++++------ src/main/java/model/Tile.java | 64 ++------ src/main/java/view/HexagonTile.java | 85 ++-------- 13 files changed, 177 insertions(+), 345 deletions(-) diff --git a/bin/controller/GameContext.class b/bin/controller/GameContext.class index ff319ea1cbd9a674ec0e7051ddaf30cdc59ccaa3..f92151f10e124667dc391bbc6256ef652680b3dc 100644 GIT binary patch literal 2592 zcmcgu$#WD{9RA*HJxfC-%LI`<AWXtC$PzRYLm+`LkPQ>Sut+*HO{SAccj)fP;;siT zRB`d3;DLiy!BMMNj8s{i{R{jvyi1AS>z*)^#qwsV`ps|OfA8h@zkmG=zzKX6#~$=4 zI2T6%eKG7tPQm#&!aj0AL4O=k3`owPgoY9r#>E8Q$4CMvF)EKs3N9y*#F#v;D!3M- z;B|T2h;&EkhktQ=h?|k_oR3Ai{a=zBF&;-ZG<i%Y$j7l0eF^lSpg>n}OCVm<7qm&s z9MEP3>iVa&IW1FmjZ%h$tUzqUm^3xFZ0iC?S8_XjRGW7*!<J#X+5S00pU<50?Ts2G zJ=;YK4YX*Kw26{FY&nK&Sf;bm(TMI+Y*&qOQq~xkrXtp@TaNAuBv-p8uhTFMw@V<H zZoMoJ>ahw8xvt+Z^}+JYgl><@5Ck?%>TV@OFXj4lYmH|=>Eo+uYob{{)f8=?S|{6; zKKy)luki728OLaGsFHNUvPQMy0&01-pt<_8OgNp($@CMpKC7`OeYQ~$*p&8CT*x@{ zhB=uzKdhO0DJ$hRjJR5Unpu0*Q81~XD9|MHC`@U2-E?c3*5aGVRQ=bMuHSIntO7&e z*ni5csi*92e8ei-dHpO0haK+IX7nD*boB-IkQ_=ChmaAduMX%r%_%Z+6>nkh8U_oh zq7`id8$FHJF-tpH6$fxo#S|Fuw2Bhi70jqGVX2tKZ51{+q>WWy^t0!T>Dr3|;mWU? zGfmy@DQS+QJ1Si8C`+~E>NQX?hj|qXm{+i<;v;;l;uCzT;xlAad@j?fadpbJwMAJ> z6<^>>f#y7`U|Xe<Zf9zWLO))3C5;^&nwZk_+>3^4#5q^DHP^B$#Ff2Yu8Ozl(ia!q zwKdZzah5n0RWnRnAj&zg7g^F3EDw(wul+PH&!=Z~**_br6g6j%ee`zoDtFWLkfvq% zniS-cbNDXkEOeB>Wvx_ZKw^PkjvvW>KRulR&E>R)oZB{Shtj>Rz0AYW-P2atEU*&_ zx53|sxUJ7=B}1+X$(7|`JX(S4k*dsVZ5*vvv5U9z9^RxuUfvur2<#&kK$;&X>ovZg zILC=Rg)~kn&%?xqdCv>}rrVxDv^_^)>=}Yj5F!{R7<mGPV00`Pe1_N)#DAu&z}q~V zsR?XB2wPEyZFm#g>3avcM{tzhr1fpYr1fyyV}yPp;HySF;=W3#$A}$A`#LJhYL&wk zl@nBX2k-J+?IpfiMGAEwTM^yMLIoK|oB_qRY<-GEH6i)_fv-*sy_D|6d%lj?%S7c9 z_M=Q<397&nHV6zHSi(kud-$3_oxlqu2M;cxUP9515WxlsHg<$JhaRITd7;=Ikx;4$ z&A;G{CTyO*TWnW6W_b1<Hl>s*rwLoEyW{OjDk1}=`gnUJrTB1)^v&TE@#K-@k*C=9 z@YVeOr`XPKhs-A6wWk9c2@jwJgKYZ{%XJZ_`DS0jC~op}@Bz1a40mu1-{CsG#|=E- z3;hGRUDP~`;7imgIQa^BL>25-&`nH1Qjut*U|(Oc9RZ(34S`ei;5A-6Kt$GAbUnvT zj?u1x{mdaedmr}?$Z3*TXq;z?Q?-Pa0IpQ&h4tx@8X8|K@6iiu>AwBYdK}L~4d)@g zt-Akz!dfShkRMhJN6xa}%`UDOP~;pMsOOW=ifLB6#Qx3THlKt$u<(e`3qA^eu(yB0 v6;YH$3+6;8FLl|`1OhMdNI}nE_@=T)y)=Kub8?pBApb?<jm<mZN+k9V4OT}h delta 850 zcmZvbTTfF#6otRjmJU6gKn=!3!GNf!+=?P{#|mCRxyelw6f0IJa#ITU)*s+wUrbEA zMBjXoL{0R;AK(x0kN9fDHEp5^dXibQ*WR;c@7Xiw)&3Wy*>AtTd<9zB@;O4naKR@) zB0?3thCZL70=a0o<WtOL7rElB{wM=njdG2_C|wLW7&eSVi81D2+%OT*!bt~H;Y6|W z=<~V3bT~1PCzXT~dBge3xarf)EeA7(S;Os}cd<a|j$tm>60FYFQSY&DDY=!5Z)VcV z@&4q-;!twkQq9qS0^_NSrG^t8C3!`1I};yWORvgXN1NpowU)cI8IqQJG#lnE_eohE zuwYpv?NRnOm-6Jk2P?alNLwDdU~DU$+K%_9o+KC6RwvTSQZBP%S!KnrW?AQv<uMzU z4E2^x>T`pk>D<TAj~=zUN&|vwwu;B&m{@@08mjpZKPj$46${I!^9vhtp>TV)QN9DZ z9XLpcLzGf3tdRDw*2HO&vO!VDJk3S59|*md;o+oiJCv@F_O#d;n*Sp)dnJtpNtUzH zv~W(iH;unn)22nOICM*Ebn2jHUlsY~6`zRih!x6mj}Ll@&?iqj9R-b7qm#P#^VXf> zGuF#>n%DUrbWkGykh(am-A9yVO!{#qnPN^)ZG#!I%<@$1neO{JNnYx{-!M<7luZPG uQflbhm7~~DW#|?&#Ehe5p8B+_t_BJrDFXE5@qCQyGJKU7)2}cZj{F9s+i=GK diff --git a/bin/controller/GameController.class b/bin/controller/GameController.class index d34f2d17ac03327914b11f9329e4c35d34c72d0a..297bf98c509d895d4263f031b0924e358ae1ba37 100644 GIT binary patch delta 461 zcmWNNYfBSQ0EVBL;03Ksw|U8oP{VukLbYuBFg2(&Q<xfR5Q1U|T9H-@%BWmQHxEV` zSY#?)X5~at)I|yk^(|ySz)$`Q-!F%A;JnX!iMpb$pHHpsLSo4zfg%o3jGYoPDCHO@ zD8Qv#8E(q)Qb8S+G;xwvPSMV36S3AMSCPb7Y<M`1*QDF_{63PY<}fuJrB>8)qMn!X z0##hZCrUjHbaR>8G%_UOOTEWw<|9{_rHx;ruh79dSBY?q4LVJ8O0TVpc<IvUA)D*u z(`){x1WWpqzhC)p$oD1=ZsBBr90ryAj*{G!>pi&y<Z#~vQ$H6xkm8|o4@vP@-Jg)h zu#yFp>6yGoL?0IOdDw41VDZ0_?Q5)zspdFGc%xC?YL0iDVL~<EbBRe>_#oLQSx@nZ zX#r+<!597d%6Go8tn)V^Hko6aA134oIOatSYoY}Wyr@x^G|{s0INKbn#IeRfO^_v3 eE`RiE(}bLrF>Hl*on@9p{;KmoM%gjh>F#~5cVcJ& delta 461 zcmWNNPe{{Y9L7IC4RkYYvu&+EE}{~}ip`d_Ob->9xgx@uU>cYaidu*AQV<rE5M}X} zX{Qb|NjA$o)nN-3X;5G&tSnC&rKgk-k3E+cUU>d|zE9ep_P@U42>DsVR%`@VM=37$ zvXLO$*hevC>|sA44p6B#%t20bh<YkGOQlIV!nswf<rq$?Ddf2EIu|0f<Pu>sbxJ)$ ziPXEK4$??DO&sPNCurs(=ebG?-CUqo|0lHaoHmB&V3bbYaft+%Npgi0U8XL--FcmC zZm@xy__#$8x6M?3&+hx;e<1!|^*+SSBRo82yAlKRafGMT&@b)*5j`_K>!Za{IR?f3 zLXMYgVwj!8L>A{1BVv6ej+naNj740TRwSX?Bo5x|%oGKD&?p}@)41lC;3%Is$!DGV zMYc)0_$t6D?lLW`v}(U8>^pCnQNj<of66s$;_hqiIi=2PqF);Rw}$?si55+Tr@{S~ mESAV)nJxTd2P;yonz$#JVKFx630QW^j?K#9p5-z=Z|FbJEo)2w diff --git a/bin/controller/ScoreGameContext.class b/bin/controller/ScoreGameContext.class index d6755a36575b61e590f1545ad55d22df5416b544..d120ac08efd024c052e4adafd7f541a8290782ca 100644 GIT binary patch literal 4380 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 Scn2lkiFe`M&itd!c;tT=NuMA9 literal 4674 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 EKeX+z?EnA( diff --git a/bin/model/Pocket.class b/bin/model/Pocket.class index 315513c23d7ad82c45972fc5e8d51dfea23c49c9..c8b39df5922f54618c70c4fe30db37fbd68f0750 100644 GIT binary patch literal 1828 zcmZ`(-%}e^6#i}!vas2ZLV=QMYZ0sY0mRzYYN6N`ETE9mCKhRJ^%B;wuw*mIrnEl! z=9{mMe?eb-&>4YZXB?k=@X5c&8Li*FSx8E0CUf@QdwzZAobTSh{`>8B0GF_7;v_!k zLJ}V;aoNDQiAeKgB8DrNRN^Bgu9`Hs7QIS8^)qoDQ|f%$z{e&MxS=*PF<iu~5_1MV zG4UzpV^~1mz)ce;uxQ|xf!hMHvfQ+%yozr>@&yLxOI+4G*R^Z8nU-c;AnrS^z39~) z-|;GSfyDf}d?<4b9_I?SPm8XCQ?5wAQL_bxUer!Bw{pwREqYGHAD^Us%(rVb=~Rl3 ztMoWNzv->oZm!rmq)l|fsW|?mz*y>4(2np+-w}vRF`R<wRP20XbH%O|<%-J_L$0nC zSqoF94#QH8mTCcE)n93JSD?FW`)x=C`cvs6fG`^k3(hyp7EYz-=vb0&so_fBE|fgg zsg6y%R_3=S75FcDr49B|LFtv%s{2??rzY$El;?Ui9fzuT!I!0t1zFWq87K&t1+P&n z**A1;v1XVtH6#neIB(%Kyl!C#Z!%YFbhEO)#_?G=h0_L#7Cyrr3rk9Tjxh_P7&EYJ z;V$l3_yYG?fp%7-)PPj*2Nu4>R~95zER?X?ZlvdJz_#!;$_CafI9L}r_Rz7na<ld$ zS@tTb(-t=1vinUIG||&cCv#<`oV&TQZkNc>-WK>dGD!NWDe=}Jt6`HkWHprLfZP1X z)0|%C{)kDFx*krmC~dbO{WS)tdRrV$YI-_7O&T)XHJ9*`K}1b^*6$J$?}LtNq~`cj zbL(^tfDMorEo}RM$!udy*7N$(kr>1jspw7LzI{7pfq|p%B?~9Nf-aH_ibn1Ec*Im~ z&Cxbt`Ut#zRC8YL7iUnn$-Ngi*nV>~3rJT|E6Fzu2qUDp##KnM3IcEF^%?F-Kdw7@ zHjK9@&vJL29$|h@W_BSm*=>X}BijgPo*}Zli;itXf1#FuDF@I&+0U1809|~?x-rPC zNowCgDu|b2o)E39%&&-M_h5vu)QVtg-4J3#B9KNV@EQ)hVu4p@2tOU9jnW9nQf4s{ zIGo~Fop#V6{PQ8x3smvy1g0vJGBs7~J#>keLSLaicVK^(^(p&!W(VeXeTY3p{QJXb zW@z#*&QYo+W&`*M4PU3}KBDeLcI*~i-oyF8@dre8Pj5d%Vz~#;_y6DS;@Er>Z;!yj z$R2tHe#9sj#|8dCU!Ka)4*Ey;Fc9LwiOZ2><WF=ZBiS7cK6(DP>Ul^{?KBLom(a&I n<s6nV#ph%e_mIbZqIrM|)Fu%AS3N-q0~d4u&{5!h9pKXc^4yRK literal 1091 zcmZ`%YflqF6g{(TS=ugd0b4}{eDtAIK}AwRVu%D2)Fy2-`fb>5%EGcs+O0-^ke~dZ ziAd1IAK;HNo|)aISTUQuJ2Us(d(SyLzkYxJ31Ag#8CbZHMiw_s+{z#kZ3<ZwQBt9- z!fh4qWQbZaQ895>AR9XEwsif*`y)qSYUeO$I$ovGKdcI*Lf3OT0%JS-@~y0NxvkWl zkePJdZTT|nwply>cXmD6%6DO<7Px*`-5`Ew-SypYLtv(G&ZOc?f#fC$s8O!(JntUv zI_-ws^>{Mca>6sT1f~ncb9xAv1lHXTEJ+lKPq~-PW`hE#t}w_+O|<O559vVXzo0j? z;LvHe*kYo`yB637v_Lf&sfW@&cqWf}Ol|4eT~CHi-42v9nR?J|+s>9Ik&P;sl$92y zaL>XBM%lUV?Y8Xf(O(N=7&ozOVFh^$_wm5OLlsu>$U+Wza*uvj)KXwv_wc0Os=V0U zckEDmpeXj6voT%nL<Z3sWn^T_nYwC`numMF@V^oG*z*K(F;?G!&A{_G#0`AnG0$sd z@iH2Gs7S9U0F<WJlQ6lS!Ue`@o~-eb8vIU|P9RF<V;H3$NW4Bl@))TvOz@U4P9mv5 zj5A1MmgN_jnblFXnd46In<{;U@tKRLY)BtoW28}x3cA3rf@TO!onlDf(*VB6{3TqD z@dd2~uoS+03e&)=KCz5uzf9FD#LwYMT(uZiW#g)0<DW6>gkFUrr)X`)1$m{Q%=aTE xbggEYj)xlBjZvBgJmJtS3frdX;EBkw)xsH_2KP$mx9Hs))LCPGkq86V{{YOC&shKf diff --git a/bin/model/Tile.class b/bin/model/Tile.class index 96b68529a6b1bac49f8359f6cb60fee74d08205f..0dc211d7645800a6e6231631dec7c606b221b12c 100644 GIT binary patch delta 245 zcmW-bJ5K^p5QV?{Snn>n7z~?;K@kLGH_%|>BNkd~Wu&sh#6%m7Q20B@Eo|(yuraZ+ zproMlzi4ZmrTON}Imw*)c5h*K{`WNn4oC}x)FT`X$4)+*Ia)c|j$KFRqkE{5;_Yxe zczPJzj7Gz|`?11w(kp+hCMxtl>MV({6o^=+!U{EFniTz|K8{MF*C<o=&-x->m#sp= z234y5SDyrRaT@-}>;)}RZU1O8mHHQxo%c{|vL!6ZuYI&ASj|4Mwm-w!SFCv#OG^PP SE#iGS4goqoRbtc@@%BGnwjtaA delta 159 zcmZ3%agkl;)W2Q(7#JAL8PvHLI2hzP8Q2*V*clW-v=WF=1`#Uk465u5Y8!Pd7$;XV z_A|0i=4SE|6=Psw5NF_IkYJDmLU{%$1{DVB$yrR+oGJ{w45|zw4C<5DF$MA(0(nLZ zq723iG7P4Zd6?~4ZGj?olLMHISzUlE*U25sT8zGvH#2K-hcPfR$O7HN#2^O%d(jrn diff --git a/bin/view/HexagonTile$1.class b/bin/view/HexagonTile$1.class index f9a859f300f0c3522d6e587362345cf7eff88753..8b9e3b65b70757e72665cd7843e85dc971b37387 100644 GIT binary patch delta 13 Ucmeyw`iXVJ5+=s%$xE4h0Vy&CH~;_u delta 13 Vcmeyw`iXVJ5+=rZlb1620sty81#18R diff --git a/bin/view/HexagonTile.class b/bin/view/HexagonTile.class index b8009f4c590c6f27d28e61b66bb2d777837be24c..bf0bc95b838d1032f7ced67350f48fd204a85d85 100644 GIT binary patch delta 1855 zcmY*a`&U#|6#nkqd*{wv4tO0I1mvNZf_FwVAD9S)X!*!jz6T#cfPx^SKw4&wmW5?6 zn_g;}+Jhceh%#f+YW0(?)&J2y&|0-xmeRNHOt@OJ?sv{Uckg|^`|W+sTrBuwYU0=X zw|@e#1V7qXh~^*`V3)vdfjt6yEj(qzj~1IotH9IZ+Ge3$j1GZ)0{d;`pi^dDK@{VF znB4+BVji^6Ycw_jHo}O@@*zS3hb{EkeBZBQe0*HrM>1j#*mwp<B-v5%eb&NrHY(6; z<9QqxctPNVjjc!soD?`E8@(9BBD`edG+q|-6@fv4Gm`gJnZ0J=tcBMtym9Wg*o@q^ zc<(@8YyZHCcu%}fgR|~H>yg%Ztw#suc`M73by_ON>F=O}=a`I|Wy#+)S9>#A>f5Wm zl|1e{(Aa>t6&}G-g<33AsKFA2I@D_jO=Mfyb+DtizboFW(13Fa?;xr0uEed!hU5&r zF!3JVSNK3+Gqxyvi1P}Y@T9^8)GJ)XI)#s9?PE!tKasepwZE%v%RpbeyF*f6QuqXy z6|UgChP(+c?_(6MO8N$TYT+}5&+&!AHf&cI!k3y4(~^gc{NxQiwDv27uknq-HGyvh zzQgwl!vfcZ^N3Koftwaa6;hHkEi1PKeh_HDZG|z^C#M^K1_Pda)Hk`>Y?|cX-!ZUx zRg(s@YEAQ;?KjStWm;kZy9zMi6Y)6niJaa@MZJ-Fa<ri__oKu{T03Dv=UC;Yp}CP! z_}r3F=&m*jL%?*$;Ey@&PJ0?w3W4kN)v%mc28-x$$H@pHRE#`K;V&PB?9fUS(5(q8 zWSeBQRgjPnKP{k$xDt=a8(IrV)W>m>Y;L%^Y@R~!!9F4G0F;tv8M&8po9PUF9ILVk zN;yhe)4d5}n3D{>%w98Tt;QN?32(FcS>Igoy#vb_f}vkyjL-X|OiU%#N;>#*8YS}+ zSVwH+lAEP!3sv*~Eb}}SqYRr%HLA&(O__<)%D9>kv97q0H0;RF$XU;5W%e|1$TfRv z4D!*>Bj8jG!E_eXm~Ls<2%9P7)%v4F{uI^m2s>^x`@$K56CJ_i6hfZEl&D58uH?(g z7{akoK^jw2DD++zC78gxg9^SXj>$ZQX`zx6q0*B^8f6n%MD~mp8(2&5{xDe~8;e=w z8dh!z=CG+2@sQT?crIr{ZD1>HqddD<>lW5^KPx-H@*Jb;r>Nuw3V0doGons~c^|VZ z<Y?M*?H*=p7B;HC8Re66Dsm<72FeoUwf=}JpFN$#A|+v?onPH<hK){noVu_{NMXil zQyUt;^MG?PI}FTZGgp{*KsmOM=O(h-=G8O^-#^f`yQJ=uD<WH0b~qFRTgFfkOJioD z*3fIru<7`(Vzsy1;4M6~)IV*obg<BW3$wc0mIg|)#%vmP*t~#AMMhzu&`zOp2<pFi zl}9mMWTY^s$m`CGy4Adt<?sa&qt4B2?OljqH;?Qd)NjUKiq}GhF}k#IsokR=hH($d z!dC4*>U3TI3xT`Rr*Z>jKjo5V13MzWz#4%&Jc39hg=n(Vu1w6ORn2GKurz^FF&Sr_ ziZteP>0v&u9G(ol*(3&ZvWvSAKsO8CLuv=9TQ9|oV<Qexy~9~itw4lq@^l`79bSr^ bBraEx#=ym#g_w2`ayfGXsNg@%F$DhwW4}I> delta 1597 zcmZ9MX>(Ln5Qd*SbMM@ln?o2v1`<dJgiU4wLADS;Oh^=wO*WH}Edde;TY#_`&`|`U zV2pUd1&~#Z3u;7|Sf<MI6PAAQH~7UWe}I-nNw9k|f?Buk+o${VIsJB@KIix07lx&N z>i_mTpn@KcDXfSvnUxBw6jr;e@o;$76Qxd}UcHho&#AIjVV%Ny504Ex+87~DgQ|@R zn^fKGvc;~dLiBu^)ZDDF)ni*TExKyE>N{L^dK9t3V>hh|dldG1EM}iVo5FtG@j!%f z4tgBou&U21v@0BOIqHdgL6sL>QZ6sKynLoV>9<?A{JKEgI_4h>Y_MMOe+g_)RdC!e zof(Fi%rZR6G>g3LjRzac8xQR-uWi}Yw7adPb+?iFoG_fE!|<vuspScap${Av?rYq$ ztz~oDv|7V!oHCqNSj5wY*XcAY<SD}&bQ#{{jNvV{`E*(S&%uI{3eFnN@wVX|I$hp1 zyvKRN5|$b+aM2%QPg?uF;S!e(R}`))T;sao1BDNj&_}v?Hy^uvV)#^}f2Nij3ZF|P zavzYbY2DenPc!<$@FiXTS^JM+(Ix+#o@)_qYw{}tqx^GD)z`l|MOMXRIe7>Y&@#y= zpoPmwsh!9OmTWp(uu`<;(l$YnWBqD3Kh=kmjBbf;=_QoL{YvZ>a|A~a5-h=Hw5%UP zE~N}*tl&8Dn9IEEZp9)k@pR(12=qKy9?BTY1RrC*paz~U!~!A*#}l`)<H6em<Eb>^ zhe7is9CF}}(DsCKZie*ZRAqPgcQE_^!PKdm1zFdrB9+%5;bq^!wY#x{H^dOgq&L8C z5i@JV<PgZIvLv=NPj>llVsvHdNIcO?B=J4o(s-I2XXkto#{V%~lo~WAR8}ZO%N>Xi zjh7Y2?3j~ga5vGin?%zL$vEVdS>h#@p=#+PKbaTnWmuZwndt(}e}L5jqB34BvDZlc zbqt}NLXu2ktsLk&VZK39+{iK-X<ox7F*ngbGh5}`&o<g=K{Lw7?q|G<XIa(OJtkN# zPZ|j#?Ve5WsHCR}RtIM}F((?jMy2MV{0rxV5^>FJgz)w6M@H0-JnmTC_wPI;I?x>l zgycbDa@R{ZEaVQzLA7V%M+p2y(7G#a642Y04caG7Wh7`rA4SPtiv7J_eri-@Xk<rm zM?vTtN_K3n3>RgU(V}=U=RAW8?SgQDmu5^i=AUtChEi{#on~xdrWXcEIE5Sua6)?a zr1WbCqvTmg$km_CDQU&iLZ*|IGFLAbem!TXnJ?}!?0XoO#a2J_g2CXQgzsus=vB{B zzm(CTF7X5IO~&=yWPBpc1b;!!#MDI59+7`iPapAQv~&okqouth#8f8#IBnGddJ}{g z@_5)>BrGq-3@!_`D^jPcQoL(&Ij^%yUJpIQ2yQqbY;uEgUzcUJSk5ydZQ)eTR2k*T Rw&e_xQ8X;?^I~=p`5TK64h8@K diff --git a/src/main/java/controller/GameContext.java b/src/main/java/controller/GameContext.java index 722771d..4c0dafe 100644 --- a/src/main/java/controller/GameContext.java +++ b/src/main/java/controller/GameContext.java @@ -4,8 +4,10 @@ import view.HexagonTile; import java.awt.Point; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.ArrayList; import javax.swing.JPanel; /** @@ -46,7 +48,6 @@ public class GameContext { return availablePositions; } - /** * Récupère l'offset actuel de la vue. * @@ -66,7 +67,6 @@ public class GameContext { offset.translate(deltaX, deltaY); } - /** * Recalcule et applique la position de chaque tuile hexagonale en fonction de l'offset de vue. * Actualise l'interface graphique en ajustant les positions des tuiles et en repeignant le panneau. @@ -78,23 +78,45 @@ public class GameContext { Point position = entry.getKey(); HexagonTile tile = entry.getValue(); - // Calcule la position avec l'offset - int xOffset = position.x * (int) (50 * 3 / 2); // Ajuste la distance horizontale - int yOffset = position.y * (int) (Math.sqrt(3) * 50); // Ajuste la distance verticale + int xOffset = position.x * (int) (50 * 3 / 2); + int yOffset = position.y * (int) (Math.sqrt(3) * 50); - // Si la colonne est impaire, décale la tuile d'une demi-hauteur d'hexagone if (position.x % 2 != 0) { yOffset += (int) (Math.sqrt(3) * 50 / 2); } - // Applique l'offset de vue xOffset += offset.x; yOffset += offset.y; - // Met à jour la position de l'hexagone tile.setBounds(xOffset, yOffset, 50, 50); } gridPanel.revalidate(); gridPanel.repaint(); } + + /** + * Retourne les positions adjacentes à une position donnée dans la grille hexagonale. + * + * @param position La position centrale pour laquelle obtenir les positions adjacentes. + * @return Une liste de positions adjacentes à la position spécifiée. + */ + public List<Point> getAdjacentPositions(Point position) { + List<Point> adjacentPositions = new ArrayList<>(); + if (position.x % 2 == 0) { + adjacentPositions.add(new Point(position.x + 1, position.y)); + adjacentPositions.add(new Point(position.x - 1, position.y)); + adjacentPositions.add(new Point(position.x, position.y + 1)); + adjacentPositions.add(new Point(position.x, position.y - 1)); + adjacentPositions.add(new Point(position.x + 1, position.y - 1)); + adjacentPositions.add(new Point(position.x - 1, position.y - 1)); + } else { + adjacentPositions.add(new Point(position.x + 1, position.y)); + adjacentPositions.add(new Point(position.x - 1, position.y)); + adjacentPositions.add(new Point(position.x, position.y + 1)); + adjacentPositions.add(new Point(position.x, position.y - 1)); + adjacentPositions.add(new Point(position.x + 1, position.y + 1)); + adjacentPositions.add(new Point(position.x - 1, position.y + 1)); + } + return adjacentPositions; + } } diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 2a9b385..785a690 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -11,11 +11,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -/** - * La classe GameController gère le flux de jeu et la logique principale, y compris le placement de tuiles, - * la mise à jour de la grille et le calcul du score. Elle prend en charge l'initialisation du jeu, - * la génération de tuiles et la gestion de la fin de la partie. - */ public class GameController implements TilePlacer { private Map<Point, HexagonTile> hexagonMap; private Set<Point> availablePositions; @@ -32,7 +27,6 @@ public class GameController implements TilePlacer { private int seriesId; private GameEndListener gameEndListener; - /** * Constructeur de la classe GameController. * Initialise les composants de la partie, y compris le contexte de jeu, la série de tuiles, @@ -61,24 +55,12 @@ public class GameController implements TilePlacer { updatePreview(); } - - /** - * Charge une série de tuiles spécifiée par l'identifiant de série. - * - * @param idSeries l'identifiant de la série à charger - */ public void loadSeries(int idSeries) { currentTiles = dbManager.getTilesBySeries(idSeries); tileIndex = 0; System.out.println("Série " + idSeries + " chargée avec " + currentTiles.size() + " tuiles."); } - - /** - * Place une tuile à la position spécifiée dans la grille, si la position est disponible. - * - * @param position la position de la grille pour placer la tuile - */ @Override public void placeTile(Point position) { if (availablePositions.contains(position)) { @@ -88,7 +70,6 @@ public class GameController implements TilePlacer { return; } - // Placer la tuile actuelle hexTile.setTile(nextTile); gridPanel.revalidate(); gridPanel.repaint(); @@ -103,40 +84,29 @@ public class GameController implements TilePlacer { } gameContext.repaintGrid(gridPanel); + + // Calculer les scores et mettre à jour la visualisation des poches scoreGameContext.calculateScore(); - // Incrémenter le nombre de tuiles placées et vérifier si la limite est atteinte placedTileCount++; if (placedTileCount > 48) { - endGame(); // Terminer la partie si on a atteint la 50ᵉ tuile pile - return; // Arrêter ici pour éviter de générer une tuile vide + endGame(); + return; } - // Générer la prochaine tuile si la partie n'est pas terminée generateNextTile(); } } - /** - * Termine la partie, enregistre le score final et notifie le listener de fin de partie. - */ private void endGame() { int finalScore = scoreGameContext.getScore(); - - // Enregistrer le score dans la base de données new SendScore().insertscore(seriesId, finalScore); - // Notifiez le listener de la fin de la partie if (gameEndListener != null) { gameEndListener.onGameEnd(finalScore); } } - /** - * Initialise le jeu en plaçant une tuile initiale au centre de la grille et en configurant la vue. - * - * @param cameraController le contrôleur de caméra pour gérer les déplacements de vue - */ public void initializeGame(CameraController cameraController) { generateNextTile(); Tile initialTile = getNextTile(); @@ -153,13 +123,6 @@ public class GameController implements TilePlacer { generateNextTile(); } - /** - * Place la tuile initiale dans la grille et initialise les positions adjacentes comme disponibles. - * - * @param position la position centrale pour la tuile initiale - * @param cameraController le contrôleur de caméra pour appliquer l'offset de vue - * @param tile la tuile initiale à placer - */ public void placeInitialTile(Point position, CameraController cameraController, Tile tile) { if (tile == null) { System.out.println("Erreur : tuile initiale non définie."); @@ -177,15 +140,6 @@ public class GameController implements TilePlacer { } } - /** - * Ajoute une nouvelle tuile hexagonale à la grille à la position spécifiée. - * - * @param position la position de la tuile dans la grille - * @param panel le panneau contenant la grille - * @param hexSize la taille de l'hexagone - * @param cameraController le contrôleur de caméra pour ajuster la position - * @param tile la tuile à placer ou null pour un espace réservé - */ public void addHexagonTile(Point position, JPanel panel, int hexSize, CameraController cameraController, Tile tile) { if (position == null || panel == null) { System.out.println("Erreur : position ou panel est null"); @@ -220,9 +174,6 @@ public class GameController implements TilePlacer { panel.repaint(); } - /** - * Génère la prochaine tuile de la série et met à jour l'aperçu. - */ public void generateNextTile() { if (tileIndex < currentTiles.size()) { nextTile = currentTiles.get(tileIndex++); @@ -233,9 +184,6 @@ public class GameController implements TilePlacer { } } - /** - * Met à jour l'aperçu de la tuile suivante. - */ private void updatePreview() { if (nextTilePreview != null) { if (nextTile != null) { @@ -247,21 +195,10 @@ public class GameController implements TilePlacer { } } - /** - * Retourne la prochaine tuile à placer. - * - * @return la prochaine tuile ou null si aucune tuile n'est disponible - */ public Tile getNextTile() { return nextTile; } - /** - * Retourne les positions adjacentes à une position donnée dans la grille. - * - * @param position la position centrale - * @return un tableau de positions adjacentes - */ private Point[] getAdjacentPositions(Point position) { if (position.x % 2 == 0) { return new Point[]{ diff --git a/src/main/java/controller/ScoreGameContext.java b/src/main/java/controller/ScoreGameContext.java index 816f66e..b0ae9b7 100644 --- a/src/main/java/controller/ScoreGameContext.java +++ b/src/main/java/controller/ScoreGameContext.java @@ -7,47 +7,43 @@ 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; +import java.util.*; /** * La classe ScoreGameContext gère le calcul et l'affichage du score dans le jeu. - * Elle crée des "Pockets" basées sur les tuiles placées et leurs types de terrain, + * Elle crée des "Pockets" basées sur les tuiles placées et leurs types de terrain, * et calcule le score total en fonction de la taille de chaque Pocket. */ 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 + private Map<Point, Pocket> pocketMap; // Map des Pockets pour chaque position de tuile + private Map<TerrainType, List<Pocket>> pocketsByTerrainType; // Ensemble de toutes les poches par type de terrain /** * Constructeur pour ScoreGameContext. * * @param gameContext le contexte du jeu qui contient l'état de la grille - * @param scoreLabel le JLabel pour afficher le score + * @param scoreLabel le JLabel pour afficher le score */ public ScoreGameContext(GameContext gameContext, JLabel scoreLabel) { this.gameContext = gameContext; this.scoreLabel = scoreLabel; this.pocketMap = new HashMap<>(); - this.pockets = new HashSet<>(); + this.pocketsByTerrainType = new HashMap<>(); this.score = 0; } /** - * Méthode principale pour recalculer le score en reconstruisant toutes les Pockets. - * Elle parcourt les tuiles dans la grille et crée des Pockets par type de terrain. + * Méthode principale pour recalculer le score en reconstruisant toutes les poches. + * Elle parcourt les tuiles dans la grille et crée des poches par type de terrain. */ public void calculateScore() { score = 0; - pockets.clear(); - pocketMap.clear(); + pocketsByTerrainType.clear(); - // Parcourt chaque tuile dans la grille pour créer des Pockets par type de terrain + // Parcourt chaque tuile dans la grille pour créer des poches par type de terrain for (Map.Entry<Point, HexagonTile> entry : gameContext.getHexagonMap().entrySet()) { Point position = entry.getKey(); HexagonTile hexTile = entry.getValue(); @@ -55,122 +51,69 @@ public class ScoreGameContext { 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); - } + // Crée des poches pour chaque type de terrain de la tuile + addTileToPockets(tile.getTerrain(0), position); // Premier terrain + if (tile.hasTwoTerrains()) { // Deuxième terrain si disponible + addTileToPockets(tile.getTerrain(1), position); } } } - // 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(); + // Calcule le score total en additionnant le score de chaque poche + System.out.println("Poches et leurs tailles:"); + for (List<Pocket> pockets : pocketsByTerrainType.values()) { + for (Pocket pocket : pockets) { + int pocketSize = pocket.getSize(); + score += pocket.calculateScore(); + System.out.println("Poche de taille " + pocketSize + " ajoutant " + pocket.calculateScore() + " points au score."); + } } updateScoreDisplay(); } /** - * Recherche ou crée une Pocket pour un terrain spécifique dans une tuile. + * Ajoute une tuile à une poche de terrains en regroupant les tuiles adjacentes. + * Si des poches existent autour, fusionne ces poches. * - * @param position la position de la tuile - * @param segment le segment de la tuile - * @param terrainType le type de terrain de la tuile - * @return la Pocket correspondante, soit une Pocket existante fusionnée, soit une nouvelle Pocket + * @param terrainType Le type de terrain de la tuile. + * @param position La position de la tuile. */ - private Pocket findOrCreatePocket(Point position, int segment, TerrainType terrainType) { - Pocket newPocket = new Pocket(terrainType); - newPocket.addTile(position); + private void addTileToPockets(TerrainType terrainType, Point position) { + List<Pocket> pockets = pocketsByTerrainType.computeIfAbsent(terrainType, k -> new ArrayList<>()); + Pocket foundPocket = null; + List<Pocket> pocketsToMerge = new ArrayList<>(); - // 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 + for (Pocket pocket : pockets) { + for (Point adj : gameContext.getAdjacentPositions(position)) { + if (pocket.containsTile(adj)) { + if (foundPocket == null) { + foundPocket = pocket; + foundPocket.addTile(position); + } else { + foundPocket.merge(pocket); + pocketsToMerge.add(pocket); + } + break; } } } - 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. - * - * @param position1 la première position de tuile - * @param position2 la seconde position de tuile - * @param segment1 le segment de la première tuile - * @param segment2 le segment de la seconde tuile - * @param terrainType le type de terrain à vérifier - * @return true si les segments sont connectés, false sinon - */ - 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); + if (foundPocket == null) { + Pocket newPocket = new Pocket(gameContext, terrainType); + newPocket.addTile(position); + pockets.add(newPocket); + pocketMap.put(position, newPocket); } - return connected; - } - /** - * Obtient la position adjacente pour un segment spécifique (0 à 5). - * - * @param position la position de la tuile - * @param segment le segment pour lequel on cherche la position adjacente - * @return la position adjacente - */ - 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; - } - } + pockets.removeAll(pocketsToMerge); } /** * Met à jour l'affichage du score dans GameView. */ private void updateScoreDisplay() { - System.out.println("Updated Score: " + score); // Débogage du score + System.out.println("Score mis à jour : " + score); scoreLabel.setText("Score: " + score); } diff --git a/src/main/java/model/Pocket.java b/src/main/java/model/Pocket.java index 1eff0e8..e6425c3 100644 --- a/src/main/java/model/Pocket.java +++ b/src/main/java/model/Pocket.java @@ -1,82 +1,95 @@ -// src/main/java/model/Pocket.java package model; +import controller.GameContext; +import view.HexagonTile; +import java.awt.Color; import java.awt.Point; import java.util.HashSet; import java.util.Set; -/** - * La classe <code>Pocket</code> représente un groupe de tuiles adjacentes - * d'un même type de terrain dans le jeu. - */ public class Pocket { - private TerrainType terrainType; // Type de terrain de cette Pocket - private Set<Point> tiles; // Ensemble des positions des tuiles de la Pocket + private GameContext gameContext; + private Set<Point> tilePositions; // Ensemble des positions des tuiles dans cette poche + private TerrainType terrainType; // Type de terrain de cette poche /** - * Constructeur de la classe <code>Pocket</code>. + * Constructeur de la classe Pocket. * - * @param terrainType Le type de terrain associé à cette Pocket. + * @param gameContext le contexte de jeu pour accéder aux tuiles + * @param terrainType le type de terrain de cette poche */ - public Pocket(TerrainType terrainType) { + public Pocket(GameContext gameContext, TerrainType terrainType) { + this.gameContext = gameContext; this.terrainType = terrainType; - this.tiles = new HashSet<>(); + this.tilePositions = new HashSet<>(); } /** - * Récupère le type de terrain de cette Pocket. + * Ajoute une tuile à la poche. * - * @return Le type de terrain de cette Pocket. + * @param position la position de la tuile dans la grille + */ + public void addTile(Point position) { + tilePositions.add(position); + } + + /** + * Vérifie si la poche contient une tuile à la position donnée. + * + * @param position la position de la tuile à vérifier + * @return true si la tuile est dans la poche, false sinon + */ + public boolean containsTile(Point position) { + return tilePositions.contains(position); + } + + /** + * Récupère le type de terrain de cette poche. + * + * @return le type de terrain de la poche */ public TerrainType getTerrainType() { return terrainType; } /** - * Obtient la taille de cette Pocket, c'est-à-dire le nombre de tuiles. + * Calcule la taille de la poche en fonction du nombre de tuiles qu'elle contient. * - * @return La taille de la Pocket. + * @return la taille de la poche */ public int getSize() { - return tiles.size(); + return tilePositions.size(); } /** - * Ajoute une tuile à cette Pocket à une position donnée. + * Calcule le score de la poche en fonction de sa taille. + * La règle est que le score est la taille de la poche au carré. * - * @param position La position de la tuile à ajouter. - */ - public void addTile(Point position) { - tiles.add(position); - } - - /** - * Vérifie si une tuile à une position donnée est présente dans cette Pocket. - * - * @param position La position de la tuile à vérifier. - * @return <code>true</code> si la tuile est présente, sinon <code>false</code>. - */ - public boolean containsTile(Point position) { - return tiles.contains(position); - } - - /** - * Fusionne cette Pocket avec une autre Pocket si elles partagent le même type de terrain. - * - * @param other La Pocket à fusionner. - */ - public void merge(Pocket other) { - if (this.terrainType == other.terrainType) { - this.tiles.addAll(other.tiles); - } - } - - /** - * Calcule le score de cette Pocket basé sur la taille au carré. - * - * @return Le score de la Pocket. + * @return le score de la poche */ public int calculateScore() { - return getSize() * getSize(); // La taille au carré donne le score + return (int) Math.pow(getSize(), 2); + } + + /** + * Fusionne cette poche avec une autre poche en ajoutant toutes ses tuiles. + * + * @param otherPocket la poche à fusionner avec celle-ci + */ + public void merge(Pocket otherPocket) { + tilePositions.addAll(otherPocket.tilePositions); + } + + /** + * Applique une couleur de contraste pour visualiser cette poche sur l'interface. + */ + public void applyContrastColor() { + Color contrastColor = new Color(255, 255, 255, 128); // Couleur semi-transparente pour visualiser + for (Point position : tilePositions) { + HexagonTile tile = gameContext.getHexagonMap().get(position); + if (tile != null) { + tile.setContrastColor(contrastColor); + } + } } } diff --git a/src/main/java/model/Tile.java b/src/main/java/model/Tile.java index 703e0d6..ae554f5 100644 --- a/src/main/java/model/Tile.java +++ b/src/main/java/model/Tile.java @@ -1,50 +1,25 @@ -// src/main/java/model/Tile.java package model; -/** - * La classe <code>Tile</code> représente une tuile dans le jeu, qui peut contenir un ou deux types de terrains. - * Chaque tuile a un identifiant unique, un tableau de types de terrains, et gère sa rotation. - */ public class Tile { - 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) + private int id; + private TerrainType[] terrains; + private int segmentsForTerrain1; + private int rotation; - /** - * Constructeur pour créer une nouvelle tuile avec deux types de terrains. - * - * @param id L'identifiant de la tuile. - * @param terrain1 Le premier type de terrain. - * @param terrain2 Le deuxième type de terrain. - * @param segmentsForTerrain1 Le nombre de segments pour le premier terrain. - */ 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; // Initialisation de la rotation à 0 + this.rotation = 0; } - /** - * Renvoie le terrain pour l'index donné (0 ou 1). - * - * @param index L'index du terrain à récupérer. - * @return Le type de terrain à l'index spécifié, ou null si l'index est invalide. - */ public TerrainType getTerrain(int index) { if (index >= 0 && index < terrains.length) { return terrains[index]; } - return null; // Retourne null si l'index est invalide + return null; } - /** - * Méthode pour obtenir le terrain associé à un segment spécifique (prend en compte la rotation). - * - * @param segmentIndex L'index du segment. - * @return Le type de terrain associé au segment spécifié. - */ public TerrainType getTerrainForSegment(int segmentIndex) { int adjustedIndex = (segmentIndex - rotation + 6) % 6; if (adjustedIndex < segmentsForTerrain1) { @@ -54,35 +29,28 @@ public class Tile { } } - /** - * Fait tourner la tuile dans le sens horaire. - */ public void rotateClockwise() { rotation = (rotation + 1) % 6; } - /** - * Fait tourner la tuile dans le sens antihoraire. - */ public void rotateCounterClockwise() { - rotation = (rotation + 5) % 6; // Tourner dans le sens inverse + rotation = (rotation + 5) % 6; } - /** - * Renvoie la rotation actuelle de la tuile. - * - * @return La rotation de la tuile en multiples de 60 degrés. - */ public int getRotation() { return rotation; } - /** - * Renvoie l'identifiant de la tuile. - * - * @return L'identifiant de la tuile. - */ public int getId() { return id; } + + /** + * Vérifie si la tuile a deux terrains différents. + * + * @return true si la tuile a deux terrains, sinon false. + */ + public boolean hasTwoTerrains() { + return terrains[1] != null; + } } diff --git a/src/main/java/view/HexagonTile.java b/src/main/java/view/HexagonTile.java index fd16f47..8c19415 100644 --- a/src/main/java/view/HexagonTile.java +++ b/src/main/java/view/HexagonTile.java @@ -7,78 +7,44 @@ import javax.swing.*; import java.awt.*; import java.awt.geom.Path2D; -/** - * La classe <code>HexagonTile</code> représente une tuile hexagonale dans le jeu. - * Elle gère l'affichage d'une tuile avec ses segments de terrain et - * indique si la tuile est un placeholder. - */ public class HexagonTile extends JPanel { - /** La tuile associée à cet hexagone. */ private Tile tile; - - /** La position de l'hexagone sur la grille. */ private Point position; - - /** Indicateur si l'hexagone est un placeholder. */ private boolean isPlaceholder; + private Color contrastColor; // Nouvelle couleur pour le contraste visuel des poches - /** - * Constructeur de la classe <code>HexagonTile</code>. - * - * @param position La position de l'hexagone sur la grille. - * @param isPlaceholder Indique si cet hexagone est un placeholder. - */ public HexagonTile(Point position, boolean isPlaceholder) { this.position = position; this.isPlaceholder = isPlaceholder; this.tile = null; + this.contrastColor = null; // Par défaut, pas de contraste setPreferredSize(new Dimension(100, 100)); } - /** - * Récupère la position de l'hexagone. - * - * @return La position de l'hexagone. - */ public Point getPosition() { return position; } - /** - * Définit la tuile associée à cet hexagone. - * - * @param tile La tuile à associer. - */ public void setTile(Tile tile) { this.tile = tile; - this.isPlaceholder = false; // Une fois la tuile posée, ce n'est plus un placeholder + this.isPlaceholder = false; repaint(); } - /** - * Récupère la tuile associée à cet hexagone. - * - * @return La tuile associée. - */ public Tile getTile() { return tile; } - /** - * Vérifie si l'hexagone est rempli avec une tuile. - * - * @return <code>true</code> si l'hexagone contient une tuile, sinon <code>false</code>. - */ public boolean isFilled() { return this.tile != null; } - /** - * Méthode de peinture du composant. - * Dessine l'hexagone et ses segments de terrain, ou un placeholder si aucun terrain n'est présent. - * - * @param g Le contexte graphique dans lequel dessiner. - */ + // Nouvelle méthode pour définir la couleur de contraste + public void setContrastColor(Color color) { + this.contrastColor = color; + repaint(); + } + @Override protected void paintComponent(Graphics g) { super.paintComponent(g); @@ -86,7 +52,7 @@ public class HexagonTile extends JPanel { int centerX = getWidth() / 2; int centerY = getHeight() / 2; - int largeRadius = isPlaceholder ? 40 : 50; // Réduction de taille pour les placeholders + int largeRadius = isPlaceholder ? 40 : 50; Shape largeHexagon = createHexagon(centerX, centerY, largeRadius); g2d.setClip(largeHexagon); @@ -102,33 +68,22 @@ public class HexagonTile extends JPanel { g2d.setColor(Color.BLACK); g2d.setStroke(new BasicStroke(3)); g2d.draw(largeHexagon); + + // Appliquer la couleur contrastée si elle est définie + if (contrastColor != null) { + g2d.setColor(new Color(contrastColor.getRGB() & 0xFFFFFF | 0x66000000, true)); + g2d.fill(largeHexagon); + } } - /** - * Dessine les segments de terrain associés à la tuile. - * - * @param g2d Le contexte graphique dans lequel dessiner. - * @param centerX La coordonnée X du centre de l'hexagone. - * @param centerY La coordonnée Y du centre de l'hexagone. - * @param radius Le rayon de l'hexagone. - */ 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++) { - TerrainType terrain = tile.getTerrainForSegment(i); // Récupère le terrain du segment, en prenant en compte la rotation + TerrainType terrain = tile.getTerrainForSegment(i); g2d.setColor(getTerrainColor(terrain)); g2d.fillArc(centerX - radius, centerY - radius, 2 * radius, 2 * radius, 60 * i, 60); } } - /** - * Crée un hexagone à partir des coordonnées centrales et du rayon. - * - * @param centerX La coordonnée X du centre de l'hexagone. - * @param centerY La coordonnée Y du centre de l'hexagone. - * @param radius Le rayon de l'hexagone. - * @return La forme hexagonale créée. - */ private Shape createHexagon(int centerX, int centerY, int radius) { Path2D hexagon = new Path2D.Double(); for (int i = 0; i < 6; i++) { @@ -145,12 +100,6 @@ public class HexagonTile extends JPanel { return hexagon; } - /** - * Récupère la couleur associée à un type de terrain. - * - * @param terrain Le type de terrain à évaluer. - * @return La couleur correspondant au type de terrain. - */ private Color getTerrainColor(TerrainType terrain) { if (terrain == null) { return Color.WHITE;