From 8230ee0f670a06e5633e538511e015a70f66d371 Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:07:02 +0700 Subject: [PATCH 01/15] =?UTF-8?q?=E2=9C=A8=20chore:=20initial=20Maven=20PO?= =?UTF-8?q?M=20file=20for=20project=20setup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..231652f --- /dev/null +++ b/pom.xml @@ -0,0 +1,23 @@ + + 4.0.0 + com.zetcode + pacman + jar + 1.0-SNAPSHOT + pacman + http://maven.apache.org + + + org.junit.jupiter + junit-jupiter-api + 5.9.2 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + + + From c67ec757188a07fbc6b60e6cf8048138e7928257 Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:07:13 +0700 Subject: [PATCH 02/15] =?UTF-8?q?=E2=9C=A8=20chore:=20add=20VSCode=20setti?= =?UTF-8?q?ngs=20for=20Java=20build=20configuration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c5f3f6b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file From 0febc9506d24116f0d90d71043c7ff1025c32ff6 Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:07:32 +0700 Subject: [PATCH 03/15] =?UTF-8?q?=E2=9C=A8=20chore:=20add=20compiled=20Boa?= =?UTF-8?q?rdTest=20class=20for=20testing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- target/test-classes/com/zetcode/BoardTest.class | Bin 0 -> 4034 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 target/test-classes/com/zetcode/BoardTest.class diff --git a/target/test-classes/com/zetcode/BoardTest.class b/target/test-classes/com/zetcode/BoardTest.class new file mode 100644 index 0000000000000000000000000000000000000000..a1503c893f8444d5f3b5820e6300da13133b3278 GIT binary patch literal 4034 zcmb7`YjYIG6^7r|O5T+iZo&c_VLZk*mSn+VKo}!oBOwq%D}mW%6N5qS-EDS9yF0VY z%nFIbx0oc(#fei%T;(eJ3sp&6+50^H%_l0O0@hi+Krv) zjbfL9$I-WjCb{hSs!Rx{N*jHNfYWl~mtD*DlfJ8Dc{GMS0;jL1&LvZ)%p=Edn6t{x zR~IaE)>%|#W&7r3nJr7(oKS8-dR9p{^2(J(v#87&X-m5YPvC1&^c&cRC&}1m8G&d; zFIuw6F%W_T4kLwS=SK(A+8a+9FttOsYUib;YspMWd3xl4foJqcw;oBTMOD(h&lxy~ z=h^Ei|BAXjpIZ{>9GDJ`4H_6)Gq|j$3>!G44fT{MFI1+x;|7l4MS(4O<%hlVw8hPv zj^UWV#TmzObCxZAbE)nR-^$Sk8Rh!2oRJ0d#IU){5HRU8X>*7!3x8=ii(T4TBRCPo zO9oEjWdYN1^YMi$RqWDWo6hb%MvwEO_f?=I3qAtkBMWC8WWal#V{c--CVTQYsIRoy|oFi z1?DDK1?ka81e%a{w5IcG+^~+Qy&Ep9+4^;!qq8E9T;WPP7cG=XG=@mnzSvaC#oWPxSCGCj%guY|>*EZLD`rC^j79Xn@vmT50j zq*;&|D@fVP242(ow}r{cl=2elmakJSX&|LDuq&seU(h{i17F8C1Y(vqZBKE{AoH&2 zOu1&@I^Lj>FbB>v1320_aBVOh!%cy79e$(*p4$`Ft1zFAxJCplRLfdpzTkL% zvm$CB-$1qQ#JTyY3zw3qBvqW{AtQ!M9iKZJ6ww2T_Jwvr-J+Y$$!vj!`g|JH=Ux~x zGb%XV1omw(xwif@8w^icUZo_L=NQqNa#5D5)cAPIA}nxi)()yxo8NUE;E|`TOzI4x z*K|7w?}>V3)4BSjv}CECdIDma@uYt}TMrrbapkQ^U+NI5)cn0GFsGKnb9PE^Di^HV zYwluC(y6*xb>7lDw=KBRq-g!HKK}7E?=>B~EeSq(vtg@;ZC;o7T;x}rZ^3uh&;y9y zv(bS&eClDK8%ul|;SX5GU499ClcOEM55Pkgty8ncprVV{N1Fs@m@Z>5x zM$OK*IHp&5E3o-?!{)~|n~6VQNAK>c_NJuBEBzMj^v&J{eX-;oszgxxRf#Bama z;ohSUaeSwUg`cN-PxG_MbdZ{W1Bl@{I^!UAV-Wj!KRJjOcpo{;Q#+0sUO}3=6RUW) zQ_(w||1P=T^RS1nZ?^}3wJmr@JMjB;@bUi-K0@%51b>;}V+21<@K*>v&aVlApWPhz z8G^sx9{g-uaC$oMI0ZC4{&^kz+*3;`A(T$o zV;bs4Tc{PxkJX_1J9A-c{vk5!x!xkzyX1P0T|DgV`dJXLGfyZT3VY=8S_>3c%_`agdU$BH|S zh7G$WArh3nuta=F2_F&XrJd0o86yIm?38wHVlK8A4WiJNsgFpZn&S8=KA*FPq z5WBB@2kmLrLf+$ucokLmBRkcH*0g( zNF3rJ0Nkg{9WM`CA8m@?W!D&maH* literal 0 HcmV?d00001 From e5800a7727e48ad51cc289bba621ad5cb6b2d19b Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:08:31 +0700 Subject: [PATCH 04/15] =?UTF-8?q?=E2=9C=A8=20chore:=20add=20new=20image=20?= =?UTF-8?q?assets=20for=20game=20graphics?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/images/down1.png | Bin 0 -> 471 bytes src/main/resources/images/down2.png | Bin 0 -> 479 bytes src/main/resources/images/down3.png | Bin 0 -> 512 bytes src/main/resources/images/file.txt | 1 + src/main/resources/images/ghost.png | Bin 0 -> 416 bytes src/main/resources/images/left1.png | Bin 0 -> 459 bytes src/main/resources/images/left2.png | Bin 0 -> 460 bytes src/main/resources/images/left3.png | Bin 0 -> 480 bytes src/main/resources/images/pacman.png | Bin 0 -> 364 bytes src/main/resources/images/right1.png | Bin 0 -> 441 bytes src/main/resources/images/right2.png | Bin 0 -> 451 bytes src/main/resources/images/right3.png | Bin 0 -> 483 bytes src/main/resources/images/up1.png | Bin 0 -> 480 bytes src/main/resources/images/up2.png | Bin 0 -> 480 bytes src/main/resources/images/up3.png | Bin 0 -> 494 bytes target/classes/images/down1.png | Bin 0 -> 471 bytes target/classes/images/down2.png | Bin 0 -> 479 bytes target/classes/images/down3.png | Bin 0 -> 512 bytes target/classes/images/file.txt | 1 + target/classes/images/ghost.png | Bin 0 -> 416 bytes target/classes/images/left1.png | Bin 0 -> 459 bytes target/classes/images/left2.png | Bin 0 -> 460 bytes target/classes/images/left3.png | Bin 0 -> 480 bytes target/classes/images/pacman.png | Bin 0 -> 364 bytes target/classes/images/right1.png | Bin 0 -> 441 bytes target/classes/images/right2.png | Bin 0 -> 451 bytes target/classes/images/right3.png | Bin 0 -> 483 bytes target/classes/images/up1.png | Bin 0 -> 480 bytes target/classes/images/up2.png | Bin 0 -> 480 bytes target/classes/images/up3.png | Bin 0 -> 494 bytes 30 files changed, 2 insertions(+) create mode 100644 src/main/resources/images/down1.png create mode 100644 src/main/resources/images/down2.png create mode 100644 src/main/resources/images/down3.png create mode 100644 src/main/resources/images/file.txt create mode 100644 src/main/resources/images/ghost.png create mode 100644 src/main/resources/images/left1.png create mode 100644 src/main/resources/images/left2.png create mode 100644 src/main/resources/images/left3.png create mode 100644 src/main/resources/images/pacman.png create mode 100644 src/main/resources/images/right1.png create mode 100644 src/main/resources/images/right2.png create mode 100644 src/main/resources/images/right3.png create mode 100644 src/main/resources/images/up1.png create mode 100644 src/main/resources/images/up2.png create mode 100644 src/main/resources/images/up3.png create mode 100644 target/classes/images/down1.png create mode 100644 target/classes/images/down2.png create mode 100644 target/classes/images/down3.png create mode 100644 target/classes/images/file.txt create mode 100644 target/classes/images/ghost.png create mode 100644 target/classes/images/left1.png create mode 100644 target/classes/images/left2.png create mode 100644 target/classes/images/left3.png create mode 100644 target/classes/images/pacman.png create mode 100644 target/classes/images/right1.png create mode 100644 target/classes/images/right2.png create mode 100644 target/classes/images/right3.png create mode 100644 target/classes/images/up1.png create mode 100644 target/classes/images/up2.png create mode 100644 target/classes/images/up3.png diff --git a/src/main/resources/images/down1.png b/src/main/resources/images/down1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa6b768949d692f701a18cc671b9e4cbb4ece8fd GIT binary patch literal 471 zcmV;|0Vw{7P)@x2Q?6zN8%kYyQCb-#t&pp?YkwE?0t?E%(#X6oI~qY#=mRFF+$+r?pq*$2 zZ7vJE`%h>$e76V8`jF2b^eyWui82k`0CRoDW7zWqETv(j#v(xpta1vJfSHKkX`qzS z9{!jej{}uNc?R+k!2q=sn2HPqm`s7|5rD5#;9>;e^AtD%nh~KNz*(Z?fLmZT68IG; zreGb|2Hqnr7ZN*e*d7xVI%%Q0#Q(+Y}^gmEq)d|3(00Cu;F^)6vH{^yK{%jnJS6)Rb9j# z+(I8Wo5Xv(!dtv1!`AjBE#ZD*Kk+*;Z7G>Hx&2w~>4HUYJ@F!O(7IoH95g-a9k8{; zZeqLyI*)PFyVeFjOB|j9oyXzKI05S~dHl0JOFxM!(Zd&9>9`)tt{=EoV-pt&p&Dzm z#s+!?;T|?>46s@dUd5nF{KTb#F#M_#6J_5RCN;hnMq#(c$NvC-sPP6z1jT&_8SguYyJ%$ex-x7mGr{i2!5>FBjTXI!mJMlH~X!d;C_y;U2 VqLsd?oGt(W002ovPDHLkV1g-m!^8jp literal 0 HcmV?d00001 diff --git a/src/main/resources/images/down3.png b/src/main/resources/images/down3.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3a0252053a07545f47a2bd0cd5275336ded073 GIT binary patch literal 512 zcmV+b0{{JqP)GWL9A(3 zfLT&bm3#r{)bm)olmd4b>@?MRw*;pBkI*8#9l>PEi88JMJdUg^0Gq%X5GwB7A{HWR zGsOGZr~x{)2G9w>7SO5@+yb^T|bS|(@K2M$q!@@>u&eO1ttpzJCAIj^s$WYdDziR8Q}DkXV6 zQic^O_ol3F@0C#@>8J9b0{kS=$WVDVnd&b1vGUc)@6cD?&Q~0Eo&7GiaRsXhJr?DW zauIjF{2TB_Y#>+8l&8gbs^FpW^3QaV^VoT_9Qy^|+Z7a`RQuon00003}mpEc>21s-(Z&&ak9Ar-&D5)jAeO^9|b;g<&`-f`Tb+#Ja;SB zJr!O0jb781&)K+5b>)5I<1?1rF#jm|(}GcH`j%PSg5$2mEREPY<+$q`uNohT*aSUe zLj%Q3qk;hMNm1K^OjN##RIME8iDEi)#Ij^++Z%0 zl`uQXy?=`0#1i$FA(!?#$9TSfwODywL-^uay@uQbISHe0QyVf9m@T$!x!0#z=ONzT zAQtdV=0Dp8c9pgt$LLp4a0L^K4t7X=AILo~HJwz=3Y z{td4E3r%gUO@Tv0ZP6kKZdpU(kJK_VuZH(|MPHvM_4RbYJ)LvD=jL$k>#CAyS2c<$ zOyD8L@e3cZfDd>_wp))U87P+$bBV3Qj}yzi`kh!$tR|keZ5V_;NPKRfZTs75EAc8Z z(g8Nsba7VT(b`RXNn9HMyWVvAXGm}#{(2DnCb4$`=+S4HN}@{K!ZI#*e2??$JMPq& zK~)Hu!xjbj|h9s_`6G3v)l!c+y-@N(We| z@lwyVN@)l0tHfWB{sboh~1a^UWU>2AF zYQQyc0$c$XU^DY`wMUF8`$|K3|F)c{rBsziWie|*FLXTxzU2V3R9DJMAqUKg^702@ zx0=d>GTZ}ZX#i+jugXyum`J%F5ZaxV)i!ujsRaV7RFsiOxdSG1YObGn2DW415@-Yj z7l4I!jt|oOgi6PGlyqJc0~KI2&|lZ%1LS#UKOu02GNj!8LraTN3Q)(rCe&VG$Ha^Kf#%s}2fl1#NUc8}zihtI zci>aXVS2Q@N%G@pN?STBq9U*dlz?fHI=DqiQ6R7+iK>#cQE5I~R z0ZPC%a01kT)Al?O0BVO3D(lLvQt#U8wpZm@Ia4N+4s=3Clw+ll0*u>dbjg-dOaN1f zynM?5jlbYrDRh7-C>P2{pU`h>DBGRjos7@_%ku@5K)D1)fg(^y%y72x0E~y=1TYWm z0uA6jC%6dA#mj9>*;ih2gyUV=?6J#UPWVyKLwO-^1C;v=M?Fklw*?&Z2?d}B7=YOv z+|wT5U>TU|6WRn0<4GHibpM(oaZgJ18#thB*zQ<)Rd}xqqAV$oIm_#pq)|%BRaDsj z*@Q$HRqm8#4o~B4^Cxj-rIs-ye>M89%24nJ zF!O*gBhwyRaiE}NiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0v7JzX3_ zEPA(2wdOlyAmB3JSJrVNa{*IUm&hF@_Oq-(0ZX2-TrpvZQEY5G#O7Eqf$5t^bmjM- zi*Ih7=n|907;-@B2E*zN8!>7USkxdUSUEGyxlCGq*=Rw}hE3W=s5-a`by$)?1yr1$Ts;@*T22 z2A@)8v0iZcn!?Q}tM3A*tjsp^{@Tv_@87JRDbJ1fG9NQt9iw?7@3-yVLcA-JBa;W;iuOQJk!1Bd(Y*bd!8nV_GrfN3{NnF zM;OK?*073YvfG-Tq(xpNz9se&XRTY}IB}SGnHajfco}#%@wT7Pe&)YAOngZ^9sqVP zv7PwU0eVq;iODwbyBk20_|vca{spkvj@KWg---80G>Hjp;m&~e=o%-OD*cvfDna#G z^94^aS`j>g#iG~zr6L%TKi^0oF5+D<(9Ut{yygZ?P7lbF83K{{E}Nn$^-loo4hl1^qi jqGzV-_=GoPzb*S5c*JiYxvSNB00000NkvXXu0mjffE2s+ literal 0 HcmV?d00001 diff --git a/src/main/resources/images/right2.png b/src/main/resources/images/right2.png new file mode 100644 index 0000000000000000000000000000000000000000..b20263cb53240105d48845c0a3bd16eb25a4f4e3 GIT binary patch literal 451 zcmV;!0X+VRP)UQ&c!gCg zVhX1?!~u56S>y5~4YHCrPh2K$8>htIL^rXSm>nD(1WqJ&6P*@VlWrb2SZ@KFOq?dJ zhk*9$cj8?W_*3G~h|qrcY9H9zkjH;YzYj+h#ZMvB5SYqZ$2e;wtgBzq4ibf0d@2 t$E({*%nuG$$xy}g1Ket}-4 zQqk%B1|bol7ZN%N1rnNN?Mm#jk78$KGP%BH_9Q2n%zN|PlXLHRZ=@2AC<3N{NnkGi z9tNI)8{iVy1@<8TQ3J`Ca;B7&*Wi*yz9@Ifs!~V_X<&!49>YF<0H(8|94mbRFzw3u zFBSfjZ*lb_Y4Aq8a~5bb-<1ocy$PMqQE8|xn~~B5Tm${zT#x@m4X6V51z-l~$O)_h z6<`aP1xMR}X`nL)v;v#}%i!(TU*#xAKg-H?NQjgY(4Dc`J75T`r-edBU^DhY&?fja z2YBK;p#U7xxF%U*9HOP5qAVy+IS%kO_LrWN3DKoIwqV*y%9_%d@QRj=bXh4Xi>)@H zs&b|DCc$}av!*;K1Bq6A!Lu5DSvgS#6NeXC`KPC;9_vMAB{0(eeoV_WM)?BR0S-db Z_X#HqYY67PcxnIu002ovPDHLkV1i~AyvP6m literal 0 HcmV?d00001 diff --git a/src/main/resources/images/up1.png b/src/main/resources/images/up1.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef859f6ed398d9936d8f1ef6fb4b3fefe82185c GIT binary patch literal 480 zcmV<60U!Q}P)sw;4@pgh;OMGf~_qWioMy>b81lZZcyE%Z9+G|)*Yw7_mI(_x<5UNBEZwi6o5UVxr z;anjooWVwo+gKB$8^&~O_S!6-2R>}Qy;(uOn0WS& z$I@>-i@%v5zZTd?9HbdXUBN#dRR>M)bVHS7#^qL*a0j=rj;rm9*P4I-6<(74F85C) Wu$}+!+$9(Q00005U}?Jv9XG}o85(M@mSp15Z$}#n(Kk5xO2|=&zTu`t|aDVCGj|M zuOrtaUL-yyw%hM{Mi+E5@jfw1j1%{d1 zh}#RmZY2&nZ|3hbO5FVg>~cNUzd~m^NSsfiXyXaaI(e*AmL_o#@37hf7)IDAc*N1< zeZ(m|EZD@E9>J$^tze@^=q#=@i9_x9ea2zI_nx6JDA@ZC;Jtz!OnZb*u~V>%Nsr(O zcALa1KHx%6;4io|^NOtnuC=U&E$e4@dzP4-06J+I^R~H`_+0&WS?IX-t}Qb9^~Ccf zuVq+!)_?N{IojY(Vn6XUG3_Xs*4%zuJ73TwS@5{cIo!Z?Y~gB6yu~ZL!D}+;>iz*r WF`O~bjAU~F0000+1;6JHpV2Ux#yhU+?m`zsI&*8%1ZZmR&b?k zD}$Z6&cbo!T6t84dZ2U4tCA>}%2W=_gmSNZgoceC@OG$GX()HfSQcDSK2yEV%1916 z8D5?qepil^I0dtoQJ5&3Iq*S%I#Y?V9$@0|PqU1=vYG;8WhY}2>9|uOlydm&yuw5| zQ+Acx9;nKTQbyTVzIqh*8+$P@3q%zA%tXo~Fjg@95GkL)K*4Y$25t&Q0d8X8^dI2U z7^nbm1)^_2B?hWMqd>R;R8b=3Txk}tew)FHezxj#*uH;->n*GObldzRUN?1UrQwot z5zdBw(IoViGGI{#m90K!UJpHO*Hcb4OG-_7^7ocV$4AK3TD9E;k(#q=qG4bWSOAuR k`H-jrhrkJN3?^CK-z?#f=xiF@x2Q?6zN8%kYyQCb-#t&pp?YkwE?0t?E%(#X6oI~qY#=mRFF+$+r?pq*$2 zZ7vJE`%h>$e76V8`jF2b^eyWui82k`0CRoDW7zWqETv(j#v(xpta1vJfSHKkX`qzS z9{!jej{}uNc?R+k!2q=sn2HPqm`s7|5rD5#;9>;e^AtD%nh~KNz*(Z?fLmZT68IG; zreGb|2Hqnr7ZN*e*d7xVI%%Q0#Q(+Y}^gmEq)d|3(00Cu;F^)6vH{^yK{%jnJS6)Rb9j# z+(I8Wo5Xv(!dtv1!`AjBE#ZD*Kk+*;Z7G>Hx&2w~>4HUYJ@F!O(7IoH95g-a9k8{; zZeqLyI*)PFyVeFjOB|j9oyXzKI05S~dHl0JOFxM!(Zd&9>9`)tt{=EoV-pt&p&Dzm z#s+!?;T|?>46s@dUd5nF{KTb#F#M_#6J_5RCN;hnMq#(c$NvC-sPP6z1jT&_8SguYyJ%$ex-x7mGr{i2!5>FBjTXI!mJMlH~X!d;C_y;U2 VqLsd?oGt(W002ovPDHLkV1g-m!^8jp literal 0 HcmV?d00001 diff --git a/target/classes/images/down3.png b/target/classes/images/down3.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3a0252053a07545f47a2bd0cd5275336ded073 GIT binary patch literal 512 zcmV+b0{{JqP)GWL9A(3 zfLT&bm3#r{)bm)olmd4b>@?MRw*;pBkI*8#9l>PEi88JMJdUg^0Gq%X5GwB7A{HWR zGsOGZr~x{)2G9w>7SO5@+yb^T|bS|(@K2M$q!@@>u&eO1ttpzJCAIj^s$WYdDziR8Q}DkXV6 zQic^O_ol3F@0C#@>8J9b0{kS=$WVDVnd&b1vGUc)@6cD?&Q~0Eo&7GiaRsXhJr?DW zauIjF{2TB_Y#>+8l&8gbs^FpW^3QaV^VoT_9Qy^|+Z7a`RQuon00003}mpEc>21s-(Z&&ak9Ar-&D5)jAeO^9|b;g<&`-f`Tb+#Ja;SB zJr!O0jb781&)K+5b>)5I<1?1rF#jm|(}GcH`j%PSg5$2mEREPY<+$q`uNohT*aSUe zLj%Q3qk;hMNm1K^OjN##RIME8iDEi)#Ij^++Z%0 zl`uQXy?=`0#1i$FA(!?#$9TSfwODywL-^uay@uQbISHe0QyVf9m@T$!x!0#z=ONzT zAQtdV=0Dp8c9pgt$LLp4a0L^K4t7X=AILo~HJwz=3Y z{td4E3r%gUO@Tv0ZP6kKZdpU(kJK_VuZH(|MPHvM_4RbYJ)LvD=jL$k>#CAyS2c<$ zOyD8L@e3cZfDd>_wp))U87P+$bBV3Qj}yzi`kh!$tR|keZ5V_;NPKRfZTs75EAc8Z z(g8Nsba7VT(b`RXNn9HMyWVvAXGm}#{(2DnCb4$`=+S4HN}@{K!ZI#*e2??$JMPq& zK~)Hu!xjbj|h9s_`6G3v)l!c+y-@N(We| z@lwyVN@)l0tHfWB{sboh~1a^UWU>2AF zYQQyc0$c$XU^DY`wMUF8`$|K3|F)c{rBsziWie|*FLXTxzU2V3R9DJMAqUKg^702@ zx0=d>GTZ}ZX#i+jugXyum`J%F5ZaxV)i!ujsRaV7RFsiOxdSG1YObGn2DW415@-Yj z7l4I!jt|oOgi6PGlyqJc0~KI2&|lZ%1LS#UKOu02GNj!8LraTN3Q)(rCe&VG$Ha^Kf#%s}2fl1#NUc8}zihtI zci>aXVS2Q@N%G@pN?STBq9U*dlz?fHI=DqiQ6R7+iK>#cQE5I~R z0ZPC%a01kT)Al?O0BVO3D(lLvQt#U8wpZm@Ia4N+4s=3Clw+ll0*u>dbjg-dOaN1f zynM?5jlbYrDRh7-C>P2{pU`h>DBGRjos7@_%ku@5K)D1)fg(^y%y72x0E~y=1TYWm z0uA6jC%6dA#mj9>*;ih2gyUV=?6J#UPWVyKLwO-^1C;v=M?Fklw*?&Z2?d}B7=YOv z+|wT5U>TU|6WRn0<4GHibpM(oaZgJ18#thB*zQ<)Rd}xqqAV$oIm_#pq)|%BRaDsj z*@Q$HRqm8#4o~B4^Cxj-rIs-ye>M89%24nJ zF!O*gBhwyRaiE}NiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0v7JzX3_ zEPA(2wdOlyAmB3JSJrVNa{*IUm&hF@_Oq-(0ZX2-TrpvZQEY5G#O7Eqf$5t^bmjM- zi*Ih7=n|907;-@B2E*zN8!>7USkxdUSUEGyxlCGq*=Rw}hE3W=s5-a`by$)?1yr1$Ts;@*T22 z2A@)8v0iZcn!?Q}tM3A*tjsp^{@Tv_@87JRDbJ1fG9NQt9iw?7@3-yVLcA-JBa;W;iuOQJk!1Bd(Y*bd!8nV_GrfN3{NnF zM;OK?*073YvfG-Tq(xpNz9se&XRTY}IB}SGnHajfco}#%@wT7Pe&)YAOngZ^9sqVP zv7PwU0eVq;iODwbyBk20_|vca{spkvj@KWg---80G>Hjp;m&~e=o%-OD*cvfDna#G z^94^aS`j>g#iG~zr6L%TKi^0oF5+D<(9Ut{yygZ?P7lbF83K{{E}Nn$^-loo4hl1^qi jqGzV-_=GoPzb*S5c*JiYxvSNB00000NkvXXu0mjffE2s+ literal 0 HcmV?d00001 diff --git a/target/classes/images/right2.png b/target/classes/images/right2.png new file mode 100644 index 0000000000000000000000000000000000000000..b20263cb53240105d48845c0a3bd16eb25a4f4e3 GIT binary patch literal 451 zcmV;!0X+VRP)UQ&c!gCg zVhX1?!~u56S>y5~4YHCrPh2K$8>htIL^rXSm>nD(1WqJ&6P*@VlWrb2SZ@KFOq?dJ zhk*9$cj8?W_*3G~h|qrcY9H9zkjH;YzYj+h#ZMvB5SYqZ$2e;wtgBzq4ibf0d@2 t$E({*%nuG$$xy}g1Ket}-4 zQqk%B1|bol7ZN%N1rnNN?Mm#jk78$KGP%BH_9Q2n%zN|PlXLHRZ=@2AC<3N{NnkGi z9tNI)8{iVy1@<8TQ3J`Ca;B7&*Wi*yz9@Ifs!~V_X<&!49>YF<0H(8|94mbRFzw3u zFBSfjZ*lb_Y4Aq8a~5bb-<1ocy$PMqQE8|xn~~B5Tm${zT#x@m4X6V51z-l~$O)_h z6<`aP1xMR}X`nL)v;v#}%i!(TU*#xAKg-H?NQjgY(4Dc`J75T`r-edBU^DhY&?fja z2YBK;p#U7xxF%U*9HOP5qAVy+IS%kO_LrWN3DKoIwqV*y%9_%d@QRj=bXh4Xi>)@H zs&b|DCc$}av!*;K1Bq6A!Lu5DSvgS#6NeXC`KPC;9_vMAB{0(eeoV_WM)?BR0S-db Z_X#HqYY67PcxnIu002ovPDHLkV1i~AyvP6m literal 0 HcmV?d00001 diff --git a/target/classes/images/up1.png b/target/classes/images/up1.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef859f6ed398d9936d8f1ef6fb4b3fefe82185c GIT binary patch literal 480 zcmV<60U!Q}P)sw;4@pgh;OMGf~_qWioMy>b81lZZcyE%Z9+G|)*Yw7_mI(_x<5UNBEZwi6o5UVxr z;anjooWVwo+gKB$8^&~O_S!6-2R>}Qy;(uOn0WS& z$I@>-i@%v5zZTd?9HbdXUBN#dRR>M)bVHS7#^qL*a0j=rj;rm9*P4I-6<(74F85C) Wu$}+!+$9(Q00005U}?Jv9XG}o85(M@mSp15Z$}#n(Kk5xO2|=&zTu`t|aDVCGj|M zuOrtaUL-yyw%hM{Mi+E5@jfw1j1%{d1 zh}#RmZY2&nZ|3hbO5FVg>~cNUzd~m^NSsfiXyXaaI(e*AmL_o#@37hf7)IDAc*N1< zeZ(m|EZD@E9>J$^tze@^=q#=@i9_x9ea2zI_nx6JDA@ZC;Jtz!OnZb*u~V>%Nsr(O zcALa1KHx%6;4io|^NOtnuC=U&E$e4@dzP4-06J+I^R~H`_+0&WS?IX-t}Qb9^~Ccf zuVq+!)_?N{IojY(Vn6XUG3_Xs*4%zuJ73TwS@5{cIo!Z?Y~gB6yu~ZL!D}+;>iz*r WF`O~bjAU~F0000+1;6JHpV2Ux#yhU+?m`zsI&*8%1ZZmR&b?k zD}$Z6&cbo!T6t84dZ2U4tCA>}%2W=_gmSNZgoceC@OG$GX()HfSQcDSK2yEV%1916 z8D5?qepil^I0dtoQJ5&3Iq*S%I#Y?V9$@0|PqU1=vYG;8WhY}2>9|uOlydm&yuw5| zQ+Acx9;nKTQbyTVzIqh*8+$P@3q%zA%tXo~Fjg@95GkL)K*4Y$25t&Q0d8X8^dI2U z7^nbm1)^_2B?hWMqd>R;R8b=3Txk}tew)FHezxj#*uH;->n*GObldzRUN?1UrQwot z5zdBw(IoViGGI{#m90K!UJpHO*Hcb4OG-_7^7ocV$4AK3TD9E;k(#q=qG4bWSOAuR k`H-jrhrkJN3?^CK-z?#f=xiF Date: Mon, 24 Mar 2025 15:08:50 +0700 Subject: [PATCH 05/15] =?UTF-8?q?=E2=9C=A8=20chore:=20add=20generated=20fi?= =?UTF-8?q?les=20for=20Board=20and=20Pacman=20classes=20and=20their=20test?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compile/default-compile/createdFiles.lst | 3 +++ .../compile/default-compile/inputFiles.lst | 2 ++ .../testCompile/default-testCompile/createdFiles.lst | 1 + .../testCompile/default-testCompile/inputFiles.lst | 1 + target/surefire-reports/2025-03-24T15-05-28_687.dumpstream | 5 +++++ 5 files changed, 12 insertions(+) create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 target/surefire-reports/2025-03-24T15-05-28_687.dumpstream diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e86af1a --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,3 @@ +com\zetcode\Board.class +com\zetcode\Board$TAdapter.class +com\zetcode\Pacman.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..6ebb16b --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,2 @@ +D:\Kuliah\KRS-KHS\Semester 6\Software Testing\P5\pacman\src\main\java\com\zetcode\Board.java +D:\Kuliah\KRS-KHS\Semester 6\Software Testing\P5\pacman\src\main\java\com\zetcode\Pacman.java diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..d6fbaf6 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1 @@ +com\zetcode\BoardTest.class diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..5b5b8b8 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +D:\Kuliah\KRS-KHS\Semester 6\Software Testing\P5\pacman\src\test\java\com\zetcode\BoardTest.java diff --git a/target/surefire-reports/2025-03-24T15-05-28_687.dumpstream b/target/surefire-reports/2025-03-24T15-05-28_687.dumpstream new file mode 100644 index 0000000..51dc072 --- /dev/null +++ b/target/surefire-reports/2025-03-24T15-05-28_687.dumpstream @@ -0,0 +1,5 @@ +# Created at 2025-03-24T15:05:28.972 +Boot Manifest-JAR contains absolute paths in classpath 'D:\Kuliah\KRS-KHS\Semester 6\Software Testing\P5\pacman\target\test-classes' +Hint: -Djdk.net.URLClassPath.disableClassPathURLCheck=true +'other' has different root + From 6e08d52b68f2ced388d8a6f4c8c02bdaaec54852 Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:08:59 +0700 Subject: [PATCH 06/15] =?UTF-8?q?=E2=9C=A8=20chore:=20add=20test=20report?= =?UTF-8?q?=20for=20BoardTest=20class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- target/surefire-reports/com.zetcode.BoardTest.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 target/surefire-reports/com.zetcode.BoardTest.txt diff --git a/target/surefire-reports/com.zetcode.BoardTest.txt b/target/surefire-reports/com.zetcode.BoardTest.txt new file mode 100644 index 0000000..6492ed3 --- /dev/null +++ b/target/surefire-reports/com.zetcode.BoardTest.txt @@ -0,0 +1,4 @@ +------------------------------------------------------------------------------- +Test set: com.zetcode.BoardTest +------------------------------------------------------------------------------- +Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.323 s -- in com.zetcode.BoardTest From 877c751468d961ee87d79caf6c890ce1d866a9e9 Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:09:12 +0700 Subject: [PATCH 07/15] =?UTF-8?q?=E2=9C=A8=20chore:=20add=20test=20report?= =?UTF-8?q?=20for=20BoardTest=20class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TEST-com.zetcode.BoardTest.xml | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 target/surefire-reports/TEST-com.zetcode.BoardTest.xml diff --git a/target/surefire-reports/TEST-com.zetcode.BoardTest.xml b/target/surefire-reports/TEST-com.zetcode.BoardTest.xml new file mode 100644 index 0000000..8f8497b --- /dev/null +++ b/target/surefire-reports/TEST-com.zetcode.BoardTest.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 769a083c694b420873c11677a5e036fecc7edcde Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:09:30 +0700 Subject: [PATCH 08/15] =?UTF-8?q?=F0=9F=94=A5=20feat:=20add=20compiled=20B?= =?UTF-8?q?oard=20class=20for=20testing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- target/classes/com/zetcode/Board.class | Bin 0 -> 14414 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 target/classes/com/zetcode/Board.class diff --git a/target/classes/com/zetcode/Board.class b/target/classes/com/zetcode/Board.class new file mode 100644 index 0000000000000000000000000000000000000000..9111c1ae43bf846d215de4c60b8c5fba82a862e6 GIT binary patch literal 14414 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 Date: Mon, 24 Mar 2025 15:09:47 +0700 Subject: [PATCH 09/15] =?UTF-8?q?=F0=9F=94=A5=20feat:=20add=20Board$TAdapt?= =?UTF-8?q?er=20class=20binary=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- target/classes/com/zetcode/Board$TAdapter.class | Bin 0 -> 1556 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 target/classes/com/zetcode/Board$TAdapter.class diff --git a/target/classes/com/zetcode/Board$TAdapter.class b/target/classes/com/zetcode/Board$TAdapter.class new file mode 100644 index 0000000000000000000000000000000000000000..8e78a05b814de528d8fa8597c43d65a7105727c1 GIT binary patch literal 1556 zcmZ`&OK%fb6#nk96UUPw9+M^{W|~Jyz;-BO61Rv3Xdz8n6H`?r3KANG7Lf>grJTlGz-LX#RcoK^m4^HX`L$C?%cri$vJz`ldeFs_r6maNC~uO8{9@U zv>+UUrlS?QK=%jsvTfNbo+X!M!LugiYCX>}r{H)e1OoBIjD|KuLNIhhv0GqIW8An( zAfR289%mV2WPW5u!wcvLp;N~mbO}ToFma5X%gGXBPBH4v_%^T;=T(}Rj=eDJ{)bb; z3}rk2Ov10*qoa3gz;J3<<>}Y)686>ejHtTt?eZkDs?keUX~ijAw5FW}=`w|b*dM|H z9dRVMp#~3uuv0p_R48za&w&qqNXJ3ETrZm15&U`8?I0{2DWy@c4y6JeD9o7o4H$1&b_R=jYWBh*jxvoUDA zjyEc~#C7&j*&h$x!LH-UTM(OQU&B4q7%ZbpooN%@=hP;!i5Jgp;J#@bsG5S$nSL^j z{Z$h?SE4vvMO`(G`12+XSEhN>*jt8Ksoi%618ay>>m}KoHI4Q%CbpW5+TqX!4%QBb zH_&SurFDc&W2%gHW#Ae~AN?lMiluyV#tKIk>OQiu*CCz8u%Zm4OMRd literal 0 HcmV?d00001 From e70a56735c5c5d17dd44cd78c59039a97b338b07 Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:09:57 +0700 Subject: [PATCH 10/15] =?UTF-8?q?=F0=9F=94=A5=20feat:=20add=20compiled=20P?= =?UTF-8?q?acman=20class=20for=20testing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- target/classes/com/zetcode/Pacman.class | Bin 0 -> 1554 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 target/classes/com/zetcode/Pacman.class diff --git a/target/classes/com/zetcode/Pacman.class b/target/classes/com/zetcode/Pacman.class new file mode 100644 index 0000000000000000000000000000000000000000..898d880493b0ac479ce1d766d61f4ad4696765f8 GIT binary patch literal 1554 zcma)6Yje{^6g?Xo%TYEj=K+KeC{2hh9;O9KTT>n}q;X;(iH#ZH)5cyvAZtC+I)O}o zQ)l|cbYP}Gpwr*Pa97e0Wymm5X*MC`FUkyZ8GURT$zN>FBWQwJhjXZ`e*c>BKLR)pq`%<@6N0v85yDNN3F!7IT z7DgE+(*Y|=1RWb383QxHF^K}ficW{YDb@{nS?uX@RdsvHm%gr)jvCBknn+?c12oHV z948p^q0~)Rd!%_LLGuI^($E3bQz^A9%rTrw*Z9QsJ8G}0{7?&DhX!q)<1`i+P7vBX z`9kzPUG-EbAN6D)w5zDVY_S$QahBsdoMW&kw&Cs*@v&kpnOo#o!g-QHb9L2@Qn#f? z?XGMphT}&U+$zw@6gf(8$eN%}bhE|8hNznDzVC}2PgZPP#3c)tIm)=gF!ja0`@3Y_ zR$ul>&xq^qsyDJOvBX7wvKWSFj}H$c2*6~gKYH>&J;yugRoiRMM{lCr0cm}VID zM0ckn77fNCRX!x&lH!Ky2W`3P8bu>9(Pd)^!^DbGI@E#aJ&^j9>V)Gt+_$lc-z}_h z)UeKQE^;rD5j$3{MNbuGE`;ukv+?sgXm8 z&38SS4*&m?G3B>&)4M1^t_sg;T%#@bLjl!=?*ea7Ib`&qyJCTt5D0R9d_P>(P#Zdogv(y{}?i6f)Yk3 znd4{b@i-X2;MXXQZl?rDQnUeDc0PhXeUGsL#-BKasR3r3+yJMXN%qGi`*VOZ4jbV6 z1DZL4044~!K<^aYG1H`W2In!GqFhcWhe`3xgz^Tpk@gQ*2L8r{15k6}0&}GMObTQe zzu^{f*~a+< Date: Mon, 24 Mar 2025 15:10:02 +0700 Subject: [PATCH 11/15] =?UTF-8?q?=F0=9F=94=A5=20feat:=20add=20unit=20tests?= =?UTF-8?q?=20for=20Board=20class=20movement=20and=20game=20mechanics?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/com/zetcode/BoardTest.java | 182 +++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 src/test/java/com/zetcode/BoardTest.java diff --git a/src/test/java/com/zetcode/BoardTest.java b/src/test/java/com/zetcode/BoardTest.java new file mode 100644 index 0000000..a5a21c1 --- /dev/null +++ b/src/test/java/com/zetcode/BoardTest.java @@ -0,0 +1,182 @@ +package com.zetcode; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class BoardTest { + + /** + * Skenario Unit Testing by @MFarhanZ1 // M. Farhan Aulia Pratama + * List skenario pengujian yang dilakukan: + - [TEST: 01] Menguji Movement Pacman Berhasil Bergerak ke Atas + - [TEST: 02] Menguji Movement Pacman Berhasil Bergerak ke Bawah + - [TEST: 03] Menguji Movement Pacman Berhasil Bergerak ke Kiri + - [TEST: 04] Menguji Movement Pacman Berhasil Bergerak ke Kanan + - [TEST: 05] Menguji apakah berhasil Pacman Nyawa-nya Berkurang ketika mati pertama kali + - [TEST: 06] Menguji apakah game terhenti saat pacman mati dengan kondisi nyawa habis + - [TEST: 07] Menguji apakah setelah semua dot dimakan, score berhasil bertambah + - [TEST: 08] Menguji apakah setelah semua dot dimakan, lanjut ke level berikutnya ditandai dengan jumlah ghost bertambah + */ + + private Board board; + + @BeforeEach + public void setUp() { + this.board = new Board(); + } + + @Test + @DisplayName("[TEST: 04] Menguji Movement Pacman Berhasil Bergerak ke Kanan") + public void testMovePacmanKeKanan() { + System.out.println("[TEST: 04] Menguji Movement Pacman Berhasil Bergerak ke Kanan"); + + // Menginisialisasi variabel dan memindahkan Pacman + board.initVariables(); + board.initLevel(); + + // Simulasikan pergerakan Pacman ke kanan + board.setReq_dx(1); + board.setReq_dy(0); + board.movePacman(); + + // Tambahkan assertion agar hasil tes dapat dicek + assertEquals(7 * 24 + 6, board.getPacman_x(), "Koordinat x Pacman tidak bertambah 6, yang menandakan tidak gerak ke kanan"); + assertEquals(11 * 24, board.getPacman_y(), "Koordinat y Pacman tidak tetap, malah berubah"); + } + + @Test + @DisplayName("[TEST: 03] Menguji Movement Pacman Berhasil Bergerak ke Kiri") + public void testMovePacmanKeKiri() { + System.out.println("[TEST: 03] Menguji Movement Pacman Berhasil Bergerak ke Kiri"); + + // Menginisialisasi variabel dan memindahkan Pacman + board.initVariables(); + board.initLevel(); + + // Simulasikan pergerakan Pacman ke kiri + board.setReq_dx(-1); + board.setReq_dy(0); + board.movePacman(); + + // Tambahkan assertion agar hasil tes dapat dicek + assertEquals(7 * 24 - 6, board.getPacman_x(), "Koordinat x Pacman tidak berkurang 6, yang menandakan tidak gerak ke kiri"); + assertEquals(11 * 24, board.getPacman_y(), "Koordinat y Pacman tidak tetap, malah berubah"); + } + + @Test + @DisplayName("[TEST: 02] Menguji Movement Pacman Berhasil Bergerak ke Bawah") + public void testMovePacmanKeBawah() { + System.out.println("[TEST: 02] Menguji Movement Pacman Berhasil Bergerak ke Bawah"); + + // Menginisialisasi variabel dan memindahkan Pacman + board.initVariables(); + board.initLevel(); + + // Simulasikan pergerakan Pacman ke bawah + board.setReq_dx(0); + board.setReq_dy(-1); + board.movePacman(); + + // Tambahkan assertion agar hasil tes dapat dicek + assertEquals(7 * 24, board.getPacman_x(), "Koordinat x Pacman tidak tetap, malah berubah"); + assertEquals(11 * 24, board.getPacman_y(), "Koordinat y Pacman tidak berkurang 6, yang menandakan tidak gerak ke bawah"); + } + + @Test + @DisplayName("[TEST: 01] Menguji Movement Pacman Berhasil Bergerak ke Atas") + public void testMovePacmanKeAtas() { + System.out.println("[TEST: 01] Menguji Movement Pacman Berhasil Bergerak ke Atas"); + + // Menginisialisasi variabel dan memindahkan Pacman + board.initVariables(); + board.initLevel(); + + // Simulasikan pergerakan Pacman ke atas + board.setReq_dx(0); + board.setReq_dy(1); + board.movePacman(); + + // Tambahkan assertion agar hasil tes dapat dicek + assertEquals(7 * 24, board.getPacman_x(), "Koordinat x Pacman tidak tetap, malah berubah"); + assertEquals(11 * 24 + 6, board.getPacman_y(), "Koordinat y Pacman tidak bertambah 6, yang menandakan tidak gerak ke atas"); + } + + @Test + @DisplayName("[TEST: 06] Menguji apakah game terhenti saat pacman mati dengan kondisi nyawa habis") + public void testDeath() { + System.out.println("[TEST: 06] Menguji apakah game terhenti saat pacman mati dengan kondisi nyawa habis"); + + // Menginisialisasi variabel dan mensimulasikan kematian Pacman dengan nyawa habis + board.initVariables(); + board.initLevel(); + + // Memeriksa apakah game berakhir ketika nyawa habis + board.setPacsLeft(0); + board.death(); + assertFalse(board.isInGame()); + } + + @Test + @DisplayName("[TEST: 05] Menguji apakah berhasil Pacman Nyawa-nya Berkurang ketika mati pertama kali") + public void testNyawaBerkurang() { + System.out.println("[TEST: 05] Menguji apakah berhasil Pacman Nyawa-nya Berkurang ketika mati pertama kali"); + + // Menginisialisasi variabel dan mensimulasikan kematian Pacman pertama kali dan nyawanya berkurang + board.initVariables(); + board.initLevel(); + + int initialPacsLeft = board.getPacsLeft(); + board.death(); + + // Memeriksa apakah jumlah nyawa Pacman berkurang + assertEquals(initialPacsLeft - 1, board.getPacsLeft()); + } + + @Test + @DisplayName("[TEST: 07] Menguji apakah setelah semua dot dimakan, score berhasil bertambah") + public void testCheckMaze() { + System.out.println("[TEST: 07] Menguji apakah setelah semua dot dimakan, score berhasil bertambah"); + + // Menginisialisasi variabel dan memeriksa maze + board.initVariables(); + board.initLevel(); + + // Simulasikan semua dot telah dimakan + for (int i = 0; i < board.getScreenData().length; i++) { + board.getScreenData()[i] = (short) (board.getScreenData()[i] & 15); // Hapus dot + } + + // Panggil metode checkMaze + board.checkMaze(); + + // Memeriksa apakah score telah bertambah + assertEquals(50, board.getScore()); + } + + @Test + @DisplayName("[TEST: 08] Menguji apakah setelah semua dot dimakan, lanjut ke level berikutnya ditandai dengan jumlah ghost bertambah") + public void testNextLevelGhosts() { + System.out.println("[TEST: 08] Menguji apakah setelah semua dot dimakan, lanjut ke level berikutnya ditandai dengan jumlah ghost bertambah"); + + // Menginisialisasi variabel dan memeriksa maze + board.initVariables(); + board.initLevel(); + + int initialN_GHOSTS = board.getN_GHOSTS(); // Jumlah ghost awal sebelum dimakan semua dot + + // Simulasikan semua dot telah dimakan + for (int i = 0; i < board.getScreenData().length; i++) { + board.getScreenData()[i] = (short) (board.getScreenData()[i] & 15); // Hapus dot + } + + // Panggil metode checkMaze + board.checkMaze(); + + // Memeriksa apakah ghost berhasil bertambah saat semua dot dimakan + assertEquals(initialN_GHOSTS + 1, board.getN_GHOSTS()); // Jumlah ghost bertambah + } + +} From e8eebb3bdb11c434a4d1f785d07e879e7ade4b60 Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:10:37 +0700 Subject: [PATCH 12/15] =?UTF-8?q?=E2=9C=A8=20chore:=20update=20documentati?= =?UTF-8?q?on=20for=20Board=20and=20Pacman=20classes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/zetcode/Board.java | 675 +++++++++++++++++++++++++++ 1 file changed, 675 insertions(+) create mode 100644 src/main/java/com/zetcode/Board.java diff --git a/src/main/java/com/zetcode/Board.java b/src/main/java/com/zetcode/Board.java new file mode 100644 index 0000000..3841d55 --- /dev/null +++ b/src/main/java/com/zetcode/Board.java @@ -0,0 +1,675 @@ +package com.zetcode; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Event; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; + +import javax.swing.ImageIcon; +import javax.swing.JPanel; +import javax.swing.Timer; + +public class Board extends JPanel implements ActionListener { + + private Dimension d; + private final Font smallFont = new Font("Helvetica", Font.BOLD, 14); + + private Image ii; + private final Color dotColor = new Color(192, 192, 0); + private Color mazeColor; + + private boolean inGame = false; + private boolean dying = false; + + private final int BLOCK_SIZE = 24; + private final int N_BLOCKS = 15; + private final int SCREEN_SIZE = N_BLOCKS * BLOCK_SIZE; + private final int PAC_ANIM_DELAY = 2; + private final int PACMAN_ANIM_COUNT = 4; + private final int MAX_GHOSTS = 12; + private final int PACMAN_SPEED = 6; + + private int pacAnimCount = PAC_ANIM_DELAY; + private int pacAnimDir = 1; + private int pacmanAnimPos = 0; + private int N_GHOSTS = 6; + private int pacsLeft, score; + private int[] dx, dy; + private int[] ghost_x, ghost_y, ghost_dx, ghost_dy, ghostSpeed; + + private Image ghost; + private Image pacman1, pacman2up, pacman2left, pacman2right, pacman2down; + private Image pacman3up, pacman3down, pacman3left, pacman3right; + private Image pacman4up, pacman4down, pacman4left, pacman4right; + + private int pacman_x, pacman_y, pacmand_x, pacmand_y; + private int req_dx, req_dy, view_dx, view_dy; + + private final short levelData[] = { + 19, 26, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 22, + 21, 0, 0, 0, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, + 21, 0, 0, 0, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, + 21, 0, 0, 0, 17, 16, 16, 24, 16, 16, 16, 16, 16, 16, 20, + 17, 18, 18, 18, 16, 16, 20, 0, 17, 16, 16, 16, 16, 16, 20, + 17, 16, 16, 16, 16, 16, 20, 0, 17, 16, 16, 16, 16, 24, 20, + 25, 16, 16, 16, 24, 24, 28, 0, 25, 24, 24, 16, 20, 0, 21, + 1, 17, 16, 20, 0, 0, 0, 0, 0, 0, 0, 17, 20, 0, 21, + 1, 17, 16, 16, 18, 18, 22, 0, 19, 18, 18, 16, 20, 0, 21, + 1, 17, 16, 16, 16, 16, 20, 0, 17, 16, 16, 16, 20, 0, 21, + 1, 17, 16, 16, 16, 16, 20, 0, 17, 16, 16, 16, 20, 0, 21, + 1, 17, 16, 16, 16, 16, 16, 18, 16, 16, 16, 16, 20, 0, 21, + 1, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, 0, 21, + 1, 25, 24, 24, 24, 24, 24, 24, 24, 24, 16, 16, 16, 18, 20, + 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 25, 24, 24, 24, 28 + }; + + private final int validSpeeds[] = {1, 2, 3, 4, 6, 8}; + private final int maxSpeed = 6; + + private int currentSpeed = 3; + private short[] screenData; + private Timer timer; + + public short[] getScreenData() { + return screenData; + } + + public Color getMazeColor() { + return mazeColor; + } + + public Dimension getD() { + return d; + } + + public int getPacman_x() { + return pacman_x; + } + + public int getPacman_y() { + return pacman_y; + } + + public int getPacsLeft() { + return pacsLeft; + } + + public int getScore() { + return score; + } + + public int getN_GHOSTS() { + return N_GHOSTS; + } + + public boolean isInGame() { + return inGame; + } + + public void setReq_dx(int req_dx) { + this.req_dx = req_dx; + } + + public void setReq_dy(int req_dy) { + this.req_dy = req_dy; + } + + public void setPacsLeft(int pacsLeft) { + this.pacsLeft = pacsLeft; + } + + public Board() { + + loadImages(); + initVariables(); + initBoard(); + } + + private void initBoard() { + + addKeyListener(new TAdapter()); + + setFocusable(true); + + setBackground(Color.black); + } + + protected void initVariables() { + + screenData = new short[N_BLOCKS * N_BLOCKS]; + mazeColor = new Color(5, 100, 5); + d = new Dimension(400, 400); + ghost_x = new int[MAX_GHOSTS]; + ghost_dx = new int[MAX_GHOSTS]; + ghost_y = new int[MAX_GHOSTS]; + ghost_dy = new int[MAX_GHOSTS]; + ghostSpeed = new int[MAX_GHOSTS]; + dx = new int[4]; + dy = new int[4]; + + timer = new Timer(40, this); + timer.start(); + } + + @Override + public void addNotify() { + super.addNotify(); + + initGame(); + } + + private void doAnim() { + + pacAnimCount--; + + if (pacAnimCount <= 0) { + pacAnimCount = PAC_ANIM_DELAY; + pacmanAnimPos = pacmanAnimPos + pacAnimDir; + + if (pacmanAnimPos == (PACMAN_ANIM_COUNT - 1) || pacmanAnimPos == 0) { + pacAnimDir = -pacAnimDir; + } + } + } + + private void playGame(Graphics2D g2d) { + + if (dying) { + + death(); + + } else { + + movePacman(); + drawPacman(g2d); + moveGhosts(g2d); + checkMaze(); + } + } + + private void showIntroScreen(Graphics2D g2d) { + + g2d.setColor(new Color(0, 32, 48)); + g2d.fillRect(50, SCREEN_SIZE / 2 - 30, SCREEN_SIZE - 100, 50); + g2d.setColor(Color.white); + g2d.drawRect(50, SCREEN_SIZE / 2 - 30, SCREEN_SIZE - 100, 50); + + String s = "Press s to start."; + Font small = new Font("Helvetica", Font.BOLD, 14); + FontMetrics metr = this.getFontMetrics(small); + + g2d.setColor(Color.white); + g2d.setFont(small); + g2d.drawString(s, (SCREEN_SIZE - metr.stringWidth(s)) / 2, SCREEN_SIZE / 2); + } + + private void drawScore(Graphics2D g) { + + int i; + String s; + + g.setFont(smallFont); + g.setColor(new Color(96, 128, 255)); + s = "Score: " + score; + g.drawString(s, SCREEN_SIZE / 2 + 96, SCREEN_SIZE + 16); + + for (i = 0; i < pacsLeft; i++) { + g.drawImage(pacman3left, i * 28 + 8, SCREEN_SIZE + 1, this); + } + } + + protected void checkMaze() { + + short i = 0; + boolean finished = true; + + while (i < N_BLOCKS * N_BLOCKS && finished) { + + if ((screenData[i] & 48) != 0) { + finished = false; + } + + i++; + } + + if (finished) { + + score += 50; + + if (N_GHOSTS < MAX_GHOSTS) { + N_GHOSTS++; + } + + if (currentSpeed < maxSpeed) { + currentSpeed++; + } + + initLevel(); + } + } + + protected void death() { + + pacsLeft--; + + if (pacsLeft == 0) { + inGame = false; + } + + continueLevel(); + } + + private void moveGhosts(Graphics2D g2d) { + + short i; + int pos; + int count; + + for (i = 0; i < N_GHOSTS; i++) { + if (ghost_x[i] % BLOCK_SIZE == 0 && ghost_y[i] % BLOCK_SIZE == 0) { + pos = ghost_x[i] / BLOCK_SIZE + N_BLOCKS * (int) (ghost_y[i] / BLOCK_SIZE); + + count = 0; + + if ((screenData[pos] & 1) == 0 && ghost_dx[i] != 1) { + dx[count] = -1; + dy[count] = 0; + count++; + } + + if ((screenData[pos] & 2) == 0 && ghost_dy[i] != 1) { + dx[count] = 0; + dy[count] = -1; + count++; + } + + if ((screenData[pos] & 4) == 0 && ghost_dx[i] != -1) { + dx[count] = 1; + dy[count] = 0; + count++; + } + + if ((screenData[pos] & 8) == 0 && ghost_dy[i] != -1) { + dx[count] = 0; + dy[count] = 1; + count++; + } + + if (count == 0) { + + if ((screenData[pos] & 15) == 15) { + ghost_dx[i] = 0; + ghost_dy[i] = 0; + } else { + ghost_dx[i] = -ghost_dx[i]; + ghost_dy[i] = -ghost_dy[i]; + } + + } else { + + count = (int) (Math.random() * count); + + if (count > 3) { + count = 3; + } + + ghost_dx[i] = dx[count]; + ghost_dy[i] = dy[count]; + } + + } + + ghost_x[i] = ghost_x[i] + (ghost_dx[i] * ghostSpeed[i]); + ghost_y[i] = ghost_y[i] + (ghost_dy[i] * ghostSpeed[i]); + drawGhost(g2d, ghost_x[i] + 1, ghost_y[i] + 1); + + if (pacman_x > (ghost_x[i] - 12) && pacman_x < (ghost_x[i] + 12) + && pacman_y > (ghost_y[i] - 12) && pacman_y < (ghost_y[i] + 12) + && inGame) { + + dying = true; + } + } + } + + private void drawGhost(Graphics2D g2d, int x, int y) { + + g2d.drawImage(ghost, x, y, this); + } + + protected void movePacman() { + + int pos; + short ch; + + if (req_dx == -pacmand_x && req_dy == -pacmand_y) { + pacmand_x = req_dx; + pacmand_y = req_dy; + view_dx = pacmand_x; + view_dy = pacmand_y; + } + + if (pacman_x % BLOCK_SIZE == 0 && pacman_y % BLOCK_SIZE == 0) { + pos = pacman_x / BLOCK_SIZE + N_BLOCKS * (int) (pacman_y / BLOCK_SIZE); + ch = screenData[pos]; + + if ((ch & 16) != 0) { + screenData[pos] = (short) (ch & 15); + score++; + } + + if (req_dx != 0 || req_dy != 0) { + if (!((req_dx == -1 && req_dy == 0 && (ch & 1) != 0) + || (req_dx == 1 && req_dy == 0 && (ch & 4) != 0) + || (req_dx == 0 && req_dy == -1 && (ch & 2) != 0) + || (req_dx == 0 && req_dy == 1 && (ch & 8) != 0))) { + pacmand_x = req_dx; + pacmand_y = req_dy; + view_dx = pacmand_x; + view_dy = pacmand_y; + } + } + + // Check for standstill + if ((pacmand_x == -1 && pacmand_y == 0 && (ch & 1) != 0) + || (pacmand_x == 1 && pacmand_y == 0 && (ch & 4) != 0) + || (pacmand_x == 0 && pacmand_y == -1 && (ch & 2) != 0) + || (pacmand_x == 0 && pacmand_y == 1 && (ch & 8) != 0)) { + pacmand_x = 0; + pacmand_y = 0; + } + } + pacman_x = pacman_x + PACMAN_SPEED * pacmand_x; + pacman_y = pacman_y + PACMAN_SPEED * pacmand_y; + } + + private void drawPacman(Graphics2D g2d) { + + if (view_dx == -1) { + drawPacnanLeft(g2d); + } else if (view_dx == 1) { + drawPacmanRight(g2d); + } else if (view_dy == -1) { + drawPacmanUp(g2d); + } else { + drawPacmanDown(g2d); + } + } + + private void drawPacmanUp(Graphics2D g2d) { + + switch (pacmanAnimPos) { + case 1: + g2d.drawImage(pacman2up, pacman_x + 1, pacman_y + 1, this); + break; + case 2: + g2d.drawImage(pacman3up, pacman_x + 1, pacman_y + 1, this); + break; + case 3: + g2d.drawImage(pacman4up, pacman_x + 1, pacman_y + 1, this); + break; + default: + g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); + break; + } + } + + private void drawPacmanDown(Graphics2D g2d) { + + switch (pacmanAnimPos) { + case 1: + g2d.drawImage(pacman2down, pacman_x + 1, pacman_y + 1, this); + break; + case 2: + g2d.drawImage(pacman3down, pacman_x + 1, pacman_y + 1, this); + break; + case 3: + g2d.drawImage(pacman4down, pacman_x + 1, pacman_y + 1, this); + break; + default: + g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); + break; + } + } + + private void drawPacnanLeft(Graphics2D g2d) { + + switch (pacmanAnimPos) { + case 1: + g2d.drawImage(pacman2left, pacman_x + 1, pacman_y + 1, this); + break; + case 2: + g2d.drawImage(pacman3left, pacman_x + 1, pacman_y + 1, this); + break; + case 3: + g2d.drawImage(pacman4left, pacman_x + 1, pacman_y + 1, this); + break; + default: + g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); + break; + } + } + + private void drawPacmanRight(Graphics2D g2d) { + + switch (pacmanAnimPos) { + case 1: + g2d.drawImage(pacman2right, pacman_x + 1, pacman_y + 1, this); + break; + case 2: + g2d.drawImage(pacman3right, pacman_x + 1, pacman_y + 1, this); + break; + case 3: + g2d.drawImage(pacman4right, pacman_x + 1, pacman_y + 1, this); + break; + default: + g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); + break; + } + } + + private void drawMaze(Graphics2D g2d) { + + short i = 0; + int x, y; + + for (y = 0; y < SCREEN_SIZE; y += BLOCK_SIZE) { + for (x = 0; x < SCREEN_SIZE; x += BLOCK_SIZE) { + + g2d.setColor(mazeColor); + g2d.setStroke(new BasicStroke(2)); + + if ((screenData[i] & 1) != 0) { + g2d.drawLine(x, y, x, y + BLOCK_SIZE - 1); + } + + if ((screenData[i] & 2) != 0) { + g2d.drawLine(x, y, x + BLOCK_SIZE - 1, y); + } + + if ((screenData[i] & 4) != 0) { + g2d.drawLine(x + BLOCK_SIZE - 1, y, x + BLOCK_SIZE - 1, + y + BLOCK_SIZE - 1); + } + + if ((screenData[i] & 8) != 0) { + g2d.drawLine(x, y + BLOCK_SIZE - 1, x + BLOCK_SIZE - 1, + y + BLOCK_SIZE - 1); + } + + if ((screenData[i] & 16) != 0) { + g2d.setColor(dotColor); + g2d.fillRect(x + 11, y + 11, 2, 2); + } + + i++; + } + } + } + + private void initGame() { + + pacsLeft = 3; + score = 0; + initLevel(); + N_GHOSTS = 6; + currentSpeed = 3; + } + + protected void initLevel() { + + int i; + for (i = 0; i < N_BLOCKS * N_BLOCKS; i++) { + screenData[i] = levelData[i]; + } + + continueLevel(); + } + + private void continueLevel() { + + short i; + int dx = 1; + int random; + + for (i = 0; i < N_GHOSTS; i++) { + + ghost_y[i] = 4 * BLOCK_SIZE; + ghost_x[i] = 4 * BLOCK_SIZE; + ghost_dy[i] = 0; + ghost_dx[i] = dx; + dx = -dx; + random = (int) (Math.random() * (currentSpeed + 1)); + + if (random > currentSpeed) { + random = currentSpeed; + } + + ghostSpeed[i] = validSpeeds[random]; + } + + pacman_x = 7 * BLOCK_SIZE; + pacman_y = 11 * BLOCK_SIZE; + pacmand_x = 0; + pacmand_y = 0; + req_dx = 0; + req_dy = 0; + view_dx = -1; + view_dy = 0; + dying = false; + } + + private void loadImages() { + + ghost = new ImageIcon(getClass().getClassLoader().getResource("images/ghost.png")).getImage(); + pacman1 = new ImageIcon(getClass().getClassLoader().getResource("images/pacman.png")).getImage(); + pacman2up = new ImageIcon(getClass().getClassLoader().getResource("images/up1.png")).getImage(); + pacman3up = new ImageIcon(getClass().getClassLoader().getResource("images/up2.png")).getImage(); + pacman4up = new ImageIcon(getClass().getClassLoader().getResource("images/up3.png")).getImage(); + pacman2down = new ImageIcon(getClass().getClassLoader().getResource("images/down1.png")).getImage(); + pacman3down = new ImageIcon(getClass().getClassLoader().getResource("images/down2.png")).getImage(); + pacman4down = new ImageIcon(getClass().getClassLoader().getResource("images/down3.png")).getImage(); + pacman2left = new ImageIcon(getClass().getClassLoader().getResource("images/left1.png")).getImage(); + pacman3left = new ImageIcon(getClass().getClassLoader().getResource("images/left2.png")).getImage(); + pacman4left = new ImageIcon(getClass().getClassLoader().getResource("images/left3.png")).getImage(); + pacman2right = new ImageIcon(getClass().getClassLoader().getResource("images/right1.png")).getImage(); + pacman3right = new ImageIcon(getClass().getClassLoader().getResource("images/right2.png")).getImage(); + pacman4right = new ImageIcon(getClass().getClassLoader().getResource("images/right3.png")).getImage(); + + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + + doDrawing(g); + } + + private void doDrawing(Graphics g) { + + Graphics2D g2d = (Graphics2D) g; + + g2d.setColor(Color.black); + g2d.fillRect(0, 0, d.width, d.height); + + drawMaze(g2d); + drawScore(g2d); + doAnim(); + + if (inGame) { + playGame(g2d); + } else { + showIntroScreen(g2d); + } + + g2d.drawImage(ii, 5, 5, this); + Toolkit.getDefaultToolkit().sync(); + g2d.dispose(); + } + + class TAdapter extends KeyAdapter { + + @Override + public void keyPressed(KeyEvent e) { + + int key = e.getKeyCode(); + + if (inGame) { + if (key == KeyEvent.VK_LEFT) { + req_dx = -1; + req_dy = 0; + } else if (key == KeyEvent.VK_RIGHT) { + req_dx = 1; + req_dy = 0; + } else if (key == KeyEvent.VK_UP) { + req_dx = 0; + req_dy = -1; + } else if (key == KeyEvent.VK_DOWN) { + req_dx = 0; + req_dy = 1; + } else if (key == KeyEvent.VK_ESCAPE && timer.isRunning()) { + inGame = false; + } else if (key == KeyEvent.VK_PAUSE) { + if (timer.isRunning()) { + timer.stop(); + } else { + timer.start(); + } + } + } else { + if (key == 's' || key == 'S') { + inGame = true; + initGame(); + } + } + } + + @Override + public void keyReleased(KeyEvent e) { + + int key = e.getKeyCode(); + + if (key == Event.LEFT || key == Event.RIGHT + || key == Event.UP || key == Event.DOWN) { + req_dx = 0; + req_dy = 0; + } + } + } + + @Override + public void actionPerformed(ActionEvent e) { + + repaint(); + } +} From 9a375386776d03f347267e54a9c1c4ee27ddbeb4 Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:10:45 +0700 Subject: [PATCH 13/15] =?UTF-8?q?=F0=9F=94=A5=20feat:=20implement=20Pacman?= =?UTF-8?q?=20class=20with=20basic=20UI=20setup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/zetcode/Pacman.java | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/com/zetcode/Pacman.java diff --git a/src/main/java/com/zetcode/Pacman.java b/src/main/java/com/zetcode/Pacman.java new file mode 100644 index 0000000..2793d38 --- /dev/null +++ b/src/main/java/com/zetcode/Pacman.java @@ -0,0 +1,32 @@ +package com.zetcode; + +import java.awt.EventQueue; + +import javax.swing.JFrame; + +public class Pacman extends JFrame { + + public Pacman() { + + initUI(); + } + + private void initUI() { + + add(new Board()); + + setTitle("Pacman"); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setSize(380, 430); + setLocationRelativeTo(null); + } + + public static void main(String[] args) { + + EventQueue.invokeLater(() -> { + + Pacman ex = new Pacman(); + ex.setVisible(true); + }); + } +} From 3cadf5069d1ca14d099a27ea4ae96564e991653f Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:17:37 +0700 Subject: [PATCH 14/15] =?UTF-8?q?=F0=9F=9B=A0=20refactor:=20remove=20Pacma?= =?UTF-8?q?n=20class=20as=20part=20of=20huge=20refactoring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/zetcode/Board.java | 627 ------------------------------------ src/com/zetcode/Pacman.java | 31 -- 2 files changed, 658 deletions(-) delete mode 100644 src/com/zetcode/Board.java delete mode 100644 src/com/zetcode/Pacman.java diff --git a/src/com/zetcode/Board.java b/src/com/zetcode/Board.java deleted file mode 100644 index 7d0018d..0000000 --- a/src/com/zetcode/Board.java +++ /dev/null @@ -1,627 +0,0 @@ -package com.zetcode; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Event; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; - -import javax.swing.ImageIcon; -import javax.swing.JPanel; -import javax.swing.Timer; - -public class Board extends JPanel implements ActionListener { - - private Dimension d; - private final Font smallFont = new Font("Helvetica", Font.BOLD, 14); - - private Image ii; - private final Color dotColor = new Color(192, 192, 0); - private Color mazeColor; - - private boolean inGame = false; - private boolean dying = false; - - private final int BLOCK_SIZE = 24; - private final int N_BLOCKS = 15; - private final int SCREEN_SIZE = N_BLOCKS * BLOCK_SIZE; - private final int PAC_ANIM_DELAY = 2; - private final int PACMAN_ANIM_COUNT = 4; - private final int MAX_GHOSTS = 12; - private final int PACMAN_SPEED = 6; - - private int pacAnimCount = PAC_ANIM_DELAY; - private int pacAnimDir = 1; - private int pacmanAnimPos = 0; - private int N_GHOSTS = 6; - private int pacsLeft, score; - private int[] dx, dy; - private int[] ghost_x, ghost_y, ghost_dx, ghost_dy, ghostSpeed; - - private Image ghost; - private Image pacman1, pacman2up, pacman2left, pacman2right, pacman2down; - private Image pacman3up, pacman3down, pacman3left, pacman3right; - private Image pacman4up, pacman4down, pacman4left, pacman4right; - - private int pacman_x, pacman_y, pacmand_x, pacmand_y; - private int req_dx, req_dy, view_dx, view_dy; - - private final short levelData[] = { - 19, 26, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 22, - 21, 0, 0, 0, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, - 21, 0, 0, 0, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, - 21, 0, 0, 0, 17, 16, 16, 24, 16, 16, 16, 16, 16, 16, 20, - 17, 18, 18, 18, 16, 16, 20, 0, 17, 16, 16, 16, 16, 16, 20, - 17, 16, 16, 16, 16, 16, 20, 0, 17, 16, 16, 16, 16, 24, 20, - 25, 16, 16, 16, 24, 24, 28, 0, 25, 24, 24, 16, 20, 0, 21, - 1, 17, 16, 20, 0, 0, 0, 0, 0, 0, 0, 17, 20, 0, 21, - 1, 17, 16, 16, 18, 18, 22, 0, 19, 18, 18, 16, 20, 0, 21, - 1, 17, 16, 16, 16, 16, 20, 0, 17, 16, 16, 16, 20, 0, 21, - 1, 17, 16, 16, 16, 16, 20, 0, 17, 16, 16, 16, 20, 0, 21, - 1, 17, 16, 16, 16, 16, 16, 18, 16, 16, 16, 16, 20, 0, 21, - 1, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, 0, 21, - 1, 25, 24, 24, 24, 24, 24, 24, 24, 24, 16, 16, 16, 18, 20, - 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 25, 24, 24, 24, 28 - }; - - private final int validSpeeds[] = {1, 2, 3, 4, 6, 8}; - private final int maxSpeed = 6; - - private int currentSpeed = 3; - private short[] screenData; - private Timer timer; - - public Board() { - - loadImages(); - initVariables(); - initBoard(); - } - - private void initBoard() { - - addKeyListener(new TAdapter()); - - setFocusable(true); - - setBackground(Color.black); - } - - private void initVariables() { - - screenData = new short[N_BLOCKS * N_BLOCKS]; - mazeColor = new Color(5, 100, 5); - d = new Dimension(400, 400); - ghost_x = new int[MAX_GHOSTS]; - ghost_dx = new int[MAX_GHOSTS]; - ghost_y = new int[MAX_GHOSTS]; - ghost_dy = new int[MAX_GHOSTS]; - ghostSpeed = new int[MAX_GHOSTS]; - dx = new int[4]; - dy = new int[4]; - - timer = new Timer(40, this); - timer.start(); - } - - @Override - public void addNotify() { - super.addNotify(); - - initGame(); - } - - private void doAnim() { - - pacAnimCount--; - - if (pacAnimCount <= 0) { - pacAnimCount = PAC_ANIM_DELAY; - pacmanAnimPos = pacmanAnimPos + pacAnimDir; - - if (pacmanAnimPos == (PACMAN_ANIM_COUNT - 1) || pacmanAnimPos == 0) { - pacAnimDir = -pacAnimDir; - } - } - } - - private void playGame(Graphics2D g2d) { - - if (dying) { - - death(); - - } else { - - movePacman(); - drawPacman(g2d); - moveGhosts(g2d); - checkMaze(); - } - } - - private void showIntroScreen(Graphics2D g2d) { - - g2d.setColor(new Color(0, 32, 48)); - g2d.fillRect(50, SCREEN_SIZE / 2 - 30, SCREEN_SIZE - 100, 50); - g2d.setColor(Color.white); - g2d.drawRect(50, SCREEN_SIZE / 2 - 30, SCREEN_SIZE - 100, 50); - - String s = "Press s to start."; - Font small = new Font("Helvetica", Font.BOLD, 14); - FontMetrics metr = this.getFontMetrics(small); - - g2d.setColor(Color.white); - g2d.setFont(small); - g2d.drawString(s, (SCREEN_SIZE - metr.stringWidth(s)) / 2, SCREEN_SIZE / 2); - } - - private void drawScore(Graphics2D g) { - - int i; - String s; - - g.setFont(smallFont); - g.setColor(new Color(96, 128, 255)); - s = "Score: " + score; - g.drawString(s, SCREEN_SIZE / 2 + 96, SCREEN_SIZE + 16); - - for (i = 0; i < pacsLeft; i++) { - g.drawImage(pacman3left, i * 28 + 8, SCREEN_SIZE + 1, this); - } - } - - private void checkMaze() { - - short i = 0; - boolean finished = true; - - while (i < N_BLOCKS * N_BLOCKS && finished) { - - if ((screenData[i] & 48) != 0) { - finished = false; - } - - i++; - } - - if (finished) { - - score += 50; - - if (N_GHOSTS < MAX_GHOSTS) { - N_GHOSTS++; - } - - if (currentSpeed < maxSpeed) { - currentSpeed++; - } - - initLevel(); - } - } - - private void death() { - - pacsLeft--; - - if (pacsLeft == 0) { - inGame = false; - } - - continueLevel(); - } - - private void moveGhosts(Graphics2D g2d) { - - short i; - int pos; - int count; - - for (i = 0; i < N_GHOSTS; i++) { - if (ghost_x[i] % BLOCK_SIZE == 0 && ghost_y[i] % BLOCK_SIZE == 0) { - pos = ghost_x[i] / BLOCK_SIZE + N_BLOCKS * (int) (ghost_y[i] / BLOCK_SIZE); - - count = 0; - - if ((screenData[pos] & 1) == 0 && ghost_dx[i] != 1) { - dx[count] = -1; - dy[count] = 0; - count++; - } - - if ((screenData[pos] & 2) == 0 && ghost_dy[i] != 1) { - dx[count] = 0; - dy[count] = -1; - count++; - } - - if ((screenData[pos] & 4) == 0 && ghost_dx[i] != -1) { - dx[count] = 1; - dy[count] = 0; - count++; - } - - if ((screenData[pos] & 8) == 0 && ghost_dy[i] != -1) { - dx[count] = 0; - dy[count] = 1; - count++; - } - - if (count == 0) { - - if ((screenData[pos] & 15) == 15) { - ghost_dx[i] = 0; - ghost_dy[i] = 0; - } else { - ghost_dx[i] = -ghost_dx[i]; - ghost_dy[i] = -ghost_dy[i]; - } - - } else { - - count = (int) (Math.random() * count); - - if (count > 3) { - count = 3; - } - - ghost_dx[i] = dx[count]; - ghost_dy[i] = dy[count]; - } - - } - - ghost_x[i] = ghost_x[i] + (ghost_dx[i] * ghostSpeed[i]); - ghost_y[i] = ghost_y[i] + (ghost_dy[i] * ghostSpeed[i]); - drawGhost(g2d, ghost_x[i] + 1, ghost_y[i] + 1); - - if (pacman_x > (ghost_x[i] - 12) && pacman_x < (ghost_x[i] + 12) - && pacman_y > (ghost_y[i] - 12) && pacman_y < (ghost_y[i] + 12) - && inGame) { - - dying = true; - } - } - } - - private void drawGhost(Graphics2D g2d, int x, int y) { - - g2d.drawImage(ghost, x, y, this); - } - - private void movePacman() { - - int pos; - short ch; - - if (req_dx == -pacmand_x && req_dy == -pacmand_y) { - pacmand_x = req_dx; - pacmand_y = req_dy; - view_dx = pacmand_x; - view_dy = pacmand_y; - } - - if (pacman_x % BLOCK_SIZE == 0 && pacman_y % BLOCK_SIZE == 0) { - pos = pacman_x / BLOCK_SIZE + N_BLOCKS * (int) (pacman_y / BLOCK_SIZE); - ch = screenData[pos]; - - if ((ch & 16) != 0) { - screenData[pos] = (short) (ch & 15); - score++; - } - - if (req_dx != 0 || req_dy != 0) { - if (!((req_dx == -1 && req_dy == 0 && (ch & 1) != 0) - || (req_dx == 1 && req_dy == 0 && (ch & 4) != 0) - || (req_dx == 0 && req_dy == -1 && (ch & 2) != 0) - || (req_dx == 0 && req_dy == 1 && (ch & 8) != 0))) { - pacmand_x = req_dx; - pacmand_y = req_dy; - view_dx = pacmand_x; - view_dy = pacmand_y; - } - } - - // Check for standstill - if ((pacmand_x == -1 && pacmand_y == 0 && (ch & 1) != 0) - || (pacmand_x == 1 && pacmand_y == 0 && (ch & 4) != 0) - || (pacmand_x == 0 && pacmand_y == -1 && (ch & 2) != 0) - || (pacmand_x == 0 && pacmand_y == 1 && (ch & 8) != 0)) { - pacmand_x = 0; - pacmand_y = 0; - } - } - pacman_x = pacman_x + PACMAN_SPEED * pacmand_x; - pacman_y = pacman_y + PACMAN_SPEED * pacmand_y; - } - - private void drawPacman(Graphics2D g2d) { - - if (view_dx == -1) { - drawPacnanLeft(g2d); - } else if (view_dx == 1) { - drawPacmanRight(g2d); - } else if (view_dy == -1) { - drawPacmanUp(g2d); - } else { - drawPacmanDown(g2d); - } - } - - private void drawPacmanUp(Graphics2D g2d) { - - switch (pacmanAnimPos) { - case 1: - g2d.drawImage(pacman2up, pacman_x + 1, pacman_y + 1, this); - break; - case 2: - g2d.drawImage(pacman3up, pacman_x + 1, pacman_y + 1, this); - break; - case 3: - g2d.drawImage(pacman4up, pacman_x + 1, pacman_y + 1, this); - break; - default: - g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); - break; - } - } - - private void drawPacmanDown(Graphics2D g2d) { - - switch (pacmanAnimPos) { - case 1: - g2d.drawImage(pacman2down, pacman_x + 1, pacman_y + 1, this); - break; - case 2: - g2d.drawImage(pacman3down, pacman_x + 1, pacman_y + 1, this); - break; - case 3: - g2d.drawImage(pacman4down, pacman_x + 1, pacman_y + 1, this); - break; - default: - g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); - break; - } - } - - private void drawPacnanLeft(Graphics2D g2d) { - - switch (pacmanAnimPos) { - case 1: - g2d.drawImage(pacman2left, pacman_x + 1, pacman_y + 1, this); - break; - case 2: - g2d.drawImage(pacman3left, pacman_x + 1, pacman_y + 1, this); - break; - case 3: - g2d.drawImage(pacman4left, pacman_x + 1, pacman_y + 1, this); - break; - default: - g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); - break; - } - } - - private void drawPacmanRight(Graphics2D g2d) { - - switch (pacmanAnimPos) { - case 1: - g2d.drawImage(pacman2right, pacman_x + 1, pacman_y + 1, this); - break; - case 2: - g2d.drawImage(pacman3right, pacman_x + 1, pacman_y + 1, this); - break; - case 3: - g2d.drawImage(pacman4right, pacman_x + 1, pacman_y + 1, this); - break; - default: - g2d.drawImage(pacman1, pacman_x + 1, pacman_y + 1, this); - break; - } - } - - private void drawMaze(Graphics2D g2d) { - - short i = 0; - int x, y; - - for (y = 0; y < SCREEN_SIZE; y += BLOCK_SIZE) { - for (x = 0; x < SCREEN_SIZE; x += BLOCK_SIZE) { - - g2d.setColor(mazeColor); - g2d.setStroke(new BasicStroke(2)); - - if ((screenData[i] & 1) != 0) { - g2d.drawLine(x, y, x, y + BLOCK_SIZE - 1); - } - - if ((screenData[i] & 2) != 0) { - g2d.drawLine(x, y, x + BLOCK_SIZE - 1, y); - } - - if ((screenData[i] & 4) != 0) { - g2d.drawLine(x + BLOCK_SIZE - 1, y, x + BLOCK_SIZE - 1, - y + BLOCK_SIZE - 1); - } - - if ((screenData[i] & 8) != 0) { - g2d.drawLine(x, y + BLOCK_SIZE - 1, x + BLOCK_SIZE - 1, - y + BLOCK_SIZE - 1); - } - - if ((screenData[i] & 16) != 0) { - g2d.setColor(dotColor); - g2d.fillRect(x + 11, y + 11, 2, 2); - } - - i++; - } - } - } - - private void initGame() { - - pacsLeft = 3; - score = 0; - initLevel(); - N_GHOSTS = 6; - currentSpeed = 3; - } - - private void initLevel() { - - int i; - for (i = 0; i < N_BLOCKS * N_BLOCKS; i++) { - screenData[i] = levelData[i]; - } - - continueLevel(); - } - - private void continueLevel() { - - short i; - int dx = 1; - int random; - - for (i = 0; i < N_GHOSTS; i++) { - - ghost_y[i] = 4 * BLOCK_SIZE; - ghost_x[i] = 4 * BLOCK_SIZE; - ghost_dy[i] = 0; - ghost_dx[i] = dx; - dx = -dx; - random = (int) (Math.random() * (currentSpeed + 1)); - - if (random > currentSpeed) { - random = currentSpeed; - } - - ghostSpeed[i] = validSpeeds[random]; - } - - pacman_x = 7 * BLOCK_SIZE; - pacman_y = 11 * BLOCK_SIZE; - pacmand_x = 0; - pacmand_y = 0; - req_dx = 0; - req_dy = 0; - view_dx = -1; - view_dy = 0; - dying = false; - } - - private void loadImages() { - - ghost = new ImageIcon("src/resources/images/ghost.png").getImage(); - pacman1 = new ImageIcon("src/resources/images/pacman.png").getImage(); - pacman2up = new ImageIcon("src/resources/images/up1.png").getImage(); - pacman3up = new ImageIcon("src/resources/images/up2.png").getImage(); - pacman4up = new ImageIcon("src/resources/images/up3.png").getImage(); - pacman2down = new ImageIcon("src/resources/images/down1.png").getImage(); - pacman3down = new ImageIcon("src/resources/images/down2.png").getImage(); - pacman4down = new ImageIcon("src/resources/images/down3.png").getImage(); - pacman2left = new ImageIcon("src/resources/images/left1.png").getImage(); - pacman3left = new ImageIcon("src/resources/images/left2.png").getImage(); - pacman4left = new ImageIcon("src/resources/images/left3.png").getImage(); - pacman2right = new ImageIcon("src/resources/images/right1.png").getImage(); - pacman3right = new ImageIcon("src/resources/images/right2.png").getImage(); - pacman4right = new ImageIcon("src/resources/images/right3.png").getImage(); - - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - - doDrawing(g); - } - - private void doDrawing(Graphics g) { - - Graphics2D g2d = (Graphics2D) g; - - g2d.setColor(Color.black); - g2d.fillRect(0, 0, d.width, d.height); - - drawMaze(g2d); - drawScore(g2d); - doAnim(); - - if (inGame) { - playGame(g2d); - } else { - showIntroScreen(g2d); - } - - g2d.drawImage(ii, 5, 5, this); - Toolkit.getDefaultToolkit().sync(); - g2d.dispose(); - } - - class TAdapter extends KeyAdapter { - - @Override - public void keyPressed(KeyEvent e) { - - int key = e.getKeyCode(); - - if (inGame) { - if (key == KeyEvent.VK_LEFT) { - req_dx = -1; - req_dy = 0; - } else if (key == KeyEvent.VK_RIGHT) { - req_dx = 1; - req_dy = 0; - } else if (key == KeyEvent.VK_UP) { - req_dx = 0; - req_dy = -1; - } else if (key == KeyEvent.VK_DOWN) { - req_dx = 0; - req_dy = 1; - } else if (key == KeyEvent.VK_ESCAPE && timer.isRunning()) { - inGame = false; - } else if (key == KeyEvent.VK_PAUSE) { - if (timer.isRunning()) { - timer.stop(); - } else { - timer.start(); - } - } - } else { - if (key == 's' || key == 'S') { - inGame = true; - initGame(); - } - } - } - - @Override - public void keyReleased(KeyEvent e) { - - int key = e.getKeyCode(); - - if (key == Event.LEFT || key == Event.RIGHT - || key == Event.UP || key == Event.DOWN) { - req_dx = 0; - req_dy = 0; - } - } - } - - @Override - public void actionPerformed(ActionEvent e) { - - repaint(); - } -} diff --git a/src/com/zetcode/Pacman.java b/src/com/zetcode/Pacman.java deleted file mode 100644 index 77b0508..0000000 --- a/src/com/zetcode/Pacman.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zetcode; - -import java.awt.EventQueue; -import javax.swing.JFrame; - -public class Pacman extends JFrame { - - public Pacman() { - - initUI(); - } - - private void initUI() { - - add(new Board()); - - setTitle("Pacman"); - setDefaultCloseOperation(EXIT_ON_CLOSE); - setSize(380, 420); - setLocationRelativeTo(null); - } - - public static void main(String[] args) { - - EventQueue.invokeLater(() -> { - - var ex = new Pacman(); - ex.setVisible(true); - }); - } -} From f1cd6e2e7c18f9f2363ce2a57880eaa432605505 Mon Sep 17 00:00:00 2001 From: MFarhanZ1 Date: Mon, 24 Mar 2025 15:18:38 +0700 Subject: [PATCH 15/15] =?UTF-8?q?=F0=9F=9B=A0=20refactor:=20refactor=20res?= =?UTF-8?q?ources=20folder=20image=20assets=20into=20more=20clean=20folder?= =?UTF-8?q?=20structures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/resources/images/down1.png | Bin 471 -> 0 bytes src/resources/images/down2.png | Bin 479 -> 0 bytes src/resources/images/down3.png | Bin 512 -> 0 bytes src/resources/images/file.txt | 1 - src/resources/images/ghost.png | Bin 416 -> 0 bytes src/resources/images/left1.png | Bin 459 -> 0 bytes src/resources/images/left2.png | Bin 460 -> 0 bytes src/resources/images/left3.png | Bin 480 -> 0 bytes src/resources/images/pacman.png | Bin 364 -> 0 bytes src/resources/images/right1.png | Bin 441 -> 0 bytes src/resources/images/right2.png | Bin 451 -> 0 bytes src/resources/images/right3.png | Bin 483 -> 0 bytes src/resources/images/up1.png | Bin 480 -> 0 bytes src/resources/images/up2.png | Bin 480 -> 0 bytes src/resources/images/up3.png | Bin 494 -> 0 bytes 15 files changed, 1 deletion(-) delete mode 100644 src/resources/images/down1.png delete mode 100644 src/resources/images/down2.png delete mode 100644 src/resources/images/down3.png delete mode 100644 src/resources/images/file.txt delete mode 100644 src/resources/images/ghost.png delete mode 100644 src/resources/images/left1.png delete mode 100644 src/resources/images/left2.png delete mode 100644 src/resources/images/left3.png delete mode 100644 src/resources/images/pacman.png delete mode 100644 src/resources/images/right1.png delete mode 100644 src/resources/images/right2.png delete mode 100644 src/resources/images/right3.png delete mode 100644 src/resources/images/up1.png delete mode 100644 src/resources/images/up2.png delete mode 100644 src/resources/images/up3.png diff --git a/src/resources/images/down1.png b/src/resources/images/down1.png deleted file mode 100644 index fa6b768949d692f701a18cc671b9e4cbb4ece8fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmV;|0Vw{7P)@x2Q?6zN8%kYyQCb-#t&pp?YkwE?0t?E%(#X6oI~qY#=mRFF+$+r?pq*$2 zZ7vJE`%h>$e76V8`jF2b^eyWui82k`0CRoDW7zWqETv(j#v(xpta1vJfSHKkX`qzS z9{!jej{}uNc?R+k!2q=sn2HPqm`s7|5rD5#;9>;e^AtD%nh~KNz*(Z?fLmZT68IG; zreGb|2Hqnr7ZN*e*d7xVI%%Q0#Q(+Y}^gmEq)d|3(00Cu;F^)6vH{^yK{%jnJS6)Rb9j# z+(I8Wo5Xv(!dtv1!`AjBE#ZD*Kk+*;Z7G>Hx&2w~>4HUYJ@F!O(7IoH95g-a9k8{; zZeqLyI*)PFyVeFjOB|j9oyXzKI05S~dHl0JOFxM!(Zd&9>9`)tt{=EoV-pt&p&Dzm z#s+!?;T|?>46s@dUd5nF{KTb#F#M_#6J_5RCN;hnMq#(c$NvC-sPP6z1jT&_8SguYyJ%$ex-x7mGr{i2!5>FBjTXI!mJMlH~X!d;C_y;U2 VqLsd?oGt(W002ovPDHLkV1g-m!^8jp diff --git a/src/resources/images/down3.png b/src/resources/images/down3.png deleted file mode 100644 index 9f3a0252053a07545f47a2bd0cd5275336ded073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmV+b0{{JqP)GWL9A(3 zfLT&bm3#r{)bm)olmd4b>@?MRw*;pBkI*8#9l>PEi88JMJdUg^0Gq%X5GwB7A{HWR zGsOGZr~x{)2G9w>7SO5@+yb^T|bS|(@K2M$q!@@>u&eO1ttpzJCAIj^s$WYdDziR8Q}DkXV6 zQic^O_ol3F@0C#@>8J9b0{kS=$WVDVnd&b1vGUc)@6cD?&Q~0Eo&7GiaRsXhJr?DW zauIjF{2TB_Y#>+8l&8gbs^FpW^3QaV^VoT_9Qy^|+Z7a`RQuon00003}mpEc>21s-(Z&&ak9Ar-&D5)jAeO^9|b;g<&`-f`Tb+#Ja;SB zJr!O0jb781&)K+5b>)5I<1?1rF#jm|(}GcH`j%PSg5$2mEREPY<+$q`uNohT*aSUe zLj%Q3qk;hMNm1K^OjN##RIME8iDEi)#Ij^++Z%0 zl`uQXy?=`0#1i$FA(!?#$9TSfwODywL-^uay@uQbISHe0QyVf9m@T$!x!0#z=ONzT zAQtdV=0Dp8c9pgt$LLp4a0L^K4t7X=AILo~HJwz=3Y z{td4E3r%gUO@Tv0ZP6kKZdpU(kJK_VuZH(|MPHvM_4RbYJ)LvD=jL$k>#CAyS2c<$ zOyD8L@e3cZfDd>_wp))U87P+$bBV3Qj}yzi`kh!$tR|keZ5V_;NPKRfZTs75EAc8Z z(g8Nsba7VT(b`RXNn9HMyWVvAXGm}#{(2DnCb4$`=+S4HN}@{K!ZI#*e2??$JMPq& zK~)Hu!xjbj|h9s_`6G3v)l!c+y-@N(We| z@lwyVN@)l0tHfWB{sboh~1a^UWU>2AF zYQQyc0$c$XU^DY`wMUF8`$|K3|F)c{rBsziWie|*FLXTxzU2V3R9DJMAqUKg^702@ zx0=d>GTZ}ZX#i+jugXyum`J%F5ZaxV)i!ujsRaV7RFsiOxdSG1YObGn2DW415@-Yj z7l4I!jt|oOgi6PGlyqJc0~KI2&|lZ%1LS#UKOu02GNj!8LraTN3Q)(rCe&VG$Ha^Kf#%s}2fl1#NUc8}zihtI zci>aXVS2Q@N%G@pN?STBq9U*dlz?fHI=DqiQ6R7+iK>#cQE5I~R z0ZPC%a01kT)Al?O0BVO3D(lLvQt#U8wpZm@Ia4N+4s=3Clw+ll0*u>dbjg-dOaN1f zynM?5jlbYrDRh7-C>P2{pU`h>DBGRjos7@_%ku@5K)D1)fg(^y%y72x0E~y=1TYWm z0uA6jC%6dA#mj9>*;ih2gyUV=?6J#UPWVyKLwO-^1C;v=M?Fklw*?&Z2?d}B7=YOv z+|wT5U>TU|6WRn0<4GHibpM(oaZgJ18#thB*zQ<)Rd}xqqAV$oIm_#pq)|%BRaDsj z*@Q$HRqm8#4o~B4^Cxj-rIs-ye>M89%24nJ zF!O*gBhwyRaiE}NiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0v7JzX3_ zEPA(2wdOlyAmB3JSJrVNa{*IUm&hF@_Oq-(0ZX2-TrpvZQEY5G#O7Eqf$5t^bmjM- zi*Ih7=n|907;-@B2E*zN8!>7USkxdUSUEGyxlCGq*=Rw}hE3W=s5-a`by$)?1yr1$Ts;@*T22 z2A@)8v0iZcn!?Q}tM3A*tjsp^{@Tv_@87JRDbJ1fG9NQt9iw?7@3-yVLcA-JBa;W;iuOQJk!1Bd(Y*bd!8nV_GrfN3{NnF zM;OK?*073YvfG-Tq(xpNz9se&XRTY}IB}SGnHajfco}#%@wT7Pe&)YAOngZ^9sqVP zv7PwU0eVq;iODwbyBk20_|vca{spkvj@KWg---80G>Hjp;m&~e=o%-OD*cvfDna#G z^94^aS`j>g#iG~zr6L%TKi^0oF5+D<(9Ut{yygZ?P7lbF83K{{E}Nn$^-loo4hl1^qi jqGzV-_=GoPzb*S5c*JiYxvSNB00000NkvXXu0mjffE2s+ diff --git a/src/resources/images/right2.png b/src/resources/images/right2.png deleted file mode 100644 index b20263cb53240105d48845c0a3bd16eb25a4f4e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmV;!0X+VRP)UQ&c!gCg zVhX1?!~u56S>y5~4YHCrPh2K$8>htIL^rXSm>nD(1WqJ&6P*@VlWrb2SZ@KFOq?dJ zhk*9$cj8?W_*3G~h|qrcY9H9zkjH;YzYj+h#ZMvB5SYqZ$2e;wtgBzq4ibf0d@2 t$E({*%nuG$$xy}g1Ket}-4 zQqk%B1|bol7ZN%N1rnNN?Mm#jk78$KGP%BH_9Q2n%zN|PlXLHRZ=@2AC<3N{NnkGi z9tNI)8{iVy1@<8TQ3J`Ca;B7&*Wi*yz9@Ifs!~V_X<&!49>YF<0H(8|94mbRFzw3u zFBSfjZ*lb_Y4Aq8a~5bb-<1ocy$PMqQE8|xn~~B5Tm${zT#x@m4X6V51z-l~$O)_h z6<`aP1xMR}X`nL)v;v#}%i!(TU*#xAKg-H?NQjgY(4Dc`J75T`r-edBU^DhY&?fja z2YBK;p#U7xxF%U*9HOP5qAVy+IS%kO_LrWN3DKoIwqV*y%9_%d@QRj=bXh4Xi>)@H zs&b|DCc$}av!*;K1Bq6A!Lu5DSvgS#6NeXC`KPC;9_vMAB{0(eeoV_WM)?BR0S-db Z_X#HqYY67PcxnIu002ovPDHLkV1i~AyvP6m diff --git a/src/resources/images/up1.png b/src/resources/images/up1.png deleted file mode 100644 index 9ef859f6ed398d9936d8f1ef6fb4b3fefe82185c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmV<60U!Q}P)sw;4@pgh;OMGf~_qWioMy>b81lZZcyE%Z9+G|)*Yw7_mI(_x<5UNBEZwi6o5UVxr z;anjooWVwo+gKB$8^&~O_S!6-2R>}Qy;(uOn0WS& z$I@>-i@%v5zZTd?9HbdXUBN#dRR>M)bVHS7#^qL*a0j=rj;rm9*P4I-6<(74F85C) Wu$}+!+$9(Q00005U}?Jv9XG}o85(M@mSp15Z$}#n(Kk5xO2|=&zTu`t|aDVCGj|M zuOrtaUL-yyw%hM{Mi+E5@jfw1j1%{d1 zh}#RmZY2&nZ|3hbO5FVg>~cNUzd~m^NSsfiXyXaaI(e*AmL_o#@37hf7)IDAc*N1< zeZ(m|EZD@E9>J$^tze@^=q#=@i9_x9ea2zI_nx6JDA@ZC;Jtz!OnZb*u~V>%Nsr(O zcALa1KHx%6;4io|^NOtnuC=U&E$e4@dzP4-06J+I^R~H`_+0&WS?IX-t}Qb9^~Ccf zuVq+!)_?N{IojY(Vn6XUG3_Xs*4%zuJ73TwS@5{cIo!Z?Y~gB6yu~ZL!D}+;>iz*r WF`O~bjAU~F0000+1;6JHpV2Ux#yhU+?m`zsI&*8%1ZZmR&b?k zD}$Z6&cbo!T6t84dZ2U4tCA>}%2W=_gmSNZgoceC@OG$GX()HfSQcDSK2yEV%1916 z8D5?qepil^I0dtoQJ5&3Iq*S%I#Y?V9$@0|PqU1=vYG;8WhY}2>9|uOlydm&yuw5| zQ+Acx9;nKTQbyTVzIqh*8+$P@3q%zA%tXo~Fjg@95GkL)K*4Y$25t&Q0d8X8^dI2U z7^nbm1)^_2B?hWMqd>R;R8b=3Txk}tew)FHezxj#*uH;->n*GObldzRUN?1UrQwot z5zdBw(IoViGGI{#m90K!UJpHO*Hcb4OG-_7^7ocV$4AK3TD9E;k(#q=qG4bWSOAuR k`H-jrhrkJN3?^CK-z?#f=xiF