From 87171a1989d1d581d1aef852943068ae292113df Mon Sep 17 00:00:00 2001 From: BHavesh-png Date: Mon, 27 Jul 2026 15:40:32 +0530 Subject: [PATCH 1/2] fix: prevent Pacman from leaving the game board --- pacman-java/PacMan.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pacman-java/PacMan.java b/pacman-java/PacMan.java index 4b4eb54..caad4d0 100644 --- a/pacman-java/PacMan.java +++ b/pacman-java/PacMan.java @@ -311,8 +311,7 @@ public void move() { if (collision(ghost, wall) || ghost.x <= 0 || ghost.x + ghost.width >= boardWidth) { ghost.x -= ghost.velocityX; ghost.y -= ghost.velocityY; - char newDirection = directions[random.nextInt(4)]; - ghost.updateDirection(newDirection); + break; } } } From 6c30e84657755e8a327fdb1bc779595b4d8049d3 Mon Sep 17 00:00:00 2001 From: BHavesh-png Date: Mon, 27 Jul 2026 15:59:20 +0530 Subject: [PATCH 2/2] refactor: reorganize project into standard package structure --- pacman-java/App.class | Bin 1110 -> 0 bytes pacman-java/PacMan$Block.class | Bin 1645 -> 0 bytes pacman-java/PacMan.class | Bin 8997 -> 0 bytes pacman-java/desktop.ini | Bin 246 -> 0 bytes pacman-java/out/desktop.ini | Bin 246 -> 0 bytes pacman-java/out/production/desktop.ini | Bin 246 -> 0 bytes .../out/production/pacman-java/App.class | Bin 1446 -> 0 bytes .../production/pacman-java/PacMan$Block.class | Bin 1875 -> 0 bytes .../out/production/pacman-java/PacMan.class | Bin 8514 -> 0 bytes .../out/production/pacman-java/blueGhost.png | Bin 258 -> 0 bytes .../out/production/pacman-java/cherry.png | Bin 271 -> 0 bytes .../out/production/pacman-java/cherry2.png | Bin 223 -> 0 bytes .../out/production/pacman-java/desktop.ini | Bin 246 -> 0 bytes .../production/pacman-java/orangeGhost.png | Bin 246 -> 0 bytes .../production/pacman-java/pacman-java.iml | 11 - pacman-java/pacman-java.iml | 11 - pacman-java/pacmanDown.png | Bin 204 -> 0 bytes pacman-java/pacmanLeft.png | Bin 203 -> 0 bytes pacman-java/pacmanRight.png | Bin 205 -> 0 bytes pacman-java/pacmanUp.png | Bin 207 -> 0 bytes pacman-java/pinkGhost.png | Bin 249 -> 0 bytes pacman-java/powerFood.png | Bin 155 -> 0 bytes pacman-java/redGhost.png | Bin 249 -> 0 bytes pacman-java/scaredGhost.png | Bin 239 -> 0 bytes pacman-java/wall.png | Bin 152 -> 0 bytes {pacman-java => src/game}/App.java | 68 +- {pacman-java => src/game}/PacMan.java | 830 +++++++++--------- {pacman-java => src/resources}/blueGhost.png | Bin {pacman-java => src/resources}/cherry.png | Bin {pacman-java => src/resources}/cherry2.png | Bin .../resources}/orangeGhost.png | Bin .../resources}/pacmanDown.png | Bin .../resources}/pacmanLeft.png | Bin .../resources}/pacmanRight.png | Bin .../resources}/pacmanUp.png | Bin .../resources}/pinkGhost.png | Bin .../resources}/powerFood.png | Bin .../resources}/redGhost.png | Bin .../resources}/scaredGhost.png | Bin .../pacman-java => src/resources}/wall.png | Bin 40 files changed, 451 insertions(+), 469 deletions(-) delete mode 100644 pacman-java/App.class delete mode 100644 pacman-java/PacMan$Block.class delete mode 100644 pacman-java/PacMan.class delete mode 100644 pacman-java/desktop.ini delete mode 100644 pacman-java/out/desktop.ini delete mode 100644 pacman-java/out/production/desktop.ini delete mode 100644 pacman-java/out/production/pacman-java/App.class delete mode 100644 pacman-java/out/production/pacman-java/PacMan$Block.class delete mode 100644 pacman-java/out/production/pacman-java/PacMan.class delete mode 100644 pacman-java/out/production/pacman-java/blueGhost.png delete mode 100644 pacman-java/out/production/pacman-java/cherry.png delete mode 100644 pacman-java/out/production/pacman-java/cherry2.png delete mode 100644 pacman-java/out/production/pacman-java/desktop.ini delete mode 100644 pacman-java/out/production/pacman-java/orangeGhost.png delete mode 100644 pacman-java/out/production/pacman-java/pacman-java.iml delete mode 100644 pacman-java/pacman-java.iml delete mode 100644 pacman-java/pacmanDown.png delete mode 100644 pacman-java/pacmanLeft.png delete mode 100644 pacman-java/pacmanRight.png delete mode 100644 pacman-java/pacmanUp.png delete mode 100644 pacman-java/pinkGhost.png delete mode 100644 pacman-java/powerFood.png delete mode 100644 pacman-java/redGhost.png delete mode 100644 pacman-java/scaredGhost.png delete mode 100644 pacman-java/wall.png rename {pacman-java => src/game}/App.java (88%) rename {pacman-java => src/game}/PacMan.java (93%) rename {pacman-java => src/resources}/blueGhost.png (100%) rename {pacman-java => src/resources}/cherry.png (100%) rename {pacman-java => src/resources}/cherry2.png (100%) rename {pacman-java => src/resources}/orangeGhost.png (100%) rename {pacman-java/out/production/pacman-java => src/resources}/pacmanDown.png (100%) rename {pacman-java/out/production/pacman-java => src/resources}/pacmanLeft.png (100%) rename {pacman-java/out/production/pacman-java => src/resources}/pacmanRight.png (100%) rename {pacman-java/out/production/pacman-java => src/resources}/pacmanUp.png (100%) rename {pacman-java/out/production/pacman-java => src/resources}/pinkGhost.png (100%) rename {pacman-java/out/production/pacman-java => src/resources}/powerFood.png (100%) rename {pacman-java/out/production/pacman-java => src/resources}/redGhost.png (100%) rename {pacman-java/out/production/pacman-java => src/resources}/scaredGhost.png (100%) rename {pacman-java/out/production/pacman-java => src/resources}/wall.png (100%) diff --git a/pacman-java/App.class b/pacman-java/App.class deleted file mode 100644 index 2dc99e2e0b955f889eb7034291d0cfe2dbe1b66d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1110 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 diff --git a/pacman-java/desktop.ini b/pacman-java/desktop.ini deleted file mode 100644 index e65e49d49ab45e6db82523ac4fdf7c94c21e50b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmY+8!3x4a3`E~q@E`gCQd&U-p(mxKCq<90hf-EusIIswe!kN^v`CmRNoIx|NjY%E z(y7)$Lr~S+IpaAoWum>0v*XE)5+|Ky%Y%X}Dr(xO*=rxf-cq*Wg}f^aJI$VpdZUD7 x$OyVsy7ad`)3A}o@ev6gGiRaCvjP7pV@4@wD&JR_$+e8%{s6@wDU1LB diff --git a/pacman-java/out/desktop.ini b/pacman-java/out/desktop.ini deleted file mode 100644 index e65e49d49ab45e6db82523ac4fdf7c94c21e50b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmY+8!3x4a3`E~q@E`gCQd&U-p(mxKCq<90hf-EusIIswe!kN^v`CmRNoIx|NjY%E z(y7)$Lr~S+IpaAoWum>0v*XE)5+|Ky%Y%X}Dr(xO*=rxf-cq*Wg}f^aJI$VpdZUD7 x$OyVsy7ad`)3A}o@ev6gGiRaCvjP7pV@4@wD&JR_$+e8%{s6@wDU1LB diff --git a/pacman-java/out/production/desktop.ini b/pacman-java/out/production/desktop.ini deleted file mode 100644 index e65e49d49ab45e6db82523ac4fdf7c94c21e50b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmY+8!3x4a3`E~q@E`gCQd&U-p(mxKCq<90hf-EusIIswe!kN^v`CmRNoIx|NjY%E z(y7)$Lr~S+IpaAoWum>0v*XE)5+|Ky%Y%X}Dr(xO*=rxf-cq*Wg}f^aJI$VpdZUD7 x$OyVsy7ad`)3A}o@ev6gGiRaCvjP7pV@4@wD&JR_$+e8%{s6@wDU1LB diff --git a/pacman-java/out/production/pacman-java/App.class b/pacman-java/out/production/pacman-java/App.class deleted file mode 100644 index 19779835b415a8351ef998ce268e9213b6137e2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1446 zcmZux{ZiXT9NfdQxsn_* zd8__oX39(-AP?2)p5)fa44(1n?sm1ezmL<~fByO#z+L=iVgeZhnuRQMf&5G7l~eT` zzgyiodMVqnfWGefZoDCoDKE7Q8T-K#?`0I#+r$Xm{Vrw1*S*z|FET&La$o* z5Q_piN+&j%f$~zS;+(|QWRE%qu3NZ)j|8lUOvW-|7e}&VvJy7%iG@#5X5L8Ob>Gl$ zwp_2L*s_Js@Hvx2tP!-G*bV%q^!R)w_X2_0cQk83uOIl*kC|DeTd`2Zm#Gcr!hPc$ zc@)>m&rawfNX&M`RmpCK}dyj_V7|l%Jp1k;I*_ zOM3Afn6(dslUgwFc^^cbUDgh~LC+uU%d)I+%xx1^8sfSWE&wOoKv$ zOi(q%W9%>qIs!c5Y=XFlpE%3#gf5z#X*}(Ssyoc>RqSIAPsy)Puf-MX1sgx(fG(d= PQ={5*{(s?o0>AzXR|!0( diff --git a/pacman-java/out/production/pacman-java/PacMan$Block.class b/pacman-java/out/production/pacman-java/PacMan$Block.class deleted file mode 100644 index d37d321ce3fa6eeca59e3f3f9ede51811eaa11b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1875 zcmZ8hNmCm~6#iN(%LoJpV$32hn25m!8)6)T!3JSKiNM4x0i4ByG=;_%5+x0b%_V=s zH*TC$g>WU6O68nu?)f1}W%*u@3<6bY-q!v4y|2I5zyJI5uK=d-sun)@!w47%BBWp} zTIqQ!-!qjfq~9on+^kdTxu;N*@&aRZs6lNQbq4BTC`4add)8pi%5M!m-+XPSUG918 z10ywz96c`V5%bRdTJOyC$wX2JW7_*6ZjRG;mK4XxQD!SgyTV>7W)v7!Knz0}n95 zv>t47qLs^)6s~wB@48NIaLy`amu#1qevU_Bj2aljV}&N&RP_qt@3?l+atlR;ws>Dv zj%39@R*wlh3FE1ONlYm;pC|daL?N8DN(=UZtM6t*c1#<1h8cxGUb|a9=B~O?mN$es z14(?rn@SgQIj5xWFczRzLvbC9`r#V$fTe(%M=!ji$285%$hl|IP9P_rDEo2t0qP1-kC9Y}o z?rQp+hkwxk8DnjATA<7ZW+FRI+(^P|p;ulRGt>y?Xx1Q+^=~)so!Ql8n@nWY>~()RG+3 zlH;T$heu0}3J{IT2-6PmUylWz^PJirlwrzAv%d^wen8lau9Oim{be-Cr`5bu##OVc zj83yPP)5vb4VH1!Yz>uhTikK&?*EZVd|2dn2nN4xs6{g;TZ(8wJLk0vLi^1<>@!JjNhfInb6k?6`1+C4sa&41~Jb0o$wUh44l5&5C%QVCb0 z<2ss>&DHxnRvn{ThhH3#VO9IQ=w(RmlT1T|V;C{gCXNv{{t)AMgc(w3nGfSPv~0du zMLZ!alNu7~hCNh(kfuWj#Jak#QQJ7{HNoCxU6Yg%my4q0FvQLo-Jlsa&B1&|{AQ|> bH&v4R@scTgEaO`(hwvR`9TWRl`1ip79~@Gp diff --git a/pacman-java/out/production/pacman-java/PacMan.class b/pacman-java/out/production/pacman-java/PacMan.class deleted file mode 100644 index a7bff526b6cb8847eb14cf2e911dbadeac492d2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8514 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 X`3hk?itq+L#NrY1Rk>5{LdE|95#w;6 diff --git a/pacman-java/out/production/pacman-java/blueGhost.png b/pacman-java/out/production/pacman-java/blueGhost.png deleted file mode 100644 index e1ee9793c4e974ec999a5d386998a5e76bc8a3ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!RekZjv*HQ$qPgboHBVP)IYjVuOZB%7Ih;r zv|F)bouKRj>6Sx^OC;GQ@HQGxF!eXs&U%?uoxeF#!a=NE@(_!dBa?xvf&-8AVFrl; zj~Mo2FBoEFau_z&xw9GAO6WEG{C(h$0$Vdrpn)_?L1!~_lZm_Xk^A^pd z^B|58{{+)XISjkln%M444*$)6_()b-%cX>~0cy<7txC+!$7>COUp~}zn~-*N&f9{m zCm5;~luQouw(aE6X=DlD38*O$KGl@n_DO)@u7C*hJM9&VC7781?|$zTIfEgO;lz3c zsT2;Q18E9I2c!%P7>e~y2&6P8PHSX{V|HM;d;Y{McIJcx28O2#LNc!GE!qNfFN3G6 KpUXO@geCyQU0mk? diff --git a/pacman-java/out/production/pacman-java/cherry2.png b/pacman-java/out/production/pacman-java/cherry2.png deleted file mode 100644 index 6dea0ca79c594ba47ad20d4da512808710ae6578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!4gjw#}JL+$z9y>(0a=CHEKCuHB~ye>n58&7v_0w(Nm0v*XE)5+|Ky%Y%X}Dr(xO*=rxf-cq*Wg}f^aJI$VpdZUD7 x$OyVsy7ad`)3A}o@ev6gGiRaCvjP7pV@4@wD&JR_$+e8%{s6@wDU1LB diff --git a/pacman-java/out/production/pacman-java/orangeGhost.png b/pacman-java/out/production/pacman-java/orangeGhost.png deleted file mode 100644 index bcd1cb881817aec9a65a7df1f413a233bdb20bd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!ER3%#}Etuvy;5J8Vq<`UO!LJ`#a|l_pZ;y z7OpQZc+3gw+40fQ)5w=C=+(YStr8p0y_E|JFbm#fE>t-oak2MD6P=97#upE}+A8IF zw`*j?`V?t!WqykIbi!f9FUIynS+;9;O^upuZ#cYPm3Vi*^Q8k_<~wScwe5``IAEKhK{X%;X8&ck=EG;A3`*M&SLO%^>bP0l+XkK9FbSb diff --git a/pacman-java/out/production/pacman-java/pacman-java.iml b/pacman-java/out/production/pacman-java/pacman-java.iml deleted file mode 100644 index 1de981c..0000000 --- a/pacman-java/out/production/pacman-java/pacman-java.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/pacman-java/pacman-java.iml b/pacman-java/pacman-java.iml deleted file mode 100644 index 1de981c..0000000 --- a/pacman-java/pacman-java.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/pacman-java/pacmanDown.png b/pacman-java/pacmanDown.png deleted file mode 100644 index 2c24dbeef778c62545a5cb12b58042da9289deff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!9-6N#}EtuqZ0!84k&OqAN+lPrYakUP{<9F zYWo$9+c@?&$FO%a{8*uIZ13S@lNTSIs!sB7hb<|r^$lOOgL_ia%!F@+)6Q%AupX(M w{>Z24%sR2#@@gNNw3$UuEL*W`FYf{7|B*Zf7r5=`0WD+jboFyt=akR{0CK8DYXATM diff --git a/pacman-java/pacmanLeft.png b/pacman-java/pacmanLeft.png deleted file mode 100644 index 168f4952f75cc7c5d41a3e8d10ea0b4c3d921c1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!30ki#}Etuvl9dP4k&OqCw|{=%*|=Kpv~l5 z|6chcH=+XfEehmLOWG*2;@$aaXXh5AnMv^~v)z2sS#{=Dt@C$u=S8{7crQOlH;h*}Viz`F&V7JABAz x6+A4b65+|T=>0K{8CtLMEf{aiJ*A{%{{EGsz~V#GeSo$xc)I$ztaD0e0sxVgL;(N* diff --git a/pacman-java/pacmanUp.png b/pacman-java/pacmanUp.png deleted file mode 100644 index 9f4a39bc97f9c5f6982b929ad4c46e50b1b72e69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!4yvy#}EtuvlAM*4k&QAl>YyJUU#zDQ2yuEOvpy{_8R_X~ak1BnPR`U{^9BRkJ};yZpbEz`U}< zQquWiCu_de{c9>#NQp_THW=`@u2!Gx+Wui#_KpSV zcb(HO&c5WY{Be8Ik#2skN%x;Pd)*D+B%pk)@SZc*sdawe+?4o@a!NGkwXxFw^g}cKHr;8H1;*pUXO@geCyYTv$*5 diff --git a/pacman-java/powerFood.png b/pacman-java/powerFood.png deleted file mode 100644 index 3e91ad97d8b73d29fc22607fa923e9ff522f755b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK?6@0#}JL+D2+DZy~DUxZ`jBliTLUItHBKbLh*2~7Z(E_Rcyby+?0iJIoiTs4!MF1`V# zJH7|oEh_Dk==o=t(0}IRafSr`?D7ks#j}0Numj>FVdQ&MBb@0As{e>;M1& diff --git a/pacman-java/wall.png b/pacman-java/wall.png deleted file mode 100644 index ab12c87b6f42714974c1183f5340c48fd3702c3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL0wN5#}EtuWQl?U97`qN*q-~-Zq&)dUOuDY st5IX6NJAjA8!tm+qj|ytMrLM)PlYTJ6F#J!25MyRboFyt=akR{0Jrlgc>n+a diff --git a/pacman-java/App.java b/src/game/App.java similarity index 88% rename from pacman-java/App.java rename to src/game/App.java index a82e6c5..e380cc4 100644 --- a/pacman-java/App.java +++ b/src/game/App.java @@ -1,33 +1,35 @@ -import javax.swing.*; -import java.awt.*; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; - -public class App { - public static void main(String[] args) throws Exception { - int rowCount = 21; - int columnCount = 19; - int tileSize = 32; - int boardWidth = columnCount * tileSize; - int boardHeight = rowCount * tileSize; - - JFrame frame = new JFrame("Pac Man"); - -// Set icon for taskbar and title bar. - ImageIcon icon = new ImageIcon(App.class.getResource("pacmanRight.png")); - frame.setIconImage(icon.getImage()); - - // frame.setVisible(true); - frame.setSize(boardWidth, boardHeight); - frame.setLocationRelativeTo(null); - frame.setResizable(false); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - PacMan pacmanGame = new PacMan(); - frame.add(pacmanGame); - frame.pack(); - pacmanGame.requestFocus(); - frame.setVisible(true); - - } -} +package game; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; + +public class App { + public static void main(String[] args) throws Exception { + int rowCount = 21; + int columnCount = 19; + int tileSize = 32; + int boardWidth = columnCount * tileSize; + int boardHeight = rowCount * tileSize; + + JFrame frame = new JFrame("Pac Man"); + +// Set icon for taskbar and title bar. + ImageIcon icon = new ImageIcon(App.class.getResource("../resources/pacmanRight.png")); + frame.setIconImage(icon.getImage()); + + // frame.setVisible(true); + frame.setSize(boardWidth, boardHeight); + frame.setLocationRelativeTo(null); + frame.setResizable(false); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + PacMan pacmanGame = new PacMan(); + frame.add(pacmanGame); + frame.pack(); + pacmanGame.requestFocus(); + frame.setVisible(true); + + } +} diff --git a/pacman-java/PacMan.java b/src/game/PacMan.java similarity index 93% rename from pacman-java/PacMan.java rename to src/game/PacMan.java index caad4d0..dd7aad0 100644 --- a/pacman-java/PacMan.java +++ b/src/game/PacMan.java @@ -1,414 +1,416 @@ -import java.awt.*; -import java.awt.event.*; -import java.util.HashSet; -import java.util.Random; -import javax.swing.*; - -public class PacMan extends JPanel implements ActionListener, KeyListener { - - class Block { - int x; - int y; - int width; - int height; - Image image; - - int startX; - int startY; - char direction = 'U'; // U D L R - int velocityX = 0; - int velocityY = 0; - - Block(Image image, int x, int y, int width, int height) { - this.image = image; - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.startX = x; - this.startY = y; - } - - void updateDirection(char direction) { - char prevDirection = this.direction; - this.direction = direction; - updateVelocity(); - this.x += this.velocityX; - this.y += this.velocityY; - for (Block wall : walls) { - if (collision(this, wall)) { - this.x -= this.velocityX; - this.y -= this.velocityY; - this.direction = prevDirection; - updateVelocity(); - } - } - } - - void updateVelocity() { - if (this.direction == 'U') { - this.velocityX = 0; - this.velocityY = -tileSize/4; - } - else if (this.direction == 'D') { - this.velocityX = 0; - this.velocityY = tileSize/4; - } - else if (this.direction == 'L') { - this.velocityX = -tileSize/4; - this.velocityY = 0; - } - else if (this.direction == 'R') { - this.velocityX = tileSize/4; - this.velocityY = 0; - } - } - - void reset() { - this.x = this.startX; - this.y = this.startY; - } - } - - private int rowCount = 21; - private int columnCount = 19; - private int tileSize = 32; - private int boardWidth = columnCount * tileSize; - private int boardHeight = rowCount * tileSize; - - private Image wallImage; - private Image blueGhostImage; - private Image orangeGhostImage; - private Image pinkGhostImage; - private Image redGhostImage; - - private Image pacmanUpImage; - private Image pacmanDownImage; - private Image pacmanLeftImage; - private Image pacmanRightImage; - - //X = wall, O = skip, P = pac man, ' ' = food - //Ghosts: b = blue, o = orange, p = pink, r = red - private String[] tileMap = { - "XXXXXXXXXXXXXXXXXXX", - "X X X", - "X XX XXX X XXX XX X", - "X X", - "X XX X XXXXX X XX X", - "X X X X", - "XXXX XXXX XXXX XXXX", - "OOOX X X XOOO", - "XXXX X XXrXX X XXXX", - "X bpo X", - "XXXX X XXXXX X XXXX", - "OOOX X X XOOO", - "XXXX X XXXXX X XXXX", - "X X X", - "X XX XXX X XXX XX X", - "X X P X X", - "XX X X XXXXX X X XX", - "X X X X X", - "X XXXXXX X XXXXXX X", - "X X", - "XXXXXXXXXXXXXXXXXXX" - }; - - HashSet walls; - HashSet foods; - HashSet ghosts; - Block pacman; - - Timer gameLoop; - char[] directions = {'U', 'D', 'L', 'R'}; //up down left right - Random random = new Random(); - int score = 0; - int lives = 3; - boolean gameOver = false; - boolean showInstructions = true; - - PacMan() { - setPreferredSize(new Dimension(boardWidth, boardHeight)); - setBackground(Color.BLACK); - addKeyListener(this); - setFocusable(true); - - //load images - wallImage = new ImageIcon(getClass().getResource("./wall.png")).getImage(); - blueGhostImage = new ImageIcon(getClass().getResource("./blueGhost.png")).getImage(); - orangeGhostImage = new ImageIcon(getClass().getResource("./orangeGhost.png")).getImage(); - pinkGhostImage = new ImageIcon(getClass().getResource("./pinkGhost.png")).getImage(); - redGhostImage = new ImageIcon(getClass().getResource("./redGhost.png")).getImage(); - - pacmanUpImage = new ImageIcon(getClass().getResource("./pacmanUp.png")).getImage(); - pacmanDownImage = new ImageIcon(getClass().getResource("./pacmanDown.png")).getImage(); - pacmanLeftImage = new ImageIcon(getClass().getResource("./pacmanLeft.png")).getImage(); - pacmanRightImage = new ImageIcon(getClass().getResource("./pacmanRight.png")).getImage(); - - loadMap(); - for (Block ghost : ghosts) { - char newDirection = directions[random.nextInt(4)]; - ghost.updateDirection(newDirection); - } - //how long it takes to start timer, milliseconds gone between frames - gameLoop = new Timer(50, this); //20fps (1000/50) - gameLoop.start(); - - } - - public void loadMap() { - walls = new HashSet(); - foods = new HashSet(); - ghosts = new HashSet(); - - for (int r = 0; r < rowCount; r++) { - for (int c = 0; c < columnCount; c++) { - String row = tileMap[r]; - char tileMapChar = row.charAt(c); - - int x = c*tileSize; - int y = r*tileSize; - - if (tileMapChar == 'X') { //block wall - Block wall = new Block(wallImage, x, y, tileSize, tileSize); - walls.add(wall); - } - else if (tileMapChar == 'b') { //blue ghost - Block ghost = new Block(blueGhostImage, x, y, tileSize, tileSize); - ghosts.add(ghost); - } - else if (tileMapChar == 'o') { //orange ghost - Block ghost = new Block(orangeGhostImage, x, y, tileSize, tileSize); - ghosts.add(ghost); - } - else if (tileMapChar == 'p') { //pink ghost - Block ghost = new Block(pinkGhostImage, x, y, tileSize, tileSize); - ghosts.add(ghost); - } - else if (tileMapChar == 'r') { //red ghost - Block ghost = new Block(redGhostImage, x, y, tileSize, tileSize); - ghosts.add(ghost); - } - else if (tileMapChar == 'P') { //pacman - pacman = new Block(pacmanRightImage, x, y, tileSize, tileSize); - } - else if (tileMapChar == ' ') { //food - Block food = new Block(null, x + 14, y + 14, 4, 4); - foods.add(food); - } - } - } - } - - public void paintComponent(Graphics g) { - super.paintComponent(g); - draw(g); - } - - public void draw(Graphics g) { - g.drawImage(pacman.image, pacman.x, pacman.y, pacman.width, pacman.height, null); - - for (Block ghost : ghosts) { - g.drawImage(ghost.image, ghost.x, ghost.y, ghost.width, ghost.height, null); - } - - for (Block wall : walls) { - g.drawImage(wall.image, wall.x, wall.y, wall.width, wall.height, null); - } - - g.setColor(Color.WHITE); - for (Block food : foods) { - g.fillRect(food.x, food.y, food.width, food.height); - } - //score - g.setFont(new Font("Arial", Font.PLAIN, 18)); - if (gameOver) { - g.drawString("Game Over: " + String.valueOf(score), tileSize/2, tileSize/2); - } - else { - g.drawString("x" + String.valueOf(lives) + " Score: " + String.valueOf(score), tileSize/2, tileSize/2); - } - - if (showInstructions) { - g.setColor(new Color(0, 0, 0, 210)); - g.fillRect(0, 0, boardWidth, boardHeight); - - String title = "PAC-MAN"; - String controlsTitle = "HOW TO PLAY"; - String controls = "↑ ↓ ← → Arrow Keys to Move"; - String objMsg = "Eat all the food, avoid the ghosts!"; - String startMsg = "Press ANY KEY to Start!"; - - // Title with shadow - g.setFont(new Font("Arial", Font.BOLD, 50)); - FontMetrics fm = g.getFontMetrics(); - g.setColor(Color.BLUE); - g.drawString(title, (boardWidth - fm.stringWidth(title)) / 2 + 4, boardHeight / 2 - 146); - g.setColor(Color.YELLOW); - g.drawString(title, (boardWidth - fm.stringWidth(title)) / 2, boardHeight / 2 - 150); - - // Draw game sprites for decoration - int imgY = boardHeight / 2 - 110; - g.drawImage(pacmanRightImage, boardWidth / 2 - 90, imgY, tileSize + 10, tileSize + 10, null); - g.drawImage(redGhostImage, boardWidth / 2 - 30, imgY, tileSize + 10, tileSize + 10, null); - g.drawImage(blueGhostImage, boardWidth / 2 + 30, imgY, tileSize + 10, tileSize + 10, null); - g.drawImage(pinkGhostImage, boardWidth / 2 + 90, imgY, tileSize + 10, tileSize + 10, null); - - g.setColor(Color.WHITE); - g.setFont(new Font("Arial", Font.BOLD, 26)); - fm = g.getFontMetrics(); - g.drawString(controlsTitle, (boardWidth - fm.stringWidth(controlsTitle)) / 2, boardHeight / 2 - 20); - - g.setColor(Color.CYAN); - g.setFont(new Font("Arial", Font.PLAIN, 22)); - fm = g.getFontMetrics(); - g.drawString(controls, (boardWidth - fm.stringWidth(controls)) / 2, boardHeight / 2 + 20); - - g.setColor(Color.PINK); - g.setFont(new Font("Arial", Font.PLAIN, 20)); - fm = g.getFontMetrics(); - g.drawString(objMsg, (boardWidth - fm.stringWidth(objMsg)) / 2, boardHeight / 2 + 60); - - // Blinking start message - if ((System.currentTimeMillis() / 500) % 2 == 0) { - g.setColor(Color.ORANGE); - g.setFont(new Font("Arial", Font.BOLD, 24)); - fm = g.getFontMetrics(); - g.drawString(startMsg, (boardWidth - fm.stringWidth(startMsg)) / 2, boardHeight / 2 + 130); - } - } - } - - public void move() { - pacman.x += pacman.velocityX; - pacman.y += pacman.velocityY; - - //check wall collisions - for (Block wall : walls) { - if (collision(pacman, wall)) { - pacman.x -= pacman.velocityX; - pacman.y -= pacman.velocityY; - break; - } - } - - //check ghost collisions - for (Block ghost : ghosts) { - if (collision(ghost, pacman)) { - lives -= 1; - if (lives == 0) { - gameOver = true; - return; - } - resetPositions(); - } - - if (ghost.y == tileSize*9 && ghost.direction != 'U' && ghost.direction != 'D') { - ghost.updateDirection('U'); - } - ghost.x += ghost.velocityX; - ghost.y += ghost.velocityY; - for (Block wall : walls) { - if (collision(ghost, wall) || ghost.x <= 0 || ghost.x + ghost.width >= boardWidth) { - ghost.x -= ghost.velocityX; - ghost.y -= ghost.velocityY; - break; - } - } - } - - //check food collision - Block foodEaten = null; - for (Block food : foods) { - if (collision(pacman, food)) { - foodEaten = food; - score += 10; - } - } - foods.remove(foodEaten); - - if (foods.isEmpty()) { - loadMap(); - resetPositions(); - } - } - - public boolean collision(Block a, Block b) { - return a.x < b.x + b.width && - a.x + a.width > b.x && - a.y < b.y + b.height && - a.y + a.height > b.y; - } - - public void resetPositions() { - pacman.reset(); - pacman.velocityX = 0; - pacman.velocityY = 0; - for (Block ghost : ghosts) { - ghost.reset(); - char newDirection = directions[random.nextInt(4)]; - ghost.updateDirection(newDirection); - } - } - - @Override - public void actionPerformed(ActionEvent e) { - if (showInstructions) { - repaint(); - return; - } - move(); - repaint(); - if (gameOver) { - gameLoop.stop(); - } - } - - @Override - public void keyTyped(KeyEvent e) {} - - @Override - public void keyPressed(KeyEvent e) {} - - @Override - public void keyReleased(KeyEvent e) { - if (showInstructions) { - showInstructions = false; - return; - } - if (gameOver) { - loadMap(); - resetPositions(); - lives = 3; - score = 0; - gameOver = false; - gameLoop.start(); - } - // System.out.println("KeyEvent: " + e.getKeyCode()); - if (e.getKeyCode() == KeyEvent.VK_UP) { - pacman.updateDirection('U'); - } - else if (e.getKeyCode() == KeyEvent.VK_DOWN) { - pacman.updateDirection('D'); - } - else if (e.getKeyCode() == KeyEvent.VK_LEFT) { - pacman.updateDirection('L'); - } - else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { - pacman.updateDirection('R'); - } - - if (pacman.direction == 'U') { - pacman.image = pacmanUpImage; - } - else if (pacman.direction == 'D') { - pacman.image = pacmanDownImage; - } - else if (pacman.direction == 'L') { - pacman.image = pacmanLeftImage; - } - else if (pacman.direction == 'R') { - pacman.image = pacmanRightImage; - } - } -} - +package game; + +import java.awt.*; +import java.awt.event.*; +import java.util.HashSet; +import java.util.Random; +import javax.swing.*; + +public class PacMan extends JPanel implements ActionListener, KeyListener { + + class Block { + int x; + int y; + int width; + int height; + Image image; + + int startX; + int startY; + char direction = 'U'; // U D L R + int velocityX = 0; + int velocityY = 0; + + Block(Image image, int x, int y, int width, int height) { + this.image = image; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.startX = x; + this.startY = y; + } + + void updateDirection(char direction) { + char prevDirection = this.direction; + this.direction = direction; + updateVelocity(); + this.x += this.velocityX; + this.y += this.velocityY; + for (Block wall : walls) { + if (collision(this, wall)) { + this.x -= this.velocityX; + this.y -= this.velocityY; + this.direction = prevDirection; + updateVelocity(); + } + } + } + + void updateVelocity() { + if (this.direction == 'U') { + this.velocityX = 0; + this.velocityY = -tileSize/4; + } + else if (this.direction == 'D') { + this.velocityX = 0; + this.velocityY = tileSize/4; + } + else if (this.direction == 'L') { + this.velocityX = -tileSize/4; + this.velocityY = 0; + } + else if (this.direction == 'R') { + this.velocityX = tileSize/4; + this.velocityY = 0; + } + } + + void reset() { + this.x = this.startX; + this.y = this.startY; + } + } + + private int rowCount = 21; + private int columnCount = 19; + private int tileSize = 32; + private int boardWidth = columnCount * tileSize; + private int boardHeight = rowCount * tileSize; + + private Image wallImage; + private Image blueGhostImage; + private Image orangeGhostImage; + private Image pinkGhostImage; + private Image redGhostImage; + + private Image pacmanUpImage; + private Image pacmanDownImage; + private Image pacmanLeftImage; + private Image pacmanRightImage; + + //X = wall, O = skip, P = pac man, ' ' = food + //Ghosts: b = blue, o = orange, p = pink, r = red + private String[] tileMap = { + "XXXXXXXXXXXXXXXXXXX", + "X X X", + "X XX XXX X XXX XX X", + "X X", + "X XX X XXXXX X XX X", + "X X X X", + "XXXX XXXX XXXX XXXX", + "OOOX X X XOOO", + "XXXX X XXrXX X XXXX", + "X bpo X", + "XXXX X XXXXX X XXXX", + "OOOX X X XOOO", + "XXXX X XXXXX X XXXX", + "X X X", + "X XX XXX X XXX XX X", + "X X P X X", + "XX X X XXXXX X X XX", + "X X X X X", + "X XXXXXX X XXXXXX X", + "X X", + "XXXXXXXXXXXXXXXXXXX" + }; + + HashSet walls; + HashSet foods; + HashSet ghosts; + Block pacman; + + Timer gameLoop; + char[] directions = {'U', 'D', 'L', 'R'}; //up down left right + Random random = new Random(); + int score = 0; + int lives = 3; + boolean gameOver = false; + boolean showInstructions = true; + + PacMan() { + setPreferredSize(new Dimension(boardWidth, boardHeight)); + setBackground(Color.BLACK); + addKeyListener(this); + setFocusable(true); + + //load images + wallImage = new ImageIcon(getClass().getResource("../resources/wall.png")).getImage(); + blueGhostImage = new ImageIcon(getClass().getResource("../resources/blueGhost.png")).getImage(); + orangeGhostImage = new ImageIcon(getClass().getResource("../resources/orangeGhost.png")).getImage(); + pinkGhostImage = new ImageIcon(getClass().getResource("../resources/pinkGhost.png")).getImage(); + redGhostImage = new ImageIcon(getClass().getResource("../resources/redGhost.png")).getImage(); + + pacmanUpImage = new ImageIcon(getClass().getResource("../resources/pacmanUp.png")).getImage(); + pacmanDownImage = new ImageIcon(getClass().getResource("../resources/pacmanDown.png")).getImage(); + pacmanLeftImage = new ImageIcon(getClass().getResource("../resources/pacmanLeft.png")).getImage(); + pacmanRightImage = new ImageIcon(getClass().getResource("../resources/pacmanRight.png")).getImage(); + + loadMap(); + for (Block ghost : ghosts) { + char newDirection = directions[random.nextInt(4)]; + ghost.updateDirection(newDirection); + } + //how long it takes to start timer, milliseconds gone between frames + gameLoop = new Timer(50, this); //20fps (1000/50) + gameLoop.start(); + + } + + public void loadMap() { + walls = new HashSet(); + foods = new HashSet(); + ghosts = new HashSet(); + + for (int r = 0; r < rowCount; r++) { + for (int c = 0; c < columnCount; c++) { + String row = tileMap[r]; + char tileMapChar = row.charAt(c); + + int x = c*tileSize; + int y = r*tileSize; + + if (tileMapChar == 'X') { //block wall + Block wall = new Block(wallImage, x, y, tileSize, tileSize); + walls.add(wall); + } + else if (tileMapChar == 'b') { //blue ghost + Block ghost = new Block(blueGhostImage, x, y, tileSize, tileSize); + ghosts.add(ghost); + } + else if (tileMapChar == 'o') { //orange ghost + Block ghost = new Block(orangeGhostImage, x, y, tileSize, tileSize); + ghosts.add(ghost); + } + else if (tileMapChar == 'p') { //pink ghost + Block ghost = new Block(pinkGhostImage, x, y, tileSize, tileSize); + ghosts.add(ghost); + } + else if (tileMapChar == 'r') { //red ghost + Block ghost = new Block(redGhostImage, x, y, tileSize, tileSize); + ghosts.add(ghost); + } + else if (tileMapChar == 'P') { //pacman + pacman = new Block(pacmanRightImage, x, y, tileSize, tileSize); + } + else if (tileMapChar == ' ') { //food + Block food = new Block(null, x + 14, y + 14, 4, 4); + foods.add(food); + } + } + } + } + + public void paintComponent(Graphics g) { + super.paintComponent(g); + draw(g); + } + + public void draw(Graphics g) { + g.drawImage(pacman.image, pacman.x, pacman.y, pacman.width, pacman.height, null); + + for (Block ghost : ghosts) { + g.drawImage(ghost.image, ghost.x, ghost.y, ghost.width, ghost.height, null); + } + + for (Block wall : walls) { + g.drawImage(wall.image, wall.x, wall.y, wall.width, wall.height, null); + } + + g.setColor(Color.WHITE); + for (Block food : foods) { + g.fillRect(food.x, food.y, food.width, food.height); + } + //score + g.setFont(new Font("Arial", Font.PLAIN, 18)); + if (gameOver) { + g.drawString("Game Over: " + String.valueOf(score), tileSize/2, tileSize/2); + } + else { + g.drawString("x" + String.valueOf(lives) + " Score: " + String.valueOf(score), tileSize/2, tileSize/2); + } + + if (showInstructions) { + g.setColor(new Color(0, 0, 0, 210)); + g.fillRect(0, 0, boardWidth, boardHeight); + + String title = "PAC-MAN"; + String controlsTitle = "HOW TO PLAY"; + String controls = "↑ ↓ ← → Arrow Keys to Move"; + String objMsg = "Eat all the food, avoid the ghosts!"; + String startMsg = "Press ANY KEY to Start!"; + + // Title with shadow + g.setFont(new Font("Arial", Font.BOLD, 50)); + FontMetrics fm = g.getFontMetrics(); + g.setColor(Color.BLUE); + g.drawString(title, (boardWidth - fm.stringWidth(title)) / 2 + 4, boardHeight / 2 - 146); + g.setColor(Color.YELLOW); + g.drawString(title, (boardWidth - fm.stringWidth(title)) / 2, boardHeight / 2 - 150); + + // Draw game sprites for decoration + int imgY = boardHeight / 2 - 110; + g.drawImage(pacmanRightImage, boardWidth / 2 - 90, imgY, tileSize + 10, tileSize + 10, null); + g.drawImage(redGhostImage, boardWidth / 2 - 30, imgY, tileSize + 10, tileSize + 10, null); + g.drawImage(blueGhostImage, boardWidth / 2 + 30, imgY, tileSize + 10, tileSize + 10, null); + g.drawImage(pinkGhostImage, boardWidth / 2 + 90, imgY, tileSize + 10, tileSize + 10, null); + + g.setColor(Color.WHITE); + g.setFont(new Font("Arial", Font.BOLD, 26)); + fm = g.getFontMetrics(); + g.drawString(controlsTitle, (boardWidth - fm.stringWidth(controlsTitle)) / 2, boardHeight / 2 - 20); + + g.setColor(Color.CYAN); + g.setFont(new Font("Arial", Font.PLAIN, 22)); + fm = g.getFontMetrics(); + g.drawString(controls, (boardWidth - fm.stringWidth(controls)) / 2, boardHeight / 2 + 20); + + g.setColor(Color.PINK); + g.setFont(new Font("Arial", Font.PLAIN, 20)); + fm = g.getFontMetrics(); + g.drawString(objMsg, (boardWidth - fm.stringWidth(objMsg)) / 2, boardHeight / 2 + 60); + + // Blinking start message + if ((System.currentTimeMillis() / 500) % 2 == 0) { + g.setColor(Color.ORANGE); + g.setFont(new Font("Arial", Font.BOLD, 24)); + fm = g.getFontMetrics(); + g.drawString(startMsg, (boardWidth - fm.stringWidth(startMsg)) / 2, boardHeight / 2 + 130); + } + } + } + + public void move() { + pacman.x += pacman.velocityX; + pacman.y += pacman.velocityY; + + //check wall collisions + for (Block wall : walls) { + if (collision(pacman, wall)) { + pacman.x -= pacman.velocityX; + pacman.y -= pacman.velocityY; + break; + } + } + + //check ghost collisions + for (Block ghost : ghosts) { + if (collision(ghost, pacman)) { + lives -= 1; + if (lives == 0) { + gameOver = true; + return; + } + resetPositions(); + } + + if (ghost.y == tileSize*9 && ghost.direction != 'U' && ghost.direction != 'D') { + ghost.updateDirection('U'); + } + ghost.x += ghost.velocityX; + ghost.y += ghost.velocityY; + for (Block wall : walls) { + if (collision(ghost, wall) || ghost.x <= 0 || ghost.x + ghost.width >= boardWidth) { + ghost.x -= ghost.velocityX; + ghost.y -= ghost.velocityY; + break; + } + } + } + + //check food collision + Block foodEaten = null; + for (Block food : foods) { + if (collision(pacman, food)) { + foodEaten = food; + score += 10; + } + } + foods.remove(foodEaten); + + if (foods.isEmpty()) { + loadMap(); + resetPositions(); + } + } + + public boolean collision(Block a, Block b) { + return a.x < b.x + b.width && + a.x + a.width > b.x && + a.y < b.y + b.height && + a.y + a.height > b.y; + } + + public void resetPositions() { + pacman.reset(); + pacman.velocityX = 0; + pacman.velocityY = 0; + for (Block ghost : ghosts) { + ghost.reset(); + char newDirection = directions[random.nextInt(4)]; + ghost.updateDirection(newDirection); + } + } + + @Override + public void actionPerformed(ActionEvent e) { + if (showInstructions) { + repaint(); + return; + } + move(); + repaint(); + if (gameOver) { + gameLoop.stop(); + } + } + + @Override + public void keyTyped(KeyEvent e) {} + + @Override + public void keyPressed(KeyEvent e) {} + + @Override + public void keyReleased(KeyEvent e) { + if (showInstructions) { + showInstructions = false; + return; + } + if (gameOver) { + loadMap(); + resetPositions(); + lives = 3; + score = 0; + gameOver = false; + gameLoop.start(); + } + // System.out.println("KeyEvent: " + e.getKeyCode()); + if (e.getKeyCode() == KeyEvent.VK_UP) { + pacman.updateDirection('U'); + } + else if (e.getKeyCode() == KeyEvent.VK_DOWN) { + pacman.updateDirection('D'); + } + else if (e.getKeyCode() == KeyEvent.VK_LEFT) { + pacman.updateDirection('L'); + } + else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + pacman.updateDirection('R'); + } + + if (pacman.direction == 'U') { + pacman.image = pacmanUpImage; + } + else if (pacman.direction == 'D') { + pacman.image = pacmanDownImage; + } + else if (pacman.direction == 'L') { + pacman.image = pacmanLeftImage; + } + else if (pacman.direction == 'R') { + pacman.image = pacmanRightImage; + } + } +} + diff --git a/pacman-java/blueGhost.png b/src/resources/blueGhost.png similarity index 100% rename from pacman-java/blueGhost.png rename to src/resources/blueGhost.png diff --git a/pacman-java/cherry.png b/src/resources/cherry.png similarity index 100% rename from pacman-java/cherry.png rename to src/resources/cherry.png diff --git a/pacman-java/cherry2.png b/src/resources/cherry2.png similarity index 100% rename from pacman-java/cherry2.png rename to src/resources/cherry2.png diff --git a/pacman-java/orangeGhost.png b/src/resources/orangeGhost.png similarity index 100% rename from pacman-java/orangeGhost.png rename to src/resources/orangeGhost.png diff --git a/pacman-java/out/production/pacman-java/pacmanDown.png b/src/resources/pacmanDown.png similarity index 100% rename from pacman-java/out/production/pacman-java/pacmanDown.png rename to src/resources/pacmanDown.png diff --git a/pacman-java/out/production/pacman-java/pacmanLeft.png b/src/resources/pacmanLeft.png similarity index 100% rename from pacman-java/out/production/pacman-java/pacmanLeft.png rename to src/resources/pacmanLeft.png diff --git a/pacman-java/out/production/pacman-java/pacmanRight.png b/src/resources/pacmanRight.png similarity index 100% rename from pacman-java/out/production/pacman-java/pacmanRight.png rename to src/resources/pacmanRight.png diff --git a/pacman-java/out/production/pacman-java/pacmanUp.png b/src/resources/pacmanUp.png similarity index 100% rename from pacman-java/out/production/pacman-java/pacmanUp.png rename to src/resources/pacmanUp.png diff --git a/pacman-java/out/production/pacman-java/pinkGhost.png b/src/resources/pinkGhost.png similarity index 100% rename from pacman-java/out/production/pacman-java/pinkGhost.png rename to src/resources/pinkGhost.png diff --git a/pacman-java/out/production/pacman-java/powerFood.png b/src/resources/powerFood.png similarity index 100% rename from pacman-java/out/production/pacman-java/powerFood.png rename to src/resources/powerFood.png diff --git a/pacman-java/out/production/pacman-java/redGhost.png b/src/resources/redGhost.png similarity index 100% rename from pacman-java/out/production/pacman-java/redGhost.png rename to src/resources/redGhost.png diff --git a/pacman-java/out/production/pacman-java/scaredGhost.png b/src/resources/scaredGhost.png similarity index 100% rename from pacman-java/out/production/pacman-java/scaredGhost.png rename to src/resources/scaredGhost.png diff --git a/pacman-java/out/production/pacman-java/wall.png b/src/resources/wall.png similarity index 100% rename from pacman-java/out/production/pacman-java/wall.png rename to src/resources/wall.png