From 8d5bc6b0a78d09296ad9285ecbd0de6355cca7e5 Mon Sep 17 00:00:00 2001 From: Vallat Date: Wed, 9 Oct 2024 14:19:22 +0200 Subject: [PATCH] Refaire Undo --- Nim.zip | Bin 0 -> 8883 bytes src/Main.java | 23 +++- .../raw_api_body/entity/NimPly.java | 24 ++++ .../raw_api_body/entity/PlateauNim.java | 108 ++++++++++++++++++ 4 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 Nim.zip create mode 100644 src/fr/iut_fbleau/raw_api_body/entity/NimPly.java create mode 100644 src/fr/iut_fbleau/raw_api_body/entity/PlateauNim.java diff --git a/Nim.zip b/Nim.zip new file mode 100644 index 0000000000000000000000000000000000000000..422beb3325dcd57eb690c48c35747f3006a4a1fd GIT binary patch literal 8883 zcmbtZ1yqz<*B-h<7zBq#N{13j0qGc8dI;(6fuRur>24%NQc6&y8)*RrK_n!lBvl&Z zXS|nBuAhDv*S}da1M3~0eRiC4p7R`KITTbN0Ac2LA<*x?{QZUspaIy!o!QmZ@BkRZ zD(L1LFm!XoC)^DOfP{+p*7rB%-y-1ujbI3Kwlp&|c6R!IU{U@TmZ&mBUrb$%Tc2Cs z$`E!zXiNa+KLTyT1pvVR27TsA8a^Gd)VsJP z|9tC)RJhN_RqsZ4|LsM)2mBB4&>dhf|Ow*Nt>nMOxX;(>-)hZGM+ z0!u{GTcqX+Q}Kp?n#Y6B;R~TK1-w449NAQljo0y};%!bwaS#27D6!(v3HKgySd;C-$T}uV`XNu zu)@5pfQ{Zp9nkUl!&~L)cOc++)Zu578#CoIDj9iQMzKH$C@JH~3aq?fk3~!6F`rf4 z$si4UR9+EOGbx3Kc1J0kQO`9iP0ViBUKJKuP>a!)^THGh>q`iDt*XIRD6D{p_hnFr zMnFZ^%kIH;P(90I-ZzwyGOK=(?a5bdgECj1G}9QB8?W1blAc?{ErTDFv?Z(UA9Yvj zl!U}zHVjVMJ#fPrdVF7&_ge?&77ht-I=P3EUKe%5$LiO-IC|Tp z5-609x9&E%H$rVnUbZaDB<+B+!zLIm-OcvOm)$9_Z!8$xcmPpY6ZKlyvdjUqFs>1; zxi09BI=&MKsdukYaKTP`lt%+FKzTaMi20@V;QCXl=3VaQbQzI4BcUy_Sx`BVaQlJL z(Q7hlSFW9Exn_{a@(W)#dp`kM5qG#F_yqKUSlr;-uDX@UgPLJ+lH?ouMUmT(GJgSAzZl{<<-#&pW@+;wq!4*^8$HbElcd>H1F)H21w}BWgitO)$W7? zwTqJ8@_m5q#6ZufqCgGeBXx1QbfPx42ln-gf|3Id=z*~5kqU&5Kz)mTI2T> z@;o11l8VfVj{QU>&^3B)(j| zv5BB?@M$6+VB_#bYq!i(l!0_Z&(tgJ_|NJET3P%K!|NZjbv8AOb=gf{x0U9f>Eqsa z=poLdkxNi_)*G{DY1n{KD^&Fh<3PgiwA=Qt;vPKWPTQ~j7q1I#P&hscYu)xlmd?BWL9b+tGf>7sbmEGwAWwvByqFw)c0ltp za_Jl~SE!ueK+B!TVbYj2OI-7D!1iZ9nGci&)#Y6Nz~h+D4Sl7SAUs^k$#3xohn`Pe zT_m@mj9o1Ux49VXr_wmXmGFT(M&&R2~z>AX!VfQZcAdlFe(vk>6>mK7FUA`%B0o_Nr=NiuVVI z_SaIT?NXey8DA*w-H|NV1aH@kkKv8+zKZX>-*Q7dz^=?`1(f+jhGvi(yTw>Zz+N$p zv@On{WVuh6#G6%$228`EyN?=P=y~_JxY)U*EVk?jvN1F9 zP;`QslbNXfsO;-24r^WaE|rcpD}gl)Mg1>%#$A59R8X zRFCnQ-hAB*fiaD**mlDwK|Q7~zXZ??AM8AiRG>7AO0v>+{&dxwSzqw-EK$XH*XKEt z*29;^ZBLmFbIQW@1xsvs4emjfA4UgpeM|HNMcdvO>3QuEKTni7{;Av*C(PELqF4R! zE0x}74|l~A0@d)Bne-k+jU;SYZwj>uF26||r^_ej(T4=9JaUjy_09rEav`+UeA}r?XgyZ9OHA9nvGh@jQG2mo$$3GigoyZ?{tx&f ziBM>tc;w@S($hUAc6zx|^++PcH4yLBx(gj%EsSS7Ubvo$>vDVMkfKY3=&MVmqSD{$ z-(>P7lVvbjg=j*q*{0ZQba7;1bJRjycWe|69G0VAArq`vKG5q_7jSW#Z<7+CZ=}~= z>!1zSbxF@|yFZ)S)Xu#av8I9}&^d5NECz>MI4{`*nDN=H!ZKO> zW|In2zfuZxAAF)gjT(qFMO~P1&+>ghdB(8ddrlnQvf8SHdtQLc`P)MKurHdm0K3at z*UJXoOA_!~{fN-m+aU2s6#Zd)3>v;(wgeD2^Usho6-|} zVd@1!`BdKlHVKsFFfiAN78H{(0RRN+`8{nz5I-lF@dX(bf(QOg9Wnk!FuN!%`xOY$ z4-iYZv%Z;;jj190|1l`)U*f?GUG)teEcK1-P2B$g{LN2fnepGjP3@d5o&WYR{%>>| z!BbW2e-LthWB}mCg?%Vm+A7<)pORGD~5a=;7Zl zktCHUH4X8b*DAy~h4LUN^Uy@bXi?v***G{Dpo5ukk;^&aZn;$2li8uq1Qn$8uM}qS zjMY?o-6WpQe`HJX@|(btScJSetFK=%Pm7!g`J5+Elovz#PDWd=L3-I!Q-f$)Oo$Bm zK`Xx(dQG%5QqMu7Sl~&!o_<*HV+o|mmBt# zqlO7=ut1sx%|&Je*AaUB%Zz)u^pDhjoqQF2TyX zZfZ5};`wqCS(ec;bHnDtvrIF#4NKJFR6&_B$ny^^W}n~3n4QKgIivC(jm!fEOCh4FU^Ix|aS{AOjLZx29O8$E`yQGrTS669k5s^)Z~7VQ z%X*~JRFsEwLQ8gUK@XP3UUw^}e@cjxHwk_W9=|r!Lt-c}dJEiZv6!X<0@ZyT;u4<= zdDv12vI1+A&PUv@sSFP(ZHH`FDD&(Ev$8$hXY`knRy6W_G~xm_vB@U5a;0Wdq!nX@ zFB2HInHlKk-ZJ=9@DLBtW}H6X?k%3S8KRkfv{{G4kD1Sg4*+ogX`7uc06#jd0x|PX zUx-ELr?Y#zrmg)r58*ev=98Hb_BbNxCqwq|v=Yo`eQhb|*ZjP3EkY`5WOJlcTpET? zyj|mgAKI|UUM!RCs{MS8y>%2au<#1jS3KzLIs9;D`tzy{-~F4(rtUpAD@>b9 z`2=%b(Gd|6C9r6PVqvoJKi!ml1pSiAK7JkkLm?u z9jTT;zn^Ov<7i#uKHtH~Wy$E^jzfGfQT@sdRPq8-YO20$vwd=Dw!d_xea0(N@8~~*j*^{J?LaxcVA@K zR?SeB9U{vP=}qlxyaKx+G%eFBR#ct@QG@X;lQrsX?Gaz9D(Si z`m+f;f8x;Ds|-#>bnEKFWhF31f{}V_Ufb;CWhzYn-P^?zIAlSWP8ynZ2)Of`kd_l6 zp#)hio>^+2k)LkvJV^1L@5+O7%e8tQhrX@PUs!+_clg6hC}CExdbBhp{ja-RNCf5y zNlr)XVHN}2`Z(%j8w-b1i$)vV3DbRrx89fK?T3qu+CQR1$mXYsQlvh%h0T1@Fu!bnf^*|I@ zhQYEdQA#Xb;YvM9Pu|M)fxB6rR4ja){dk>Op{HA3L#7Yhr;gbLDVAqdDOmWZ0zhUz zQGWNDMx4?l;}W|jD?91;un5s|t+Y-Dju`x}!%{hY!uAI%@i_waKVl;3Zo#_GfeUE% zp%F0gW1A+jQ;r>z<*=|+%?Yjx+imDso)%KI6b);ND{`V449Iu;stVXVX3@y z^^UxUW>o~y5;ST96j7YIew!mJ-C0}~i@_0i2lTkIl~jj2)nK+g(EkoSND_I*1Q)tg!S>!RbrLFL>;|B2 zUz~0qr9%Yj*?FUrnhzIA^sQ$e^xdnXl1eqwY?-aU+WV*w<^~rcXv4f` zuyWECjOrIkyr98sc=rZ=EBhoHt>mLOTFZg+2PJ#JCv`_ym32B`yJ>VUqvD~}4_{s5 zi<)U8vcKvm)TCnW#+Qco$cTzzaa(9;o>mJ{ zmmd{7zW|k=K1EzUoD=RXZEgNdxQE9~$+dA1c21$41Uam}kZQq*aWO8#qtGz4YmAJY zFuT#0AoqCO$A0jI4fAcreJ`I0hD-|3)y8N&h06PNsXBxfB+Fy#IHSd+?@{DC-f6mv z-y#Ek8#O}eT|RWyY3%12aN-Nwp!E}*4^2sA(Pp<9mN-Cb>Q!u@`)q1jB*Ym!c8})W zZ8>M#=$qJ$c#VJoBqhZ+I0QYY5y#olZ4GpvRK*Nbo7q;Vb1Bk6w&qGjZwv_UNc)no zby>{&xG!t9E80c$pQ?Ys>K(LcH%+N;rG;eAO?ceiv0j!IYj~SUS}QzZdX-RMHh$$E zT3+?ND9e*)hX9I`?@LB&^qBho=`=v3?$=30J$-_8np71@Q3(Y}Hd~W_&1a-2z8?pn z(SNst3`L z#{yhX!TNpH5E|B*ornrx|AlxVMeFyV2u-YEwjqA)#L|^|B{|^% z%qo59@h%$jpQu0Q{Ud~c^L!g21e{r=Zy3QJ`oE|waDE7gef2yy{$~YlpDvIHt@w0a z{7cpUfad?~{yd#U5b!gr^d%v=xciII@t=L4r-%OxedfZx|A0Q9caPwp=eZ7ogPvKX zFCOV%p playHistory; // History of moves + + // Constructor initializes the game with a given number of allumettes and a starting player + public PlateauNim(int initialallumettes, Player startingPlayer) { + this.allumettesRestantes = initialallumettes; + this.currentPlayer = startingPlayer; + this.gameFinished = false; + this.result = 0; + this.playHistory = new ArrayList<>(); + } + + @Override + public Player getPlayer() { + if (gameFinished) { + throw new NullPointerException("Game is over."); + } + return this.currentPlayer; + } + + @Override + public boolean isFinished() { + return this.gameFinished; + } + + @Override + public int getResult() { + if (!gameFinished) { + throw new NullPointerException("Game is not over."); + } + return this.result; + } + + @Override + public Iterator givePlies() { + if (gameFinished) { + throw new NullPointerException("Game is over."); + } + // Generate legal moves (remove 1, 2, or 3 allumettes, but not more than remaining allumettes) + List legalPlies = new ArrayList<>(); + for (int i = 1; i <= Math.min(3, allumettesRestantes); i++) { + legalPlies.add(new NimPly(i)); + } + return legalPlies.iterator(); + } + + @Override + public void doPly(Ply ply) { + if (!(ply instanceof NimPly)) { + throw new IllegalArgumentException("Invalid move type."); + } + NimPly nimPly = (NimPly) ply; + + if (nimPly.getallumettes() < 1 || nimPly.getallumettes() > Math.min(3, allumettesRestantes)) { + throw new IllegalArgumentException("Invalid move."); + } + + // Update the state + allumettesRestantes -= nimPly.getallumettes(); + playHistory.add(nimPly); + + // Check if game is finished + if (allumettesRestantes == 0) { + gameFinished = true; + if (this.currentPlayer == Player.JOUEUR1){ + result = -1; // Player 2 Win + } + else{ + result = 1; // Player 1 Win + } + } else { + // Switch players if game is not finished + currentPlayer = (currentPlayer == Player.JOUEUR1) ? Player.JOUEUR2 : Player.JOUEUR1; + } + } + + @Override + public void undoPly(Ply ply) { + if (playHistory.isEmpty()) { + throw new IllegalStateException("No moves to undo."); + } + if (!playHistory.get(playHistory.size() - 1).equals(ply)) { + throw new IllegalStateException("Cannot undo a non-last move."); + } + + // Revert the move + NimPly lastMove = (NimPly) playHistory.remove(playHistory.size() - 1); + allumettesRestantes += lastMove.getallumettes(); + + // Switch back to previous player + currentPlayer = (currentPlayer == Player.JOUEUR1) ? Player.JOUEUR2 : Player.JOUEUR1; + gameFinished = false; // If game was finished, it's no longer + } +}