From 45444e48bdcde9b8592e1bb9aff36baf2c573ae5 Mon Sep 17 00:00:00 2001 From: Florent Madelaine Date: Thu, 18 Sep 2025 15:15:37 +0200 Subject: [PATCH] API game (bug possible) --- 2024-25/2025-09-18-Note-09-07_annoté.pdf | Bin 0 -> 28276 bytes .../fr/iut_fbleau/GameAPI/AbstractBoard.java | 99 ++++++++++++++++++ .../GameAPI/AbstractGamePlayer.java | 26 +++++ .../fr/iut_fbleau/GameAPI/AbstractPly.java | 5 + .../javaAPI/fr/iut_fbleau/GameAPI/IBoard.java | 69 ++++++++++++ .../javaAPI/fr/iut_fbleau/GameAPI/Player.java | 6 ++ .../javaAPI/fr/iut_fbleau/GameAPI/Result.java | 11 ++ 7 files changed, 216 insertions(+) create mode 100644 2024-25/2025-09-18-Note-09-07_annoté.pdf create mode 100644 2024-25/javaAPI/fr/iut_fbleau/GameAPI/AbstractBoard.java create mode 100644 2024-25/javaAPI/fr/iut_fbleau/GameAPI/AbstractGamePlayer.java create mode 100644 2024-25/javaAPI/fr/iut_fbleau/GameAPI/AbstractPly.java create mode 100644 2024-25/javaAPI/fr/iut_fbleau/GameAPI/IBoard.java create mode 100644 2024-25/javaAPI/fr/iut_fbleau/GameAPI/Player.java create mode 100644 2024-25/javaAPI/fr/iut_fbleau/GameAPI/Result.java diff --git a/2024-25/2025-09-18-Note-09-07_annoté.pdf b/2024-25/2025-09-18-Note-09-07_annoté.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eadfd28eeb3822e59ce5f87ff08cf75633526109 GIT binary patch literal 28276 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∨_{7n9)%u^Gx-3%5UP5;<%^6AFKl2@d!^vFF|ZJU{3qTvwmrA>x|m$A)% z({f|>WJAFuCrhiTEs5gBtESH=H;9wdJCKs9W!YW8d0v7qx3Tlr8L=9cg0-2!$+9`| zn^!%}Ycb22C>^{(`Fil7hgk=_p2o{9T3*|cXgJ}K>aTP1j|45gu?eekKsY^ zo11@HA6-seaYN(mZi#i9^3C2fU&}4E5Xp zMJ(4MKT*z z&+Iatr?*5w$^FnKo|!&Y)6Y5D%$3%WZ%OpA+$jDb`_0`~pN+2^e||GjM&#wCf(V@l zEWKCabshJ!IP$dAL~(v{v~QBvZS<25cq{MMdz@QvhSxtJ9KYS zeP2|8a`5bRcS6>#`tg79syAjEV%KVY-oIMw>Gf0ATmP((zb0gIe1o&WWn-mxf%j+L zGCp^q^Ya^yup=HUDV2q6#c!&={MCN5y~IY+cFxSU&guGR_OulUxZ8+I^F&Q%zQJp8 zAo7jg2J758k_UVC9{m>i;mBU2_5@e)=fw=qd1hQ(k?QlaBP{mxl>ZB#e2Jc5dH&`y zUy-~+O5d|f6F*npc~JIQuY}QxW%`@O4eGCYi$Cb|Z!QczIcJl@Lj7x4OR-#K;KPWH1@-9@U5&Z)S)*yxwPU-;J9x9|K~ z#NK$6OkcSBjl^;1hIID+dGlI6K5CtKeHnwl!I}a~cb*u*b{FQG7ax`vKX_InQ`Atx zQ7Eve`9S8~%#GG7{;!qUI$vA zXZFOUZJsG(61({Li`T3DH17pBJWKqXXydNxu_gF}`rgC`D%}?vrHZusGeZBcxA`5^ z+^v{)wxWwe)2D-z^U=c)lerB69s;cf91pXS0u2q%unN@)))cLGx!NQ?V^gSf+PsCT zPsIKzd}96orFzcvS@+k}OX`1-z0a!t>U8$U_J-GNW^dOw$G*N^`iCP?HE+$8`E9?9 zYtKJA&k(O=SNlXoruxy#h0|9Ch=sk-j_69|4v_PdJDScgzjWTq+0FZQ_9Y27F;>rA zW@qqqXVeC{g5r|uZH%X+)vWp+CGG$BN9pRs|9^SD)&1D;vpVDGyfpD{e^Gh;Lle4L zzZ;4O88#hFsxpXjv}m51ms@$pZuMn8y;Uxgugws4zK7j4d>@K*2GLXtmH9i#(_syS@wR@YRyRar&xY)5?l5u5y=Z_ zX;;#&U4EH!ptqr4rJQHG(?x?f63!=*-MrisC3}w?VbSO>dp%L)eC_L*hKHXRsul40 zZx`M*m#vShS~gE#-hz+aZ^pcJ%eL2iyb)k5?Kta{b;xbtI%9?#AKRkN8FidwkO8=AD=S;*i~qiL{x#_OI(^XFfCY-{~`UmoKh z-Psd1tqfq@mVKa5IoQs1etAf?#oP;z#g=ic=(ST7bqQ?pXlW?oG3hv1xbKN)qjlzF z_APOnKZfbwunB9w>T^<7;lxy*P2wu?2knnuUSu4)&uWrNt0Nb8r40L={2!-tEPPep z@@9A&NXmDLq-va6ym6%n&#f8$zMB?I>EcgMv@n*N>tfMreC=S_iY@A|P0xkMuU@q0 z$zu0sJDT_1%9$V3wEOESx5=lT&j?z2`h4j0&+Aw5l<~A5&5(GsY0lLvSN=q`btaf7 zI0bxYw^*C@M}nv6YI=d$tt~ddH=EVt=hcWFtDpJTav#q>@folC+3&@DSBp4(H`({{ zf(crF3HL1aNY|}9q*yAsYP(L@eQm9mYktn<*?cf!!jI5LtmcQzysk!;+5Jy>*s0XB zW9D1yGvXQCneViPyzbyH8*Q!?&&KS*5 zma`OLi`?61<+SP4k;(fM{};}>T(!(E;FR75=Ln(0g0DCfU1b;Q%)aksTw?qrY2F&< zO?@`*4JM7wGw(<|aZh&t=y~Asx|@xK2EC=rqfNuMd`J_Ih{+2-u+w5?{C)@7r^yj~ zOIE&YUdRx1dAEn>_e-MZH*?=qFH$cy@Va^LXwpO%9qIOocQSIA5~YsMnQAv9(M>#?`>v)QpLZeNzo)%7dHEmUHi+;tV2c9<$smRSaBFM*o z!?tYsRX=4>juhAY8}7=YOp~`xYb#t)p#7r1|N{j2c%^TEO@9^OYQ z_=1j=bZk)9xfI`JJxycDafMmFJQKwNzn!(dshQHX;e+tBOg{du1tfW6aoYr35*4^0U@#rEyh zYxlaviQi|W--v4ZcX66e^Rahq?)Chd%HG-k%_>aJeyX=Ge0hZDjNhCyb}LJtdtQFX zY;Zl|PUCCF*E*%T{f#R(uYP(UF2H_O-6pTUmOdPUN>!H8Qga$FGn*_8Jo^6s|D+$H zf9|TjGT3t~QQ}kZu7ka4`x}3Jk=(Q>y?FWOt9-W)23?8Y$Di60#NCZx-|*A$Lhi=@QLc z6+xwk-=iW|ima|F;5a>NvEnT6#LiXu_MVdxntmuK6iQvq`;=W=Wmc>)ZK4CuRAu*$ zIdfdt^9|n!zm>}S@N{)j(h4=1b8?sL|L{eZi$A_&mw$kr(N4ml#X+Ov$?{f#qXE0? zd`%OblcIRI1$d87UTO1Z@~6~qvQPILe%@gGcB+T)ES4Z{k(G~@uQuN#w8$;_szs4w;j>c;4%t`3r4zGDTl`FZy^+gO)<0gIV7c+h z)>m26UV7i2B-gaOBw>Tt+}*QwDf%RNNcSX(Gqf&nDLb#vcBG*|RCxEg8mIpLO;z#R z`#(1wK3DpHFYA1B&#B^v+bW|HzKXNF406B17TZIU;B|ts%lm>Tqyq z&BmuPoaGXC9@cGKd+pzC4#xYj6%AQ?Pkh*tf5$UJ&bZ}ucKX&e@iYG$X9TWEuHG>F zd)2|if*xD;vI~XYS@XgDet(X7VMLdUW1mOr*(i;Cp)3WQrQzD zoBo`=RSmi}!M)!(8ZCC-)6)DW-ShQ??WK27d+gVWzF&StwW`GJP9}fnhRpYxyqoyk z-Hi+;c|P61An{zujPuPTM}^6O?YfHD9BZ09Uo2NGE|ijq`oY?~e{r^EC(f?S z^C%a~Ri3rq=hQ}(Ba2!i<;6N`&oLIHU`dNTcgs(-mVyaVu{DW$y@n; z9!l`6+;pqQ_-b!wieCJhDGAX#pIhv6kkp=QWyNZo?0$Lq>SLA@9x9#{-(gg^!v0l1 zi=t3ZlE_2ZsK)o9mM)jJX_#%?*U-CM=ch&g$%~w?dS7v$$^K^fN2bEZZ@cqjukB}4 z8@zvAx+gQk?^|5Pe@&Smzt^Ro4SwMLBc;zqZfVNKmAO}!y>p8;5MZgFaNr>SthquJ z3!1-ul)ie@Ch6J7o8<{FiarUbF&tfRg8KmXw$+ROL`47H{_J=5r)S%*uCnZ1oVeC; zQBvR-xtls#5EF!$o$pJf_b_@dRe z@?P-h$l2erNn-i}0nbyDc$!p>7{odsIG-Y3Dz3S8`iDKgXK==4&cC_H^3_@9YANf3 z8Kng-$8TO(ki3UGEt>1=j+qyhq*vc%T#+A{{nM`L*ZuX&VzRG%?_T(EmV{D*qTv#Y zE2mYq^YGX*iL1>QKf$(gqu+xqHgj5>fBq4f$7b_lWyGh1(_hqi0yngG*H&puwWkucH~WNNAEYWtVb)$73`zW1u?(_Zbb zRa^hY8~5zt3btC8B5_j7N;tIX)Rp~PW4W`%>i6efY`YtFbo#NMUHi(_XMdLa!n6B9 zPvtd(Yb?!kXTHnecd1&Mc87Dvp$%oH&2DU}4gGG*!FxmIrI%y)skkG82Wl+ldN|n3 zo4E2Md*KD+jArGwF54!9KIfC46nJ`i4(+y8IoIWO~c)KP~_wpW>AC3w^t8NKOt&EY)6mw7d$u!k1Gvk?s#{A`GJDh(q z-7eqvG~>9&jmd14`Mf9U<3&&ZzR*$kHkaZ3`gg4-`;IWEuz9T&{%UaL$h}4B?vEx$ zsJIpA9G!4v(Gzh?MvH~^SAwK7mTc?&`KM-@*Ry)#nB04p?r`Y#?q)N~vd&Pu=oA)I z=3-N5AbQs|_qmF8`Xot@v`rTmrQK?)GPZUs;I=tA-@t2@q442_OUj=932RIKmzC+h zd&%6b>i_mg{nESi)8%2@`u(R$Ot(mc?Oz=)vF!8y^v}1Bo3FC^zw)R1*R-!{+k|F% z?(FP(>-?r(sQ&(oyftRC+N;kz+fV%t z-W#yaKCNcms&!AjgxZ2yb2f1l#dvvF3Vc4)am?1M@1bYinYk?ChZM}O9McV-`1F+T z=j|^&w?*oIo0lQo{On`fo8(!&@4tTCvGDlaeDj$L&S$(UENiG-zufQhv3TwEHXCK1 zmDyjc7knt-=dO0yVCFn&>pC94cPVO%&ps-0TE1}Y`kPF*e{Zws;C_GTeZSowl|L_b z9{IuLOXuV4zns67J-7MKkLvSFzg;}zFk_x}+JnfqI~A3bul=q0 z-MNfw%Ty`h-KKIkEH|td+;&ZJU;ljeJny)cPfNZ|Cquhc7u}2|JW)Kl{12zxqZxWn(iF{w*JkYAI!QfW zn*H~L#g8PIzBYGF|EU~zQ#a_hB`de)>tdgW;#YU6zTj@qf5D&Npj;OB;6yp6T~TKK zs@pe>Pu1$onH2O;r6t&@rNrLr+NuJzu=qIbMNdt`>Ze#8US;Dc)-#Y7gzxV#f(~f|D-H*=~2R>RLm$}iZU$L5Tev$0^_UTc}R{4ad-@Sc{FZXRP^H(_q z50ecoy6^gm1)g*LD{N_Xf3D8ywyWdOvnL-_=A7d9%hsqpVR$RLVV+ZR&T2NTK840G z1%U^q7cR|6jr%$IQ$yTdpM`r5ioAV1`)X148q-4QZ=dD(D{Ri${bmfZtA673e@x5YPLw#}I%kIJ zzCD8X-~PGD_T%cVo4Z%%Z+!nQYG11EnjP=A?S1uJAneTlxPI=qNne}%c^V`t@f`l zsqn1dUe}VJ1v94~w7dM@<@@Icdb{1;2rsBBdU&{H`kK%0XWhTM*dXIy^6%Ac;s*>L z%6(aKFz}tH$u%Rh(Ac$iGoEa{Yb>87D*x!Dzz&Cdv-yddy70@% zd{^>p;`eTp>}4!xu&JB3e$%QKoVOKnrsr;Aouc~6@4_Fx`?Zn^n1o z_1v~O*_PLNrf-wI)4|VdXSQMWMnNelGl}qw{Lj%(r?IS^s(B_m--_v=1B1uT-4|J2 zPmm2@DHDv$%-*>10(WqApOpOdZIRj=WB4{zDur(H6UFF7esJBi$Uo}6&c(%1z-57R%!P*CR)&$0i|bh=%TF0U z>T0mQ<<7)& zD~y&|v+ z{%7TQY+Up6?&*hh1JdYd)jd4Y}0 zMS*Q;Yo@$6_{x^bd%Jq!*ATH_ucEPpSxIZ_Ds_+%GvnB;|WX5nrGc>m%f?zrDw1xO|>y|F7Mg;%kXLG zvvn1hYb5?m3YJ)LQB9Kh&Y4|*t~nTR98~ya%21eAF0+T-EnJ1~17k&>!Ii2*hOc@X z&GY(7x^C5%1?(xgFLv#n@z0k+L42W)pSa2!mK_n>*828CPnCJ~Lteo6kRdA)V12 zI{hZg#f%&LW%cD1^;}x@N$zJ<{WUoD#c#T@#JQqA|{=ZMgZvvC;jhMA*Y3b7=uIjg6KWvk`?BC33 z4<*cv{fa$4?z(eH;H>7n&iL#4Kc99j z-Cg-ZYFhB0Aj#xc@|s6X&Zd9<@cikCD<8M5d;d}B`B{^zb@@&*o9}F|`+F~b(Ms;0 z9|b=B&fIOEcFX?A``=Q%y63H!U(OqqMX zLQ0L&GA=(^{335XFj&Ev(K9l|t z?hjr)Ov+EVc1+u|{2`6~8G8m>7Tb|C+fP&%+3q;BE9jMw{(;-VrG6(SYr9VV zyY0pG;%#!9L(jPw3j6<;``3DJNyTFu-DfW=mh+XrvM6q!sl7MzqgxNd;wM@=rp*$Y z<+ZL!dr$nqzg)FmA5ZSAJmY)v>ZA6*QD0WSalP2RLEKTlZ?E;2cNW_1k(yscf1TPD z^(x5ylutx>VEBvR2bU+mKDhObp?t)Ie%}MD5|-PS7wlL%<@$P^x|`NHcTA3-&p*6t zO~Tas@hgQmqCn{gb)6SD^?;I=f`WpnA$U_0h-ZSlTnV%mK>@tc*(J3&xhS)sB)G#!RM$Y)0HP!(F}+v;dJI~AUWt=aeuYA`g07i` zg07LFk%FbEp@O-oxk4;hwP#6UPG+)WUV2Wd0z|)KadK*22}lW80muO$K1eTEz&WwN zBQ-NU1ED0iBsDio!2+Tk#PNV}Kn`=u%tuS24N#p(0U(Za2aC^UYlm1U~XWlU}kCv z#vrz-rI~`Mi4j=bK*89^RKeIBWIssU!ps6J4ps*?1*8+C8YBx61z}4gL%1rCtq=@x zhl#N<*k#Bx$PSP!2pfU@16oA`Vwsy-LR3Tj15yD}4RR4k9>fP>kgXsZgu%&7K|drv zG%pi$Hm(BLoyaM{1QZCMEP%97&jhsS5fV4pidfLX9mostzdggwBfBWCQ$;;2Lb>aD^_N~7C@0Z~FI--nL_G}sNj{bY{^3f@y z|IP2e--tiBZ{MFYmx_K}dRxBnzuCF>41Dez|C;}^b9>z~FGYNj2;V8r2R$F%8;Z+( zTsvi%3bOb_6T9v&G(Gz3k6?ZJ5qZl~bzA2$S(CO0cLm?SyU8@Y2XpMdWHzU|^*c^S<%bo5mNtjeKb@TR_O^t?#N3N-F9s~$zwcUaPFv)S zx12|BybHLHUm`gxZHqhmFZT8}wqJ|gc0YR~CBu^uwZZVp_UeL!2Gx20uAO|l%5ZYs zhJt^8Hdd5>FDaQ``Rc-xg6;RRKmOR*`qfFmr8!pe_+pwCWQf$7}3T~}=%OWD1OBVE+v-Y-J zGX3!VEB}$2r4IKU4xPU4>|D#(zx?!@Z`VBZa^LxK94zxtoxF8N+N&9dewtV`6tY`C zOgYk*w)ybRAQo54#b->+4LP=(<>ude_j%Xc6P_KdF`|A=69rQ3M5Y`OFmCoe;T3Ok zs%+lQO?7kqWh5#rF3z<#D9?_Ac|oECR9lc(p?Lc6p|VdmP#N&43w|KCYFh z#h1KhEa3l~KBdQ3BvdV9&l+R*HM?{~8)QSQ;v?or;2a|RYMyI^Q-+y3{9x8HNJKH3^{!OmH&ZPH)U z9ZXJJV;)8%xXxU*c!^WbB8R}#Ns?^6ykF&}v+1rm+8A1X;;a7`6U)UOJ$t`oG8%mT zbM?#T_O|EcGmib+R{XoY%x~Lv|EqgG-9759yztlNdu{X2oZZr**Uogn%h6WICN}vB9D7e5=)MQU7k0Ri0uivlT*C`dts0Z!Gfb z>5apRhhNt&xF`Ll!@a-iR@q#6xvN(!LqGqJ-e$S{R@Re$O6gpd$4!?NJzB@>FU@*> z<>?IvpG8hwyTSWS^&hkU0sXJ`{)+p%d}5i+!VfuZuXFlDFZ^>lD(CQfp6~C!_B_vj zO!zxt@8P&_I&;7IS_`Tn^CjS5bbA8Q?SX=db+A>$X&Tl-r=+AuDFZTcU^xhYZ zIQUyG<9yzaAL~E z(|b_PIqin$kCew&_x4=*SI}L@e!DPSW`4NR&)zTTzcn6~3#mn(Kc*`4f8&?S`wR0f zhaWv>pK$$W{!h*?Kdk=i{$@P2Jd%5l-hnHuGAC0%?XoKs-m^K_X?DGd`me)_tm7@# zt(QB=c`vf&daJ(1(n%Wy`dnC^urBHOB6ZC=bi<>jnNIpL{oHv{g33bTT`TqP1xPg~ zEOk*>D$W%)(|p;QqUDo>Y)UI!#Y@?^Rz6x3uvt5MPH~B{lJ{+;C9$8`W^VO$zqsKV zlTL$~vxC|8De>Hfdg>v*3y-)MOkMobMPuqJhC{y=>E)%iO4XLEon09;GsrDtW{iu* z+@Cv-7jf{de^xT_>>{ns3`3tw1$OJF=bE@(>0RaJFTOYBz3P*-IezYDVcok{oP5T$ z;^N6L=SvEn&8-EB^Ut?W)D4`j#W~|N=M1F+mfsIGFS-TY4*95dtwq3GcEg18`eL7( zj(+;-#a3A>_}OqxO^k()ta5<$$Gu?|!8hj=NKGq{6boZ$7kT6~xkOp`SJKU$2`^KY zlpHSm@g;l*_smHJUtBKCxD@_1bk6EKuV1*dr4_g4?68=AUh=0$ocPI~GPe#L@m8I( zqhQvdxm{}?s!dz7dqZ{vo1XY#Ev|h9F&l)~l;+qLJ~S)sy4Ib!a>Ihj>=SjKa0Ypt z&d5Gvx?Ma-a<%%VodsEEcZ&zjecO7}phaX^+y&#+ZWFt-PPQ3{y1Yo_*(9Yp?V852 zx0*KJCH1TdL|XQH!N) zOwX?5SmHlR)_c8cwO$cy91*UC^D`v{~uWXx<+IlN&^O_)Ov(tQ8+h?Zs-g=vM(=&H=WLenamvEka%y^sOzM~R%P3)4TONCu(-|VYQ3aZau?p2w0R=?@z zONnsnXYOkoe+J$L;m)6d(ntTSczfv2inqu9tf*!9ym%Y?=f!4;uat`pzB4Jj^{lC{ zT~2#Rif5s)TE^LLvy#$%-W>V6gM0g-mb&>_Qb!Y;`M#}pZPEOF_o~qJy-{spb8cJ> zF58fx*50m^dUJd0yx)nxd}|%t>>BRn_&i%({AkR&jmgeKf#4-Z%G;k0oss`&VD zWw-eygXDv5DHZzjVihm87>M>?_T$vP-l&=tym9H(mW8jCSHCE}f7ie^@wf1-#L$bo zG%n1XH0SKyfYNrkeGA=W*H(7>-IB7|!fSa*LZ3tT>(jSU3of7AH}y(L;za?zJs}s@ zEbB^~!d-Hyw$ew?`S9oa633;aEe>1UjWE@;n$xJp~?vaE`Z1Vfn}4`kv$cFAdW z_;EQM+&^{lm+qYfiajAaF9g2s2-{)cHeuP{*=m8xZyz6H@%0Loxw~Y-q>VGh3M{5y zaR1=6{DrpH+()aXIAzSeQC;wQcX#ZO>b2jzw(>-MV&CR6Y1OpV4*C}HemkQcsmzn- zOe%~qSz2_{;NHq#9(IB6QhRsgAAh&$T4v0K^5C^c$+;Ow7D`xZo&z1rfyd&iFRPUW`$g_~oV%Y92v)E9gD|H)sQ zbgJ{*MnUHORl2WLC#^qX*~tFkUc}U?o^RfEyY_JDPt7sYtPs%TxOH3ZzFR>%yHJuq z`A_HX7yTDnUy~4U*6^R5#Bavld6ehU+WyB!qf@hwEn(H=TU2o(hFQX0v71Rb@mfrB zka2s{l{3O=Os$7o6d!UVdQ{9XP_aq6cVM$YYY?BR+R{Ch%{Ory_r3(GZEYOBR~JH0%yE=2$Jjz53T-Ap-to@u{T znEfaA0xkK=TYo?F=Ks4iC;s1e?Q*?!@hg6YsOtRPwY~o1<9O43|IRaPJzK7KuX6FT z%ld!485-t4f1pt>Q}si!<8$zjgwtiYcc#_$@!z^J`GW4(D@tv(e0Oui&rFd0m-l#b z*ZRXhY+BEY*4#VTevkLX{SE&_=i4V4%uf=U{NoRwgXg2>ve4t{QuE_4{}(;+;?D;= zlg()yNn-hrcf5aaBER}|gC6%E#Xt9C_JwV}{^8vA_5DwcEY_yH{T^?}?SH1v@eZ$T z(B+D=TOV1yjC#PI{dnEpTX|a#zg)L+#=Q%1SEg-Mt%#X>andV=e#<2%(|fOOQ@=fF z?a61+2c!Q*--|BYe#f)GSyw9h0>{bqH79@Q{oU=k>(0S-XCE0>=(_(sTC#KYFZ0+0 zZH9V}DZ4$s7GLi^aOKI?OAl8y+MPTW`gYH^CEHFEy;@?n=-cNNhu^;4dD3hh*H`Nw z|0eHy7;!~mu3OhX=Cx~{PsTFH0_s14`jiR^3dW}9Mj#a+t_i3E4`LwqH9^}+aQ8J) zhVv$z%{#2XbNszcYyaDYN^8}YP7PSHa`%%9xl!BL6%ve=unH))@A=CUGItB}htJ3F zAA5HF-_mk3#`^v^-WdlXmMiPk^>QU1IcZg9)3{CR?%JZ&k!;62ZF0O1?JPfLtk_T= zP~chEe0TFV<#&<{AGWVBj50s??zL6O^$l$wnvHj{@V>UXkg?*9Z(F#f@&_fmFS8z* z<+4xun_82{_%P&6^503Hq^2u~y1i6OS(IrdaIA!9?mzMD)k!9=qTSRC(#?2nk4!%$ zp7c3nhTNyqucpu3Xq09bZkL{?y?yEPy;bk#UH>BCz1HxOOX~F0DK;&oKO)LMD6T&B zlU1{^!2%S5&@MJ~1jhsvZlJJKP*5;3MU0q&MkheRpdcn@_Ic#i;z+e|-m}rz7s1PtS0F4MEY&SJD zQ82YMgky+|u>mN#LD&WgW`@x8jxyi|D)W#Nq%kNhpyp7_3pPwa6CaQSNm)uftI z>3M(OrcIvF9(j!q4oB=y`*+dYgJX^--_j%&6%l8ag(}Xhs+?{@t11t2F{$|ZC@l~; zA;x_o{@$F%nzhoGjTuhVZ@Vq`kAbnB*JZj$2-n3_o}-EH^S$D4E#y|X`M0(xx_Y;4 z*5kyW*Vm#C@Pr;q{3O-%`u!)HmA%*BZC(5O%&#;nUo-vO8Ta-0IyId&5^u*f8Zs^X2k$%a2d4 zD>!U^AY}iwdoDAM%xQ^FyZwrNcmL-HA16;evtr67rvN77rK^hc{EA;V>AZ8Cvr2xi ztc;G>Vn=L5g)dVTlC&N}N;{sMmz`c|i&iJDoTn`_q3zgU9Ptv30WMeD6E z0duPCjvum;arjlCdhXz*uL&D>FzQ}njj`#Dj^UsFL$_cx_l^>=@EF1Edl>c3>OT-m zFMRs7pnJB>UGMzxnxnC=7L;%M>3_TDyOQX!CFR@X>+WC{=-?;^r3(cG1rtL{kOC0T z6g1rhVjv2zh@jLoaFT!w!YUYAz)}e2wJV^aJUFu|RlyWeFoi2b8!8wn7=Z_d^@H;B zOB75&1I&=L=9!n4uV4yF&)^gbt#K;msGix+<(MeJ_Tl^2=Q2}f@QLY6da4n&Jwahp zfR~b`@X04!Q>+bU`{*@n+R3DOSkpXVg6r|mUv&4+`~LE$ogin^gek5b9=h=^s;q0I zcUuINvn=yX$anBLYq92Be>$6mep%*{Gt4RNX+jqd&3w)!!uQ5PkFO(NEwFUE&He+i zn@%f-YCp+Pn|7_tX8nR~Y2i+*o}Z9AGtWo;LRE7aQ^~Is#wt09_!F`|Kguo{*lTYr t{pa{x)%D-G#flq2!3gyRwBjr-Nh~U history; + + private void setNextPlayer(){ + if (this.currentPlayer==Player.PLAYER1){ + this.currentPlayer= Player.PLAYER2; + } + else + this.currentPlayer= Player.PLAYER1; + } + + // Beware not checking if move is legal. + // To be used in do(AbstractPly c) + private void addPlyToHistory(AbstractPly c){ + this.history.addLast(c); + } + + // Beware not checking if history is not empty + // To be used in undo() + private void removePlyFromHistory(){ + return this.history.removeLast(); + } + + + /** + * @return the current player + */ + public Player getcurrentPlayer(){ + return this.currentPlayer; + } + + /** + * Returns the game status + * + * @return true iff the game is over + */ + public abstract boolean isGameOver(); + + /** + * + * @return the result (null if not over) + */ + public abstract Result getResult(); + + /** + * checker of legal moves from this position + * + * @throws NullPointerException if the game is over + * @return the iterator + */ + public abstract boolean isLegal(AbstractPly c); + + + + /** + * constructor of Iterator over legal moves from this position + * + * @throws NullPointerException if the game is over + * @return the iterator + */ + public abstract Iterator iterator(); + + + + /** + * Plays a given move on the plateau. + * Should update history using + * @throws IllegalArgumentException if the move is always illegal (say from the wrong game) + * @throws IllegalStateException if the move is not legal in this position + * + * @param AbstractPly to be played + * + */ + public abstract void doPly(AbstractPly c); + + /** + * Resets the plateau to the position before the last move. + * + * @throws IllegalStateException if nothing to undo in history + * + */ + public abstract void undoPly(); + +} diff --git a/2024-25/javaAPI/fr/iut_fbleau/GameAPI/AbstractGamePlayer.java b/2024-25/javaAPI/fr/iut_fbleau/GameAPI/AbstractGamePlayer.java new file mode 100644 index 0000000..75888d0 --- /dev/null +++ b/2024-25/javaAPI/fr/iut_fbleau/GameAPI/AbstractGamePlayer.java @@ -0,0 +1,26 @@ +package fr.iut_fbleau.GameAPI; + +import java.util.Iterator; + +/** + * The abstract class for a game Player. + */ +public abstract class AbstractGamePlayer { + + // not a band, but which type of player I am in the game (PLAYER1 or PLAYER2). + private iAm Player; + + // Le joueur réel pourrait avoir besoin de connaître un constructeur de coup? + // pas pour l'instant. + + + /** + * + * + * @throws UnsupportedOperationException if the method is not yet implemented + * + * @throws IllegalStateException if the Situation is already in the bookmarks + */ + public abstract AbstractPly (IBoard p); + +} diff --git a/2024-25/javaAPI/fr/iut_fbleau/GameAPI/AbstractPly.java b/2024-25/javaAPI/fr/iut_fbleau/GameAPI/AbstractPly.java new file mode 100644 index 0000000..f831b22 --- /dev/null +++ b/2024-25/javaAPI/fr/iut_fbleau/GameAPI/AbstractPly.java @@ -0,0 +1,5 @@ +package fr.iut_fbleau.GameAPI; + +public abstract class AbstractPly { + private Player joueur; +} diff --git a/2024-25/javaAPI/fr/iut_fbleau/GameAPI/IBoard.java b/2024-25/javaAPI/fr/iut_fbleau/GameAPI/IBoard.java new file mode 100644 index 0000000..2bf6d91 --- /dev/null +++ b/2024-25/javaAPI/fr/iut_fbleau/GameAPI/IBoard.java @@ -0,0 +1,69 @@ +package fr.iut_fbleau.GameAPI; + +import java.util.Iterator; + +/** + * The interface Board. + */ +public interface IBoard { + + + /** + * @return the current player + */ + public Player getcurrentPlayer(); + + /** + * Returns the game status + * + * @return true iff the game is over + */ + public boolean isGameOver(); + + /** + * + * @return the result (null if not over) + */ + public Result getResult(); + + /** + * checker of legal moves from this position + * + * @throws NullPointerException if the game is over + * @return the iterator + */ + public boolean isLegal(AbstractPly c); + + + + /** + * constructor of Iterator over legal moves from this position + * + * @throws NullPointerException if the game is over + * @return the iterator + */ + public Iterator iterator(); + + + + /** + * Plays a given move on the plateau. + * Should update history using + * @throws IllegalArgumentException if the move is always illegal (say from the wrong game) + * @throws IllegalStateException if the move is not legal in this position + * + * @param AbstractPly to be played + * + */ + public void doPly(AbstractPly c); + + /** + * Resets the plateau to the position before the last move. + * + * @throws IllegalStateException if nothing to undo in history + * + */ + public void undoPly(); + + +} diff --git a/2024-25/javaAPI/fr/iut_fbleau/GameAPI/Player.java b/2024-25/javaAPI/fr/iut_fbleau/GameAPI/Player.java new file mode 100644 index 0000000..2831093 --- /dev/null +++ b/2024-25/javaAPI/fr/iut_fbleau/GameAPI/Player.java @@ -0,0 +1,6 @@ +package fr.iut_fbleau.GameAPI; + +public enum Player { + PLAYER1, + PLAYER2 +} diff --git a/2024-25/javaAPI/fr/iut_fbleau/GameAPI/Result.java b/2024-25/javaAPI/fr/iut_fbleau/GameAPI/Result.java new file mode 100644 index 0000000..9417e13 --- /dev/null +++ b/2024-25/javaAPI/fr/iut_fbleau/GameAPI/Result.java @@ -0,0 +1,11 @@ +package fr.iut_fbleau.GameAPI; + +/** + * To output the result of a 2 player game that is symmetric. + * from the perspective of the player PLAYER1. + */ +public enum Result { + WIN, + DRAW, + LOSS; +}