From cf8a0f4d80051ff57d7dcc68c13292c8a2dbbd3f Mon Sep 17 00:00:00 2001 From: cleme Date: Fri, 23 May 2025 09:30:55 +0200 Subject: [PATCH] undo --- OOP_1A2_Project/bin/.gitignore | 2 +- OOP_1A2_Project/bin/backend/Board.class | Bin 9617 -> 10420 bytes OOP_1A2_Project/src/backend/Board.java | 72 ++++++++++++++---------- 3 files changed, 43 insertions(+), 31 deletions(-) diff --git a/OOP_1A2_Project/bin/.gitignore b/OOP_1A2_Project/bin/.gitignore index 5c7ebe3..ac72981 100644 --- a/OOP_1A2_Project/bin/.gitignore +++ b/OOP_1A2_Project/bin/.gitignore @@ -1,2 +1,2 @@ -/backend/ /windowInterface/ +/backend/ diff --git a/OOP_1A2_Project/bin/backend/Board.class b/OOP_1A2_Project/bin/backend/Board.class index 92e7fab6ed7d854845bdee20bfaeba4a4b009116..8d5e10f89a7f7755f26f061b4fa733c799630e9d 100644 GIT binary patch literal 10420 zcmbVS3w%^png4&8JC6)EkVgXzBoJDlVe+E1K%4X-gd%|uXal6sRy#>9WMDEgotXqu zwLXd#?ZX!9D%C1fY<$$!LP;xCY<-}syS}!ou3O)(yXyMZR@rLy|DAg$Gf75&{`S}A z-gCcm&Ue1^egE%q&hW**oH+|%tsDuWL{Qcj?ceVt23pr8qv?SlEJ69c=t#6R9!>0R z-P*U$>CX!M2Vw)+L4kA%0)tL$?;wfc>~K2KJv`Lsqy@8Lncl%z*4a)P$L;30RLtpj zGJ@(Z!*Dnoi?^;#r=z1?u}rpIP}&pQn~0K$BUn~!%vD`E;kGHO_G>ulfI|RKj1#BAoPiq!Rqh0%$Ie97+3Tcr)4375sG+N3iCFd;s<)xDbNNnz)sY-{vOgN%8BNFZ z+ap@p!5ED*XVQ+YrnvL|WSr9l!MMvv5ZdcxdtH=q*Th*V2^&4Am9eeJDnOfl8pIhb z5pT1i10&HyzlXpwv;8g6lqX6k<75qr1T_u2Cj~O3?V~BDT`iy*eYuT|;PO5$N$fUs zdN?ZZhxQ;g7kG~05ymELvC)mIX+}=HQ3=~@T%RNCQszB2wkz{M+8H7Um9*1FuNjkx z-A=+L>{8ovKQ#nJ5jl6eV%}`y7QBLDMh6B|%mT2vPTRhmJc6EAQl>07si2(VQfB9L z*Ms~c?j^>*RH4CK$D?%;&H+z-vs~G|ud-A!H5`v-9b?)sF|yxAT(KMOk2}$XA(tY7 zR1ise){NzC+=eLS+ZH{L&~X_XSwpxXncT005gP}T5ZIhhw^!1rjoS@rT`V)0OeyKr zHeRD7|MkO;V;H^G#_J5D&9TH@E|B5^e5J{j%=Q~*Z1foxoOqi~9W?I2g@zb0?K3!DG70M+8?C;Z*?Wzs22$6ULn~!*MF7 za^@@|x}PKBPL|3J;)yBwEoV@TH3rb!*t{twDoj`n#e4FJ!1WeQQ*)<=Lz=^jL#lBz zY%RsD(zrj>M4BRoGfsMYa=3p`-RYAyK8`bCdHlYAdPvGHHZvMd#kj;eU3OBeg8ji0Fi^HRgv z%+^#Ync$u}6CHz2|NbHFtQ7x)Uk34usaPA$WSt=!zrwE>wv)rOzgHQ>lC9eqSg4h> z6CGk8`7QOgF3!3mgx|Ai(p)7hoCxDZ{3(b(<_dzTGi{v5|561hWfo^Fo01lCUSw4G zXB&Uf9aI(BL5MDcfZ5Dq8mK=WV}&@7i}$(u#rw82j|pZ^qF5D05Qk%#9>Ua2Thg%$C_QhYHA~;xVf0k|JTE7_*R6kVTWS zsIuh(sV1IT;$}30{S~DUsi$O~Ef*^I87vZev-G}GGT)X3QmbX#a9_rY{&cS?{^cn) zBn!D}Z%FF-T2~3bur7PQTwGl4VjO6?JvlX16;Tqm(WiAP7o>tsQ|mCsEKAF%pe$9l zDKb&r=9Dzq(yT$>;y#9y&}z#Htsw%=ZNt$x{r{A#wB<6noTUE2Xj(&*#aPn8lp(8a zStD1_bM~Z@Ltf6%$K03PCO8lO~iCQ73+~AC|%q^VYr$+LzK#9>9*0wa+xhwef6f8aO8z8NWC2 zS^8}m(BM*Og3Ez~7GPd=DviGe)X z70qOIQDrn_OTxHpEx7AHHH9LR*_c6oJBUL{zP2W~7elHBjKy79m* znl?oH^+>6K;5CAG76veHw99Z~G%*l&GE2Hxoernk3pVXVmjcR^iN@UuI=$hAL7<2x zJr*6&c)W+jY5SajjE3ZOtXz8~ByZq*9p8tjJdvi5yom$}hvYDAI+^4a*Gv6@SR%7H zByZ7yO+v$TCK67%BOc9U6n3H9Av-Ad36{>#RI$AW<$l4!zde-B;VKG?nW}uOS4&w< z@&wCPiJo80o2OUv=GoP}d2;3GGSi;TaXd3mepm3D=i|xm3;4}bvKh-WGT$}qyU;x6 z^Xm&-RoC4ec@hgEPh;V(CsBVIi`l%G&84TYEF!1TppQso!D%!_YEPpj;yaBM5$iNo z=I30VZx&8}+^oHt&(%ieYUckkBlCPpx`?tapg*Vy~P&xvA*nb<~f$=e^XBZfQYe*ArM_-KqxS z_E#Q7&^HE4ZKbC08BNSK>RdrUT}p+mEMUFB(?|!$5Z+}#1yAC}Hbbu=!<%~ZvM-~P0IRt2YD%~Umr&wM35zz;Itc>aLLf?e zDr|1xIhN8*!lsYsLapVMb}L7fm=^P$(MO-=JHpe44H#g{PyWl`U=Q29yfE6!mY>kn z)3NU*rpC(@c7v17^a=9wvvyq28T(P291F6+@u3#=k;I(WyU`@Gy;cXFTWHHVvht~Yxsp=4{#o_yqS zvDuTA--%yZbtkbLm`dKuHK{pyI5LiXCo$A@66q}`G2DF;2ivTZcvYMKB<^Sn_*MtU z(5h0a-Kv9DqmOn|d*x~6fkw+C9tuizusn2p;;XrCpRZ~949nL%o#gk`Skq|%UyXk{ zE$FKWOs9p4%qg^ zIe*4N<(xk$Q63^`MoM5ap}U1<>t=q~%ABx`k^g$S_YI7)JFpZx=_I}E-GLi%6ZYd~ z+`+rIBX|WKrCXe#LwuPo@k2uA1vnDM9$ARJav26?BVuw3_DLH1_YN(yq+AGKIH+t!MIns+>1Ne@}XJ|;}BaG=F6RUBU^r62;YG>u@%5YbY_KY(15ZY zB@+}l#CQ`#V%q=o-bSv$yE#5J+OOtYT{@&D8pmC#7dPOCjf1Di^)@4~8}vh-yrRc6 zmxnycks2xe$(-Z`y0>TAC*!f zwOqO7_{3=A$0(N@wl|=H?JU2BDeVaJ=mAm=GJB3P3*OG4@G2tU)wJ|$m^tsDMh{X? zZ{X+=-XR{sU2Gkp#?^KkO;~x*(}fQY;G_5$wc*FTUdRY@mKz!?7&;zjuf>(FG{M8q zwd!z^G}mH#5d5>+>y*62pI#=I--E_@r-T+f#X)ZeCMct8QkNRUCepQ=U7?~ASS;k& zfR_Rll#jJ9ZRJ)!Pa6AwfZrB()Z&#dU7pFh$57RrGuW2KCJjscHoE_r(W*u40CP?7 zd<#Xmn|r#4;qh)X;Xb1!x9(`kA)M*pqo(?*BUUvrl;A0HP+Wyf-)y!tK`?bru(WZd z*9gx2&tV_0!1z?uD&jO*tjYn5AgQmha`JXJy9uL=Z$+2C`D5B?gnwT0kZ^@R!t&{D zxC9TsX#PW{@`cy8C!feUI` z$$rCi&woFPb?S=GKZWm&<3F|e-$$|NB!130EQ~^xzZrwS@^@$O2M|>+5HC9BrK6a| zF_jY}6%@Zlt~Jf)uyk^hm|uL86;r3>1N9MRZ{S^2b3AJO)-^XdC_t8O4 zFl4`<4*V!X^cchP2WYbo(h)yI*ZweF_#-$>2tGo``w(67qja9r{O^+#{~LG`KOh`` zicjE|r2GzNdCT@GDdlZz1)h}}d|K*w!CH^c%2IqzA~+{4_>w`&HLh86NRieYQrOa( zh=&nrASM(kBX~+m*s>_a4)KXa7%SvAAp8=l>C{V?O|X;*7!(;Fr<*^gk^IF8qG>vv zMdgc(0pU64QNHv%9b3eYuX;{$J6HCRw?V@>EKxM@-q$lZF;uP;7ejvQF(3cq=)xNJ zE0|4g4fuM2J4bT+L?pLQw%mQ{PArrxV@i<#Wj4+#+eyloa%~eQq$&dthQ?WJ%=o*)~wR<2*TA? z^V#DQUu@J*{t=UtT-c!fu4d4(84klG<6u?Vm$da-TryTtnV;peV6B_ z@3Hj#0gdrI0rX?W`k&;D%S_>(ox&KBB?JJk!I{~Y5lAKEa;scInvap`Dx(OC9P6cl zy{>V45SZXX8XAJKoc7|AIrk+jV*5No=P_r3;n~EyTtCkX95g}xQ^`IhYuM*OlqfVB zF8L9Cg2!9g^miRZ%R_n+)n`lo)Tsy1+@V!-_>tPiv&S(@b<3~UH`cD~ZZ@W|+bnZl zxuwRc_OBe5Msrq?x&GsLc}<}5zHwGa$MLL0AWA>E_BI3pFZa(`So{*Y- zDiKjYDR^cZV_9SI-F((MLEtxA+WVAT$>ZG^7O_0hllT~_y?0suWd1l2TqhA}ma9FF zc$C=zj1Myp;6Ee&e~uNr?r+C0=*hogG5KpoqTdimzhx=$dlrg+pwGX^a^jDS0Oy$| zUt;|FGvm|*fB6!8hJD}UydO#cKc{tnDmd5?Lm0qsUSfbppmbzig0~ zlb=R|PLxkj9X=QO1bx|GQ0aMqi~rd#lk-?s@<)_2f3BH^c33-ta&_sS5Y&Hoz~7i$ zz%#JB`F{<;u=wM$QB0XQSpmrA?&c?C3qxEP-=+ev9?Mq%1#!+)08)<{S&Zd!5gOTE z#eJw2-3nk$PK%`FDu6Yf7Hd!`*UJq=i0;)?0JCRQ0KDdOrIsk&RBNqg|1LLe zD&NF%i@sOry#(JYr`{cr!qWYImTXP=k}c<5tlYZzx0Qbn@$b0jX1QAKYs#-d>j%Cg zdQVkwk45E@N(FB(L2p5T$mis4?ixhW46l&oXkvW2TpDqeG+{k)v6VkG49KOplkaiW73Ax^s{Hgy?1cS#%Cw>{;b@{!dX~GFY?Mp)wU@TcY8&mS8z2D7W|RY z1IZP9>(NF_Ebd{KFy~J>+z{iXvd-ArJ=}!7HB0pOQIE?Dp3w%$C10;ukI$^Jx*9(Z z>+zXYl}^kTV_IQtX=-E!+^r>`E0{K#T{WwWZfPAcG5tEsmJOK0%l(V!(aU5rE|IP1 zl5OZAux@5{-77l^@H*)2;Ua7>m4=`Twekv98YSrALGqP6-1;U9Z;X2ig6nr-w+jpCe(rz)X%b~A-f_^iZd>I&4pIMDV4u8l#5ef z$O@0Y$o?ENp2uD9JFLvcCH@dz=eCm1K)MwEf79LE<1u%h{{Oq$lsY}HuQrxhkU@kc zMg#3*pxuw95=XNPF&HK2KuKILDWv!wH~f=osWbYAYQug>X5 z3FA7m!3aM}U0qk#^#gTT-4DN3DiZ(azBidk zI{1UUci*}9o_p>&|MPM0^oy^YISXKu9JCP-R1PEu_q&;)H67XH*pLlNP<>1CKypnw znc27Ix`A8V!Mq@JFg27P7D$&MJnW|S4U-tnkB?<~$43U-F~OWvu75a{cXyD+aeFv! zH02JuIYF%3FdWaP(rY%2jU^9vr*iprK}BC`UnWT=uAs5pm@B&r!fjVp?Hf61{xBC$ zs{roM_G~VdPh~S)qq=0i&wkY`QjuFv_JF&*Fxhae$hm25)E(L-sP*QV{dZ;Z?ml-+ zg)NNO&7EDD%B1oesg|a$u2nk)R%dp|jUtG+gBV^T2sW+SX``OZ%4|J~I>aj=SmK}x z)!JI>pa!+ty4b;dueHKK2w|nIbYOd}RSqIvtJy&XqT1W)U=AEXRd*`mdgj=X97t2C zHQm|4WO`?EET!K*(aH~}sIaPO-5SGlhvC6&n$rb#+G8Y$>~r(|p5?hC+P;E>ZNB*{ z*;Z?pAV5D23XBGbfjP;c1If&wkBZ8^Ji*qJ9Q8$s01*O@W7)NLem;Ci*|4Ju|=R~b3?cw+8wa3ctZU~*_k#Vi4m=Sc0Vs1w`w z6v~w6CKYfqU~YC!7dphh!~9F}Z?x24o-@!o8TX*CzB!)k{#WH_c62kUCPi;q0iA@(#w86uN%gbq%9~4h|Vc*QPRD*&5{ne2tMUne8{s*cdP@IPq4U z$N~E~Tn%%FgSYEGLb?w|ok%|0mmf2{<~Nms!lSlFaF>8C^G-pap+Py^Gn=IcobJqyy0Z7mpiFJ03Xs-{#tN(8D1rT z{$t#OIA+`_H=d?)YA&2bL=SRA+RanhHXfUia|#C4SYrUqjV+vEqS7SNRKBMe>^*PM z)UjY@IHWoJIHVdk!!}XeT8-&5O{C#}Jm-$>$c_&Vt2>=`@HkFI@g$zM@f1C%m@)l~ z;ouCOp<)jt)8p=Sdlh6ef>t51D7VizIIEzpWw0JJe!H!Z<8r#j=Nx=qqfsQ4$?sHt zI_d8m{Jl=9GM-R6L2%B&bNB+IVJbJ>;W8qbbhXFE7X?lMgPIGYcphKY2=@<0&aRRe z=OqUXZ_nc&9emZGC6%KXsUf9(-N8Sp7`A)J9URY-)i>}>8~;)giuYS zrl<)1lTDM!YGC156hFg%+xU4QpU<4>;D7MHRKch+OEX-}i2MadF)I9pgJ0?nYRl{( zf?v}o%x0F-K!fQN3$vj@NH3Hh{qcjw6+dZ^nbnzC0c5q*OUlE%UVM8Xw5{0iGT-!-agsMx>Uj_D3YfS4Ry( zvXBu>E-Ei~ISw@4-h!HH%P5K47|`OF3sS+RsihXflBJcBEd=X=rZN-NZBEKkN0w<^ zx44fHB`kMjg_a3n_tx=bnl64)Ryxuot4JCgPL635vKTHpnH8kjkrrvC=jH#oO*+ZNzErDLyb=v31M%-h| z>xt=Nw$)1B7S?95(r`6hx>v|m(&=CiD`K`->D>e(FgTi}kPByc#`F}rh{JG{?M~+M z>M~4EP17R_!H%-XwT^U44>!wNZc{p~rJuJ4QzUd|(|TT@f=o#lGN8~c+`%{{*E@29 z^f7`l+L=hHD^aG`7MC(^+&+8dk`??zOjP}Ro0}fhGgg$@BsJtSixk46#?fg;+SzWx zwd{6ekH(rB6Kf7;wB+)GC0Q}3jt#mR9{6E4zFPIp(AkmA=IL|E(H=KHoE^$V<;{|` zkAMG*Rmdp&L-Q4nS7JcKR?IpscF8E8MQ1Xd?qki@UKN%%MHG{Peu)T+&_D;@EV6?lEfHZI z8jxs2MyR;y#Im$O8V;s1xup>ywuAIY!l)~gamPB-$y`ot8!4P8ZQ<973p7=3@3xE! z7XR^~M4+cAEMMV$o?VPRMCA=wn%;?lhJs>QAFF5j>5i zgmoH;;=q<-bMfP5mDPN%<{=ea*P>)qn9D2)^eXL=-IlItpMBWu-=z@4d2=qN<4w(kFgQpqVOjyG7MEI9N;q)Y$!Xq zarWe8WhY-&c5>6~$t%lFz8qJS5j!z^a%j)y0)dC_q+Xk%;4I*tW}0oU|vYZ5&hLPtUpQ#o3aQ$lDH3XJNEa!gj2rJeN?SHqyFyIna+yNb4ro3~1IMEQ7o!cmrD@@^8c&@g}zW3EDTa72=BOc)^#M zU@leI-8}6spC-Q$dp8F+PGE!XX_2oBD{fI2b;q$t8(Zs-W4_-#t%;3Cg0g5@56>3& zyVz)W3psD4(`>_X?y?ov&}v)g9zABC>%4WR_qo~ZN%y(g>?uIWHkmyI$>U-f}OntS`9SpY2o?!)BXOlv~xHX#=4#q>XX?8Fko=uCC znOhycaE)sFLQ#U%c1uC_g2Yy}-8!2VsS^lh3Ee)LZ3pA(jg0a;8B60ZkifYl9c1Ih*jrYLZP@y5p9 zS^pE&&0K?*SbS=h+Q7F$J)$O>#M@LaUciqU2R}%zhe|?R#Ftm}u;cNN4|Al3iu-Gh zbO&EIfxFa&Gd1sMvplAEw}mILEgpUv?-pou3u#!==ys_#)T0yHxNj1F(MG#Z;^;y`5S8ZKT|RRlEvo=Wed%etK|(mcNTyeFrUk2XE`%#jCg5*?KqL z$$9tTJw_MXOjx!{F6e#QNYP zzQy*!{=M4kq`b`E4W^jUZDYKXLJOYcpnHKS%IKNYquS^oUAx&8DLWwstH1_0PdNl1 z!^bI`SI>OH*#9H^wy2lYeu2{Mo2+*NwXFq%^)wS2ef|74x_{AV)iTL&feD`PrwI3R zPaj}-ydN!iz-Y;?`M=^(EYJNphNtJ74x~%ma zR!naYuPML5c{8UKgYmeYM&2>x|=jHT|!X@O5LgnyFG`#7z0iq*!a z=)h0V2~RVGPSUNPq&C+uc;=Nxb zkDxJL^2PBbsmGUPDev_f@fAt%s!r>pjh;CR2$ALjLfG;K! zt%N4UK8hL^Cd87=v4$pPZd<51X2nB&M=XhHGHHAi(U{eG_Qcc|oAr}_gkwdm)Jz~; zD_R#eosk7VUrFHij!fTUNd7)U>ksLWFVHoA%(VFv)`CA}1^gl_-WO<>pCeBMOxu=L z^NviK&f}sfvx-0T)DeRLa=BURN#l=|WCgO_1RcF zPPS;0zOTOd>!c(~>rlXCG< zFrl}xT%44~>i*-fX-Q7f>Wq{Pkyzv@Nwigvw^!PR>f;qLyHLmaXO`uUVood+w`j}< ziy1rJd{#yJ5c-XQ*Y>n{LiM(ueS}A#)}Ts6ds7M?$|hL1SbVphwLV0Iw_4i!l&t3Y zZ30VJf9Sb-0x|zxSv+Sy&M{5;((ibD_&v7b6>O(XcQWMPEOc`Qj=Lp{_eum0unPPb`##TkUzRF-L#pu|nTH=q zEw9Dr<0S@{mt_I7MVykkP7SYa2WT`Yrqb%c9=EbsFmh*~gBBcoFVnlJk_#)E zf>fI0ngB}f5==o&;LLCs!e*(oQRVHpgkZTsUXRUk6@RPVghPD4U9QGGvW36-cJar} zYw%II)|kXA6;Do^QD1n*R)_%8~)!q6|Wniwnj3!bM?)&kyfM$0M+ ze4Q4JGY&Lz9V%qISyKy7&;>lR1oX#4pUZE2vka3 pieces; private List highlightedPositions = new ArrayList<>(); + + // Add this for undo functionality + private Stack boardHistory = new Stack<>(); private Integer selectedX = null; private Integer selectedY = null; - - + public Board(int colNum, int lineNum) { this.width = colNum; this.height = lineNum; @@ -22,37 +25,30 @@ public class Board { this.isWhiteTurn = true; this.pieces = new ArrayList<>(); this.highlightedPositions = new ArrayList<>(); + this.boardHistory = new Stack<>(); } - public int getWidth() { return width; } - public int getHeight() { return height; } - public int getTurnNumber() { return turnNumber; } - - public boolean isTurnWhite() { return isWhiteTurn; } - - public void advanceTurn() { turnNumber++; isWhiteTurn = !isWhiteTurn; } - public void setPiece(boolean isWhite, PieceType type, int x, int y) { for (int i = 0; i < pieces.size(); i++) { Piece p = pieces.get(i); @@ -65,7 +61,6 @@ public class Board { pieces.add(newPiece); } - public void removePiece(int x, int y) { for (int i = 0; i < pieces.size(); i++) { Piece p = pieces.get(i); @@ -76,7 +71,6 @@ public class Board { } } - public void populateBoard() { cleanBoard(); @@ -113,12 +107,10 @@ public class Board { pieces.add(new Piece(6, 7, knight, true)); pieces.add(new Piece(7, 7, rook, true)); } - public void cleanBoard() { pieces.clear(); } - public String toString() { String result = ""; @@ -141,7 +133,6 @@ public class Board { } return result; } - public ArrayList getPieces() { ArrayList result = new ArrayList<>(); @@ -150,7 +141,6 @@ public class Board { } return result; } - public Piece getPieceAt(int x, int y) { for (Piece p : pieces) { @@ -161,7 +151,6 @@ public class Board { return null; } - public void userTouch(int x, int y) { Piece clickedPiece = getPieceAt(x, y); @@ -180,6 +169,9 @@ public class Board { Piece selectedPiece = getPieceAt(selectedX, selectedY); if (selectedPiece != null) { if (isHighlighted(x, y)) { + // SAVE STATE BEFORE MOVE + saveCurrentState(); + Move move = new Move(selectedX, selectedY, x, y, this); if (move.isValid()) { move.execute(); @@ -217,7 +209,6 @@ public class Board { } return false; } - public String[] toFileRep() { String[] fileRep = new String[height + 1]; @@ -239,11 +230,11 @@ public class Board { return fileRep; } - public Board(String[] array) { this.width = 8; this.height = 8; this.pieces = new ArrayList<>(); + this.boardHistory = new Stack<>(); for (int y = 0; y < height; y++) { if (y >= array.length) { @@ -292,7 +283,6 @@ public class Board { this.isWhiteTurn = true; } } - public boolean isHighlighted(int x, int y) { for (Move.Position pos : highlightedPositions) { @@ -303,12 +293,6 @@ public class Board { return false; } - - public void undoLastMove() { - // TODO - } - - public Board(Board board) { this.width = board.width; this.height = board.height; @@ -328,14 +312,15 @@ public class Board { // Copy highlighted positions this.highlightedPositions = new ArrayList<>(); this.highlightedPositions.addAll(board.highlightedPositions); + + // Initialize board history for copy constructor + this.boardHistory = new Stack<>(); } - private void clearHighlights() { highlightedPositions.clear(); } - private void calculateHighlights() { if (selectedX == null || selectedY == null) { return; @@ -354,14 +339,41 @@ public class Board { highlightedPositions.clear(); highlightedPositions.addAll(validMoves); } - public void playMove(Move move) { if (move.isValid() && !move.putsOwnKingInCheck()) { + // SAVE STATE BEFORE MOVE + saveCurrentState(); + move.execute(); - // Play the move sound + // Play the move sound Sound.getInstance().playMoveSound(); } } + + private void saveCurrentState() { + boardHistory.push(new Board(this)); + } + + public void undoLastMove() { + if (!boardHistory.isEmpty()) { + Board previousBoard = boardHistory.pop(); + this.width = previousBoard.width; + this.height = previousBoard.height; + this.turnNumber = previousBoard.turnNumber; + this.isWhiteTurn = previousBoard.isWhiteTurn; + this.pieces.clear(); + for (Piece p : previousBoard.getPieces()) { + this.pieces.add(new Piece(p.getX(), p.getY(), p.getType(), p.isWhite())); + } + selectedX = null; + selectedY = null; + clearHighlights(); + } + } + + public boolean canUndo() { + return !boardHistory.isEmpty(); + } } \ No newline at end of file