From ab01fa28781d64ebbdea20bb3b144b7d16a28a7b Mon Sep 17 00:00:00 2001 From: Rory Healy Date: Thu, 21 Oct 2021 20:02:57 +1100 Subject: [PATCH] Memory leak fixes, formatting changes --- include/libmy.h | 1 + include/sokoban.h | 107 +++++++++------ lib/my_putchar.c | 3 +- lib/my_putchar.o | Bin 3664 -> 3664 bytes lib/my_putstr.c | 4 +- lib/my_putstr.o | Bin 3688 -> 3688 bytes sokoban | Bin 170800 -> 172552 bytes solution.txt | 2 +- src/ai/ai.c | 235 +++++++++++++++++---------------- src/ai/ai.h | 1 + src/ai/ai.o | Bin 50912 -> 54416 bytes src/ai/hashtable.c | 132 +++++++++++++------ src/ai/hashtable.h | 40 +++--- src/ai/hashtable.o | Bin 72896 -> 72920 bytes src/ai/node.h | 9 +- src/ai/priority_queue.c | 102 ++++++++------- src/ai/priority_queue.h | 15 +-- src/ai/priority_queue.o | Bin 18336 -> 17768 bytes src/ai/utils.c | 279 ++++++++++++++++++++++++---------------- src/ai/utils.h | 27 ++-- src/ai/utils.o | Bin 37472 -> 37488 bytes src/find_player.c | 16 ++- src/find_player.o | Bin 6568 -> 6568 bytes src/helper.c | 6 +- src/helper.o | Bin 4760 -> 4760 bytes src/key_check.c | 27 ++-- src/key_check.o | Bin 6312 -> 6312 bytes src/loose_check.c | 45 ++++--- src/loose_check.o | Bin 7232 -> 7240 bytes src/main.c | 23 ++-- src/main.o | Bin 7104 -> 7104 bytes src/map_check.c | 33 +++-- src/map_check.o | Bin 9424 -> 9432 bytes src/map_reading.c | 49 ++++--- src/map_reading.o | Bin 21688 -> 21696 bytes src/movement.c | 140 +++++++++++--------- src/movement.o | Bin 11400 -> 11432 bytes src/play.c | 47 +++---- src/play.o | Bin 17240 -> 17200 bytes src/win_check.c | 18 +-- src/win_check.o | Bin 5400 -> 5400 bytes src/zone_check.c | 23 ++-- src/zone_check.o | Bin 10008 -> 9568 bytes 43 files changed, 787 insertions(+), 597 deletions(-) diff --git a/include/libmy.h b/include/libmy.h index 4722355..754f7db 100644 --- a/include/libmy.h +++ b/include/libmy.h @@ -6,6 +6,7 @@ */ #include + #ifndef LIBMY_H #define LIBMY_H void my_putchar(char c); diff --git a/include/sokoban.h b/include/sokoban.h index 8efce27..f4ab044 100644 --- a/include/sokoban.h +++ b/include/sokoban.h @@ -7,43 +7,72 @@ #ifndef BSQ_H #define BSQ_H - typedef struct sokoban { - char *buffer; - char **map; - char **map_save; - int lines; - int player_x; - int player_y; - char const *base_path; - int win; - int case_number; - int num_chars_map; - } sokoban_t; - int helper(void); - char *read_map(int reading); - char *open_map(char const *path); - sokoban_t make_map(char const *path, sokoban_t sokoban); - int play(char const *path); - sokoban_t count_lines(sokoban_t sokoban); - int count_columns(sokoban_t sokoban, int position); - sokoban_t check_if_player(sokoban_t sokoban, int y, int x); - sokoban_t find_player(sokoban_t sokoban); - sokoban_t key_check(sokoban_t sokoban, int key); - sokoban_t move_right(sokoban_t sokoban); - sokoban_t move_left(sokoban_t sokoban); - sokoban_t move_up(sokoban_t sokoban); - sokoban_t move_down(sokoban_t sokoban); - void win_check(sokoban_t sokoban); - int count_storage_zone(int y, int x, sokoban_t sokoban); - int count_storage_won(int y, int x, sokoban_t sokoban); - sokoban_t check_zone_reset(sokoban_t sokoban); - sokoban_t reset_zone(int y, int x, sokoban_t sokoban); - void loose_check(sokoban_t sokoban); - void storage_loose_check(int y, int x, sokoban_t sokoban); - void map_check(sokoban_t sokoban); - int count_case_number(int y, int x, sokoban_t sokoban); - int count_player(int y, int x, sokoban_t sokoban); - sokoban_t game_management(sokoban_t sokoban); - int check_tile(int y, int x, sokoban_t sokoban); - int is_goal_cell(int y, int x, sokoban_t sokoban); + +typedef struct sokoban { + char *buffer; + char **map; + char **map_save; + int lines; + int player_x; + int player_y; + char const *base_path; + int win; + int case_number; + int num_chars_map; +} sokoban_t; + +int helper(void); + +char *read_map(int reading); + +char *open_map(char const *path); + +sokoban_t make_map(char const *path, sokoban_t sokoban); + +int play(char const *path); + +sokoban_t count_lines(sokoban_t sokoban); + +int count_columns(sokoban_t sokoban, int position); + +sokoban_t check_if_player(sokoban_t sokoban, int y, int x); + +sokoban_t find_player(sokoban_t sokoban); + +sokoban_t key_check(sokoban_t sokoban, int key); + +sokoban_t move_right(sokoban_t sokoban); + +sokoban_t move_left(sokoban_t sokoban); + +sokoban_t move_up(sokoban_t sokoban); + +sokoban_t move_down(sokoban_t sokoban); + +void win_check(sokoban_t sokoban); + +int count_storage_zone(int y, int x, sokoban_t sokoban); + +int count_storage_won(int y, int x, sokoban_t sokoban); + +sokoban_t check_zone_reset(sokoban_t sokoban); + +sokoban_t reset_zone(int y, int x, sokoban_t sokoban); + +void loose_check(sokoban_t sokoban); + +void storage_loose_check(int y, int x, sokoban_t sokoban); + +void map_check(sokoban_t sokoban); + +int count_case_number(int y, int x, sokoban_t sokoban); + +int count_player(int y, int x, sokoban_t sokoban); + +sokoban_t game_management(sokoban_t sokoban); + +int check_tile(int y, int x, sokoban_t sokoban); + +int is_goal_cell(int y, int x, sokoban_t sokoban); + #endif diff --git a/lib/my_putchar.c b/lib/my_putchar.c index 6803b1e..825f305 100644 --- a/lib/my_putchar.c +++ b/lib/my_putchar.c @@ -8,7 +8,6 @@ #include "../include/libmy.h" #include -void my_putchar(char c) -{ +void my_putchar(char c) { write(1, &c, 1); } diff --git a/lib/my_putchar.o b/lib/my_putchar.o index 0a8815e6bf6d0be2f2eaee3c2607f47e9eb619bf..3fff90f5d29fe601ba5acc2e4eee3be38d3d5f8d 100644 GIT binary patch delta 43 rcmca0b3tZ9CX<{b11A#$6fko!vN5tUv3avfvI(*>0jbUHOeeVkl|lws delta 43 rcmca0b3tZ9CX*Z^11A#$6fko$vN5tUv3avHvI(*>0jbUHOeeVkkVpm* diff --git a/lib/my_putstr.c b/lib/my_putstr.c index a775a71..0d9dddd 100644 --- a/lib/my_putstr.c +++ b/lib/my_putstr.c @@ -7,13 +7,13 @@ #include "../include/libmy.h" -int my_putstr(char const *str) -{ +int my_putstr(char const *str) { int i = 0; while (str[i] != '\0') { my_putchar(str[i]); i++; } + return (0); } diff --git a/lib/my_putstr.o b/lib/my_putstr.o index c706ea4835a5e89515d2f900a1f0aee7b1753742..680174f2a883ced1817b885fe483f44bf295a8fb 100644 GIT binary patch delta 80 zcmaDM^Fn6ABS!9tkL?(FHY+inVzf|T;ACQe0%lG|Hbzz^Hg6GD4n|f5Hhu+G9(z^} c8&+nvlaZ_(0<1hhX$~7Nppw|lD$Fk20B!6HRsaA1 delta 80 zcmaDM^Fn6ABSxNykL?(_H!CroVzgjn;ACQe0%k5oHbzz^Hg6GD4n|f+Hhu+G9(z^} c8&+nvlaZ_(0<1hhX$~7Nppux)D$Fk20AhO#7ytkO diff --git a/sokoban b/sokoban index aca7830a177f7f8ae355d9658d2c4fa3e88c1c82..74045adb81cb58285e9173c6de885c2a94d062f4 100755 GIT binary patch literal 172552 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 literal 170800 zcmeFa3w%_?`9FNl?k3q>*b4+$Adv+Y4G5SBXo5krupwu0gAo!y0RcC`Py>l%1F>>h zOhP$b)}lY`kG9y-)>>LG#Y+__Y7hu`DF&~oC}_Q$h*ZQ25tMzu&&-_7W=+uA_Wl3g z_ruZInddUk%sg{@=9zQIszTo+gDgw>W0WqJ2s$#9V+sUe>+J@SlB5DDSL%V^^QECu zBCsZe0zr+B4~lGhY!-Y*#FWoLi7w&{j+XRTuOY>hue)c9jZ^ek5-{aUAd-`Q@Hp9T zG=6^?hxIr%A1f~?_~YVz12|rfWAl-2W^Us2nfG;$cZha7^~Q*LlDa5grN~z)^69Zn z=u?k%eUcaoxk7GyoDCX1dK{mxQsj$|Jv^JF$5aMA)7}r1|B&)ZM827gTuywPFY2Mk zdU;nPAL-@$K0=++RK2`z`eBPGPmgJw&~s7M!s{;?b5T|K$f|{l>*`0==Uy`Mk};!d zt4CeT=u|H!0*$GnDPoXN4vo{c7u0xBmco}_&0QeAJdJT@^0{tcO&PrZusx)24Bz({`_w6w{?ThM17nH z@z3mT_^ZI!)%e-l4gN>n$eGyIVN#H~1sn;P34Q|7JJ%qHgLr0{l*d z_@@qtuJjh}24CNe{4(I}Qh&+0m6xFJC#!%T9A7BO7W~<9{LP?|oPs#KG}l{NJh!}J zNyQBdYXcQaN{c5}RWGh6oqv5*g*12W4U4K5&#ev2UlN!*m$P=sSYBOMQ$9aXA=Op{ z=0eIMY1!iHy1Us7Y1tmOQahsZmyYMF4YFg3G!dRq+@{zTws@gC4@pB_d zL>=bNonKp9fo3yKKWC^7EUALDMHP$CPRdqJY5$@curG)y86wbnMyt75S^&AV71AOu z15K`2yi}^It*WS?eE$0Ra~CXJJilt;kDx3=x zc_&Pqd-15zqsB;jI;SJqk-B))SQ>f;_8;FljYu2upN=!Jw2ny-c%ssNYQ%m{{01pW z@@-SY;vccb)Wlx~t*1)cZ< z{T3!mC^ZcgA(agC`y7&$bvm zm90O`F?hWXh_){VkB*E!tugqNC{~gV#^6(9@JC|sX)$;$29JRgeU8WAEm5o_wa4JC zF?dPz7qyATrT&;>@OB-E*cOA2-Deyz_+Bym&KNw|$NG~MgYT^)5ogEX`^4aLWAJ@r z@C7mWeld6@2H!shUlM~CM>|HH8G|QVMSteS;Lp>Mh%00817q+tF?eSTzCH#&CQORq%<`L43So)VYhh~lN%X(?QN2DA~JLqBI`hj_$!HWqV1hX zB(k2t6dlV+e*oihd z3R@Zc=^4GfqOh9-{|dk zGWeY+Ob#owKMIqh3hj@=xW?T^CbfI|DDFgc#kejUc> z92ut3>5eZi<6f#KCoO@S-@lA`YGt2baac#c^<9 z96UY_9vcUbjDv^9!I^Pz?>M+e9GnmbfAiDM`u-vgJ{AYR9|yk`2fq>r|2+=g69+#L z2mdt=zCRBBLmYfp9DHXS9FBvV;@}l=a9u1ME;`fDZdf*QnlCiTtf-&4gSjIE$v$=O zthOGQ>Tc_!C35goWnjX#QVi_isoH>f)-IObmGfmo#1ybAp<8SP)B(^^19P_FNu2a-^m4^3@mz4U# z39lAosSo#<%cAi!vCu_&zo<&m=j)a5co}t9!U?AUD|zjK-q;!*pft9IKkqmYtvC1e^( zi;<#wTuM&!>NE7(fVGicR#|-}fu*Ohw2`F`gLU;81Ere=;8#&Uj6CAn2<*QcX)j?D z`pjBg?kd1A73DRfVy%4AspNd2}W}mQ^*m(5sRYE?O!xuK~L2D!>l)h8(w*>PIu0SgCn|JYf zF(u@a&B5gcc}Su4(KIhddV^FAlFjWdSbn$)}Z& zF}OTSc3B&LhiV`hLGo472UIX?j(fIyj{7?ITv7&~Z)jY-JG@d>|4DKP>Mm%vqXSrp z)LtsF?l$5@sSptHs2_BflknO!!1`Oxx)dM>`_miHG6ue>}XZfaO9>| zQFfGmvZHlvAHs5pS+CrsK7Xkz3yX>mYIPJgy|{8^Va_u-U*o7PbA{@@oM!8z zeH&j4^a-9Sa9cgct)6|Pb?c+)NsTYoedKM}DHrEGTX$fAb@5Jw{g}w5E*qxh0_*iV z0aUpP7Fb{PxJDp7+vUV>xhorUI-Mr@Y&OZu*(9$5dN#J5oM-rWVC$*cu7s9DoWDi! zKg&d$nateDq5Qp8yDgY+EwB~_Tv=9oWwy1j)a9Z&AUsXQvw~f$UqvJsd*{zQnl!m9}#^%7p1?wBM zl>AGU4tvUgF|?iRUhG5;Y@^z=FEQ3>Kh=h{V@~ShNwNOErS?EnMBP(L!%nl3_d?x0 z)K|Nr^-=s0#s4L(cTOzw?bb(4*}SOpI~8?5UK`f5FZ80GJjsfp^=Z4_1eEx6?XzMZ z;qoEXp%-An z(SE{Yp#L!mz3N_V8DPvs*s2~^cGEM~#(g9ffH~}r_|$I-bH4P3J$uc2J+55z1|vDt zgAkdI@){2UrS}gekE__fKPNId>@mv=){~~y)6`-0k(9bm<>jtibZ=oea2~dhYS{-F zShhaVKL0F&l2D~WiN@sn0K?N{Z+N*&M&T+pQ|cT4M?Mw*=W0WV9aTnNz#saIX)d3- zpGnhh2F)8@1=$}#ma`DL`L zDVs(;+diiw2TM`?G==hWeaS~3<>MA$KGiY%GwVu|OI^pTJPe)mK2hiRj9>?*r*BHEK^Tn>f0uQ^jdd|#~vy0 z8gt!`yU@zu6{8gOtEYw|iMFC6+}6Uc8vZE*h)y{basgu^7Oc(lhRm3OEhank(4h}H z7l5VQ#djx~vDlOFi$P{3)=H?Z2625hSh;<{_Ba38>Th86H+-x9@^{t0<^Qev`~2u{ zsGe=oiXV!a5>98PE`3a=@zLw( zcj-gn`oLn&=8K~4hwU!=LTNAf!s&mfN-@>!gldxMxI7^El`Bw9>o)WvLodF*?bzR; z7+Ie+`^gmhw`a{PrWn5OGb`zAbB1Vq-q@L5mUqmXN0hv&UQV~gn)AZG7XBxA z$d)gaqbqBMCeBf**PS{iXSiFJxvwZ3% z7a5(TI`=g9RQJ{Hk{Q#dmS~rMLYCd`g0t1|Y&7jHTwP)L9jgx#8(2k<*cA1s z;TZ7UKC`+M)Te~|%d~-7r^6GiyX?Hy;crn-E9%?I>W@hqG2PtA%t@Rn(K{tD=qf>$ z6eMO+0xeqmLn7@eW(YHN{V)Nej>EVP!y74-PEugS|H~E9-v4JL0_9@E!Y{ToxNui{ zSXTsSjEt|VWxx(s5G9bilbn{m(A`Wg<{Led;Nn`la^8hv3I4L`~=g z(b}uX-gL}*+eUDN3nRtqhie0|WPNIe3CF*jFCVA6Xgj!=GRn1?mj52=UA zTc9-TlC`Tq^X9!>r(tGRVdmDLyj05B0)kI1$1GMqQLA7i{Lm3M5^ErO*u(nS$NbTo zTtQS6NUR2Q8tUA$>s*^b6+LUUZxH9AO}tCdm2IcU6Biyobpq=7&wn7T?roa{9Pg2~ zUmzLhuh9KZv?P)LDW8@l9Dv$!(hQ{^4~~-pPH!mf)12m`n7z$1T(45V63mxfb;mK# z&2;Wi=;WApvTncj5j2dW*u#i~|JTjtvse8_xKObQ@KG3O| zKA2Klh_0GkKJad3I5BM1QXJ6zn;0V*e=wGpyByHWCgQ>o&`I-w#CyWE>|mYcL!NA( z3j02~O2RQYUHvDPN+XVoG;49o)2kSsFaMq^ji%3oxlU{2Ouh(?A+O$Z2zwxqdJQf? zGBs&p1yKwz0rHmdwk_~lSK>IZgY_R{&eoer88#z>-aO*sP3zo5Sg(z&HA=i*RNkDjSihS*?PitbexO&PObKJt{~c=He;2y8*f?glJ9s%d z_BS$X;|OXaL^m9xCc-y`U!NUpu zF5+4eN43qwniYFrfV&u2fMtsRpVJio8(4zhrX|c5s&eIim+7euz|JbhLyFfp`bQSm_3=-~WppAu$T-2b zD*owa>!Tj~nQ;AEICaU^HMGX&54Sc35i`e@;-7*HeH1^g`$Or^G9Q-`E;XFlM*b7H zQmlnL*BauuT1*D)G74(8GL6bWSzjqCJZ))qPuTscJJ>ESO$dH9st%$piZT7G;5cW% zfeR9Kl9@ThSwG|mzg&x96kawsik`%Mc$f7zbXR}5Ag*T7`WyZW^@lt7yX!wG%@=~T zGzA{(BStu8q~qwd6i;~aTez=853C`zou`trOxi?fyu`7ozw$;SP!J}9$2uxlm63= zzRUGbA}y>_8=4Jp^f2d~5;8%w30q46n$eDCtU~SchX-!KEoL%WV2f{o?Z483baKg0 z5-o_U|9iatowP(FIf5Is{2_sb`L4hm)c6|s9lFpZ>5=IZx+F!4;oPk*2gioBGNBrTWE;R#CrSeUJLlQUDdwa)5D2_fWWX4^#zDxdL;^ zCwpy+)Rp@F)uA{fb|{MdqU~>8)GzJmE1mS$xqevP{#*5n8EAU_-u&+RHJma81}^K- z^kN{dEsbr3xEMZVtQ*pHITm^S+|!kg>umbCX&cQpRjd-OfS+`J-4EA!PfTVp{p%9h zfK2PGd5qJxi8$Fr_Zt~^$#9=z)4|oq7ntR+_tK9~4h1B<>oHCqVtsVX<$+Rq)ninkhFhMQ;bauTghG@!yo@4PA{z%1t}W39N>O_$!)*<1+4(nY30a zDJt#qx)e;^9XQS0N9$EE|MDS$2aay$dZhW}o}s9p@(W8cGhk!T`ZdbuzYe#kd*}oN zU(O!M7aqgbv7Ba~`evc}$%J5je^*`4!te@NQBQf)!yfgF_BHwoHw|NtbE+LwoE+cf z#KVkOHMV_1aCs(9Q+;;vJWdz&X-C!pVbtnxg0vp4flr70cqJ#fnAKl_;a1EZ=CCJ8+fvAH(%hn|E#0LWwo(Mk+>GPrOQQ+Jk7^zq%J!kpV;nee+2k~9SG@vzCOrN=@OJV# z+zv$4>+l>7B51Or{!?4^8u)QPdjs+nlD}aWXl^(hyy_u-yj8+gyWnOhz$TdQ(tZOz zFD~KoT0PdH<6c->-n@_N-VxrCe7nA zKS^)cO`z8_)_Poh8;%^#FAEHLl3umT_XPSsN$=(5`vUg-sZS!ev@HQJUZcT%wD1CX zaenuxyr1CB(7^OBN8~s?j*QxC)KA>)_`?K|gH+pza}CVr=v#VEIe(i(=NW!FL4uz~ ztniUgsWjT!5!1<({^<)Eb!KWN&N(&~Z*n;iQ^mA0>PnPi)^2$T{gZdx+Hf&uQ5U@_ z97pIvEl8}0D=}!a|G^LX@$0#0@Be~8S3Q-{R|D%VMKSeH&HG0msbluG9i}|t@sDLA z&$JhjhHGXJ)@9+EDMwOEg{+ttDA;<$Pdn-t)3i)bwSDyS66J^go67$Q(r%RRz?8ov z=S_Bh6)Kd-lZDmspzvm`Mz&CyIYb8Zcn{@^0OQWXD_5&pfyx1jD%-XX;ySG-p@d9S znT{EXn)H;Dy0{cs7g#@OR@8}f6>YT_*rMl)XNlwTXUxx4 zWKu$_%$F5P0UzEIQOis?HeVbXeYA(zN7WP{2BDnrWb{?~YwEt8+CX{V0bIoH!V6~Zk4lAQ;qgz}Hz&6-eO z?aKprA0vhOC8HIcTu1|95Df(I7un**!OdXKo8wsZo;x(d;SMd!z`}?fZG6rgs+;$;(rnPyMyVk7b-%7i|eoM5mMb; z;9};6eqRtOLMK`q4?qmPrpYyi9*0i=@5iBOE8r+>RSQwWjMqYCQcM-$OTWmMchqb3 z9HQC{43(L*Jk(C{XHJ?;yV*fy=Rb^1&Gk-EPw3yKgz_EQ@Ap&v4k`^t&FJ5{551uk zHtjYb>Fu30h|%Gw6??U`LzTOzon=yNLx-cs@EVP1sI`gSQK7~z0e->yn4`W`|GqPDe*Po)|C9b`)vh&>pMQ&BBPtJ%aIju_GnY#DcxtQ^a_v_j&eSs!8 z(|gHGya&H*Bs}I<)7lswd)Wwz#(zu^y)gGHG$lsojQ;}SpU(MHIsXow|Hdx(_ky_n zX3qcSg-rg36p{SPI`gyjuH#)>c<_I$G<;=#!i>(v`r}oYm1o9_0h z705(OK^^>{E1cL3C*rlz!Yl=^@X|sQng}|*7DKsd_Xj4|r;c#ZEt!MLAhMIaU&UU` z#@yJaG~pGx9iVlrPdKEzl+cZEuK6+UStgA4W7bBp;$in#8&e_tDUzrapwfDUcLU*5 zPii9=4x^juLI1XmPesG&O^dg6Iv0z12R`T*aI zXnzKZy;p%uXccY-RJ3{k)xBv7^*G*Sb70crS7|W87`+T?ur~DsiM@oH+p!_MoDO7!v)r|}YhM`+}IQsEMELI?{9*uko#T zpBJ5X6p{A9Gps?>pWCN%vY(S5BJy64#rpT{^`;KnF19wBw}FMU++#n%5Di?(*5ApY zj1Mu?0%M}frWTCvcE{UMh&T5sO&CEK+MBB58{ zm1XBR>Ydfl_4Xg}+Wz%?)|gAFw*64sPUC^CEU4Y}O#fIr0yDkp=QKE~l@P55A4bZu zb6!+V)?vyP=3-{IQZ>?!4u`$ZW=a6cFGGLSVgUhj7B;XCX0a0<-;xWYSvk#=M75qp z9k&0PSL-}pt<8wETd4`*9`_RYH=G<9%4$7^$bOK;`Crsmcqe&Hr=!|RXj!+FwH_VG z^xb`ZX^9gS1pEyh^-ZA)J$yaf5C6ONn`Tt0LCsT#? z@(MlaVha2Wkv5pu_d+7KaPn_Bc^i?99rc|?L-leo7)}SKX&1nPVf)Eb1<0t)BuQd( zOj}^BPM86i*y_w;*JB^lg?s!KYS{h_FKH|O_O2Q49ev2Mf?_5Js|==>ma62spSnZ_nct!);3voMr!zC`_T(E-y0Z>THkt4gTE z5h=k8VegUCcS;?#(fMIxD|t!FOsuuqpT3NnudF^Zz|y)b2`dTbdKg^#c#HL?V8u*x zq5amz!_YO^J7hCFLV8zUQE*OZR9X5o-*cbeLwoLSTA-?ZXb|nW+kgYYi)|K-z)zr5 z3C+UNdsw@Rv131_SICj)GTL0R2%PY#|D?^en6j#GVE@HFtzAJ7c37_pBcNe7gfp96 ze4~VQ@n{?RHW?kMZ+G7eVtsr0VD#<$-E7=^gtWd{zRk(Kh&+LlpCj^hd}KVu$p;Z> zLqP6IKYS+$n~t-V36sRe6!R=o*xwa;W1p=^>NiYDFch`BsWf#LwK?Epi{wddJ;Pxd z06EteS^*8gXrP8K1%))@00}b(rqrImc<6^I>I3ZpBGZd7uu?wJ`jHqggUiSa6Geq( z34LY7S{h)$d_xU&L*i|yZa-S8tL|whQ=O3-fBr6}y1x)v*crd)kFuQHl0 z=dlHKm03%9nyQ0sNT!7P$(*+Ko$wdbeje2)orhsLlLbeI`p?)>!Hn@yR4&X;(nxPb zonuqNreBer$+z5Db9Rx<`+3Y1VEbps_{FIZGshQNW>Xr@Bw2q#79V-C&X}!hHXzLw zBxcOBLSfG4YLByeGTYtSh<{}Piv!v3Fx(4sj*;zNjGe7SwD-!;h)-aD1}+sazO|!y ztb`Wfs0)8ibV8H8i`us;A&m8O7>Q0~t84W(?7^2}U(`KD-F&!N*o5LHmwkGN!?v!R zHhKe*T70O}{!8i}&266%O5QT_5-fK5Iab;J_viUT9|E6zSK0ZI0jo&c%Q$?{LYU!1 zm-d#akz-rWV?91~Ai8u6`Y3k&3XhT6HX~1*ej7fF-H(!5x$Xr)Le zN@%olS*^|b6Z%)kz3MACKag74@(^Jf@{x8<*4p61eg!0G`;}t(cyY)HlfEwf=&Wda zi$g9Kxi_y+Lem^xyaR>B0wS_tF}z0#hlMfCiHV@~LIaouK?_C9z!&}GGuGx7ht4ln zkNebj*heaO+50fP!eQ3h@zE$-hrB8(iHbGkYf`|YG#K$Q%5Kc17;%b>WBOr@UJ+=! z5WNGH=0ShkS5YIvV^?HSG(Lhzd*>G@Iq0}i{6uXdj!|6_?9O$qScE{14GT$Mn!qmV>FrS zv4Y^<77I$K4r}sZ$_O38Jd^4U6=OW#z)v$UBPTy8=C7L)SYPrGd$9^D@MX|S?8Sk` zwrn26)(v8AW^EbnkY>%n_fh1n!S>?54&SGoJV^T)w~J`S2IN6~P>I~hs_DehJD|EJ z(fsXia*a&LV5*yiNV^9`YIbM@JijEKL!9S4&NGd8ZUv9{UIsT)%iJ?C0^QTmcy}3T zhQ5~Ns{t$bKQnLtS@#%5MC@$s%0ChPKSJkqemrV%I%O-#c- zPGD^$i*cD7UA02-!0@PU<90B%Brah)Di>1sH>wma z%V~XVH`a~*4hb8XgmRM57QoP?d9SE1wN=tEJzL>{n_3d9Shn#j8~XF?{DWE&>ll9z zoxde+i<_T`?cPuwRJ6BP{YLvUuyiAW`9!amu+Q{x3)p$piLPI9>n9tLs3>-dr*Pbo zv~`fC`0@9Gz`oQ7BcWKcOWgDTPKD4ILtj(s<;jKWsu#Mv1p}+#>3)Pre>sIpC zC1Kw2cEKn|vmBk9)i1VLm#|iy(Ow1*wTge(r-TYJPzoFvWOQjU>!02pull9Ya}Ii+-7b zdy$xanThP*?w6jT1=KH?F1%k@3lw!P_J$vC7#~&mHyH3X z;|T3d)Wz#xi9Xz;s56~#K+}qh5r?*BF)uu(JbbhOZQ281hWTPEY$e>j-+oADbfHPedm=)Uq^`k0iS_%tDlP5}s%b_uVmmsJ1>w*pUJAnfjOPvuWbG zV(g8DnB=%GL=>JB$ve2DhoX)+ObZTHn+5CTFV(RMvCy5vVN{s>m@>4Ugc7b{CFY~+Fm`u529bGh)qRLM6cB+G-1Y~c1^@VA zK(}pRhyqssPX14aCqyd)CR|}tWaTa7s8Cj>X>Vff9)T5S@aCN;9FY+POs zCe8S3b03c!j({Dna4X?PSCHj}1Cvd@Y;8mvaov*3%w26i^1y!bK{!S@E)2Cz@8PCk z{F;dZT zU8_%$A-!^rrDdlc+W{#}d*@M7 z#wi#tqrIUqsP?#5Qsl>TK8%wJ?AJM-9E5qvOiZF&@x&_qWu@V1;cahZ=} z{B3K2^x^e?h{lVZtO;)QkP1VqK*F9!7eSe5f>+&%ab1MZvT*SOy;OSrU$c?@l^nRx z9lj}cWMky_p>a(g3sovI`!IiP+Bh26?}z3%3gzeBxaFaCyYmh&|0TWhiaPFz`A7-FE!GU{P&Xg67#T-ex=H-NLlZJW^VY+Px* zF)T5JLJ1!iVBIN+r+%QVei!cY zJLG1p9Er$$g$2FTqB=tx( zbq4z$3$gMM>$rlZX9B}Wp$eT7!x?*MtfGp)fJl4`3JRKppoB}04yQ0_7D(mx;H%}hR7{u?bl4eEjH~= zmbgp{vlt4{{QrOneFh-ACBG2MLvXpPNIIcdhc}~jYoaAqbko+ zwji+TL24f(=uJbDki8ikIcVvKR&6HuPFQWgGd>WvgUHr%Egv-chF~B1F8cO_wdpt1 zm8*BtN*uFfvw;VjI}rnfz2 zppdpdV4$Pu6ZpppMLV>o(C(wF+4zD~ENKSYw>seD`HVj%PaMc(tcNO6EboLMUklS4(<74d^GD%VGctSj^HPd#F zEvi7l_ley|)A8E>;3$lXA#4xUM?XUX-`3){lznnE8{d?vAJU67K~$AqnAyx?@gcLy zzayg$1-1guRJt4gs0{TRwJq9jc(Y{nZfZXD*)FYMtM0$>;a(;edkQ}u!l~&lb<+#{ z;gN@cp5`0&4Ot*s^?eY!^BZGeAicW~gdnW1^-nt$`$+Ulyh zz{2XqQrR?jQDKVYDV#QOs<))nd)1T_s402WMYYv8R$o7Vu`_>U?d8rz^J|>>oibjY zLVQm5k{jw4RV)tFI+raBR4xSj<<9v_DxB3dBz=ArF%ci0k+t;O>G9)_(bhTxmH3$2 z>qM27RxIHeh^td^Jlp)m3m4(<`|>P$6PydG>lT+gufMqqL1l|?TwJ|uv6KEtu9N=C z?tDM~ze{LNqIf`wJ6@)BqH!X*{{K=qQFQ=}#JO9N7A;nZTOp8b(v z{9WDZB?|*LJI6bRmP;nyEU9*h|DyQ|FRGkhTN$9gRXoa%zcO52;T$yHIi<|!lNd4z zEm*juHV}pIr-P&ErSq%mI&xJ8<}R$AyAXe3cp>|PyyaQ775?hQ<-??JQ<%)I2(0K~ zyappLr&`rUi_@{S_-nt;{P9l4JMwb>{F?cGv{5t;(OeXWjDaQ9H_s&z9Tc7-x*y67 zRB$rEwUyO%Rpp5ASC(&#%Me4qVM+BeY7hQ2bH$RSLNZ{qykb#}s04{;e|%ZU0bH?U zKK_hx2Mop32If{(SKnAyL-It5Gf@8O#R2^7;#!6Pj3oY`az}pAyeNO|viVF7`!mlh zKmK?!V*IUT6cG1h3D_*+lxbJ_%4iae>om^44G8|^!up!|i_0s@ovee#Ifq_Qo|0Tt zu^6ok#9=*kHB}4!@n~siEoR~}NuLd)0`&oDBJ}`71~3mR7PH|^eA2X1cj>foPAPes znEp;*#o`+Rl_kWY zeiez-AYJ+ENMs}8dc<21n|~XL>_fa3G5s4O^}mZmXd)d%>_BY(LnP9Scpu_+#94nt zz68LCTM=h%ffow#HpKW-$&%ww$cH!=@d(5-5f>m{i+DETcEoEDD}TnnjzxIH`w*M& zjYJM1-gZCoCBd)Y8&W4q_)_1uqqjL2Rb?9uaRtJR5O6UP*lf z@j=A<5G#0-d|nU8L%bewJL3Bguf?0``w(a0qk_*7A4Kf2pgepw5kNe%6)%<`-iY{l z#9I&_L3|ML*NDydOvQn}nUafm4B~dgHHej$(GJ815g$an%tuMt<`;zNN4b|d0)a^xajkN6-iI}RbveLE64j#xo#g70`6u7)bfhkOL>MqK|+ zBw|hnKOFpH5U+)+dpY8nxHQ;}IO~1%M{mf%y;LdUjfmGGZb$qG;w>Md9*DJLsBa(C z6Ce87@HbxS5ziEVyclBGBma1+B-h*I0clC*_3&*I9&evWS(rl?5r-!U8j>Uz!We{- zjgiP^Tw_QU+a!x)vNd&?IVfGxf86lVuED^v{Ie17`z6XGgm_490HGQ9^^{*cBy$}? z?p={c9pQ>Cwg$u1DZ4D@!qhU0*}ZELA!ei?nR*Sd#Djb4j-$5@rTlT9h^H42ncO&#&uo-=hG}V7T8d;QDYjJoiPLCzaW6Abday^y;k45oV zO1u`*=OYL^kZ&LIU4xj~_cOx;i{m!q1dB6lnqbLVm*BQ!uSs-UavPG6+i-1)B^MaC zB?}zjoM5p{u$U*OLhKYviN`Y2W0~i%RC+8m9!tFk%9&y*nA{!BXDPVKqWHSZ$7s3U zZxw}FvN07vf7Do~jss`1(%Wbi_E#@*(auz@*XfDvo ziN@+$XmPADqGwj6PzR9;-B=rm*9YE8@J^2Mx{3Eni}Qv~yi|{R@U8>z6~v2&aO;5E z23&w)AP@0oD*x_CBjzeDKJ(0+Tq6{h*|MI%D88|ln z1Rw2-KJ0(7xDmj$1Gg_GZvk+RU|-a6V?Zkft_FKx4;q(>CEIW>dbcpu8#9PwN85Z$ zHlGLUkdOAve>LB3bbElxv?&}u`ao>E_uI0z#_}M z8~Lh*o~FJyh&pD#uBbqNf5+NTY&jy=STwAE#}V2Qf>{BF=C*h*gXXM9@= z%PFumMUE8 zZUk`6gup|%D&P*r;ex<5;?0s~V!}gw8-UA(P1{TeJcQc<+#%pLG7QJ<0IqUdXIv|A zpU2_e11|V@XTEme(zZt;PsGSegYCQxxIYVADPkvZrLd>jI>`1|tpBllEOuwH#~N0r zd~3^_kXl5$cc&efwWl6(cR()Nvrx_kgmq-Q<5K#2%vl<)#@A&Gvmy-GBFjF6R)m8H z9W(W6a20(Ak6}KT4A`J@Cw;5-g{jgA)XRl4#E~Z>k$R+Q{H-%!4`O>@gUN8c#eppo zyC4y9RzWBQe>Tn@Y`pkryv$={qQUnec|iLqF|)CR>4>~p0M~)G4YZ#N+8QdS!B}K* z8m__y%6I0XRJJc}1Mdi&U;a$IS4V9hFWEk9&a-}j-NbF5o4PW6+`C$y|NH(ISR2h) zPu4-+YLds=$o6hb8?>>ImySl#F-j^x$VK8~@V|pJmH(|diSi9UjhlGx)EbMK3gzQ> zIb>|a+3RwWfrrNVdf;{ghoQh8(%Id>H3K)4FkB1Qk$pn6X3$>lhIR-vtqWQ%^3i$j zYtSAfnH_5i+PlUC3$Y=A>RC6{=Iua?0+9YSOJ8O)$%U!N*?o_IO5V9I^ zzFbT7Ae+vO#T|PX(KdnB4%#z1?N&~s`fmg6KAc1UNVM+ie-r9IF=pX|T*~`7@;X~0 zk^4p7b+Gy|o_SwSLtjH4`noU`b#Y9Lns_X4b`Q+e?(*VvA|}J6uJTqPFP)XUEcYyV zX${_jyvvby4b_>?n+aSSeB97E`eV>X6TQ@8qp@@dI0w$)w6@bjxZ}XNfWz^WJ%lsi zES(*LBi%cI%Lgu#xLA3mYz~vGF`yNIHkfEvT5K@4nQR~MGl6GE%c;B$^MEVY<;=9$ zX#CLGzJ_qZemd*9rNrYL4w^*LnCCRr=EP9FiT;JJ=-^*oUF0hbTlqVJ=J62skHmZ_xP0{q0TbnQbK zBTymo<%|+#+(vdtn9iH)Xw6td=go#h!vlQPz&;6c1LtTj%>|l=;N}L%B)*0(hrBHK zfL22`jia9#*xp(gUBf%hucW7`U3Q&V!>Ny+hrCM2n@#m&eS~?<_m4&BBplXwCwV|_ z2k$2MoAmV~w(M`6olCGsbuny64*7*l@K?1W{hfVXVz|Gnp-ghfkF*YQp6)D%=_0N^ zICLBSw>vqlkdqGoSW4${(3Ko`K@9)ss$JQrg9Co4Ly$9_>ce!&_Totv=j`ZspP1^` zcV&M5MIQ3Wv9Ss_#Tvsz(*G2T^GD#@1@*VEHH6w*58iz6vix!rN zd+->p0@K_Sw!v{5%$-WQeHryTj`~#~&2{1>o3&$JG22KX+X(Y&aaXEk>v;widk1`? zI75kVxq8({XUCfME*o$H^mXkL)>E%j13mo_QZn3=ptc#Pp{C z>6s_!v{%!k)4w7XF!dw-J1CEUJJt7y26-zN&v>rMZn8$GdhD8affP3Jou;q3!EL!A*Y*~j!m z1gzKdxPV_24gD&P&U5|eek(=4#7oR}a!i4UOGG?R#5E!gig>++OO&6URBT%C4_l9H?{VWRDs> zDtly39RqWQ2?RTw8CV`ZPPCtx0n`V8Yt{dgt6m4nx3CFU9D4_?Sw&U}lLBRD_1#$$*eA@DGxizhq%a()-g zU@m{_NKOu!I*8zD_NKPgQ0cKF9{Df zbKb@A63FG_n_T2}Ph8O$iGZ z2SB4yPqZV5O!HaVFoZIjS!W^h5FiuGmH173A3w4!VH%?NIV*3XFL9EF;YYSvhyzv} zdy=kZxIsie2F#lXtlbVEl4={Igo`mBuWU4bG zX9bCdC*kWD@=+idxnGcIcoNKFRV3kbv|!|tAR~gD9z&*HW#oFDoaBrlGtw5FB$?@- zH>6-lOOy(+hMJ@+0SS%%9!WNKg#dj~{tadLff_ZLZ$!1lC{EyMHi}K=3L1p z*3>LS@q3rN$p}fQ)CT;q3gR%_E~Vl1FMuPcdVQ!MgdR@_1rz@r;IqhO#@jcql6tJC zWLqg@a#0O2j2K%xr8PB|KcFE|0!k*w1M{tDnF+b5t< zFbqkvy^ffIVQ`vFpM{40iMIW~Q7|~uY`;KE!7wPz{xD(+QXNE@q$&6n11S|r8c6d* zS^91r0{+}U;sePAUC0@Ux{9_zUG&JC=nKMBjG2t{Xv};Aw$Bh!>wy_cnB~~&mLR0D zftGPG4YbpMKSk*Ap3wMIWa;s#0ImaIIW2%20a)cSIR}Gz1k$oK(K(z-mZWQ_Gx5lq zC_9&L%^>-AV~_hOg6##tItEBHmt8ZHLj0w8GM#hZP0)cxGR z;{$IpbR-X8E0|2?3tzAX45fZf!?+u8F^#e`jJE-Kl#+T}OF8(Orz>_75%9>H27_qf zYu+Fdp(IMu#R%3CkZlVkxmPMl`FoNi?Ln|_7X2)CK*{zaNls5AmeDXhMk4g2;j>k+ z$$BCM9Q4S&Exl%eVKq2cA@m{(;~pgLCV+O#za#Ms0zK&@%Q=Dr*YOCIW_%-)@h9gI zn1lclH3X3C2axzP0yZNI9Fz2C{E88Fmp;OTOtLoU$xirBj zZ;*$xyftJS5&BRgo5iq_kAO$+W9s`6 zko30aB!s?404zmf2?4JXI}$q(9F&*-J!bYkGPBt#XOxoAE2G?j%YlTn1{wfxZ(c zJr3!_;$Al}9%hXvn#lv(*%~*~FfT|-u~WN~$r?{eO=gbT6tc#X(o*h59&<8T<4HXj zU`r-zJV{vN$zKsgSmViL`6dZ#JejQVB)gR)XQhxeo+PaCWU|JSgf*W04zcOhc%nIo z@)F4WP3mnTgDI6v1o;{^v2DV$av|{a$eaEIM%vJ>VJnbaMqAo7Yz>l2d$1{d&G0GU z8H>xj(FjuN2@-cjDk0}x#H2{m=L5a5H;J(o_UnGo)1`Sg;rLjR_8D=6qB#6pc6)!|e-w(amP+QsCBOPt&eH8FM)N=&F_uDdt&h8L`8^y7RSSc?WM$^A%d*he&aBWZoY_0L8S`N zF4^5H6{YvS5`@Q4{9h3I62UP8m?3?T2f^V7umOoX2vHLwB!TXtV5At(j^1Gq9tX!` z2)$PWz#l`A-a_crAj-Uo>&p0Gq#K{d6nfjG;4$macOglAc`0yF1t&`1oZi+}5^aiqgUQ#UxG7Zqok4VgU z%m{JP+A2HQ66`GOf%G7@PDmN=5R;YXq7j+N)*ovItv^mCfm3DI z2_p@fO!AHzhV`OcnG;xgAQ1;kgVF#QUGnY3N}ZLtA0--HtgV@o8L@8#h?&$^M%U0L zq@^L$0Dbd1pD=jjO>UU?E}Bs;nn`T7U4jd{F$nhO#m2fC1BE`uA+=wO*^z9tuIBl% zD8aty^{QZu9cQe(BZ5%Q*-_qWu<=K zJ3Z|H>cOV-W#Gy~VAI);#9V}4p9}Vm>0A~&ouyH{B60~y>zDdRstrx&-y!oRguX;z z)A>_CM-kX`E`V=;90HrpJ%td%W)d( zB-SJJx>@AyUIjM@4pPAeNRF!Dmx2(hf*~~V>5mlABQ8cT&gdM`n>Mn?Q08B$612s& zA#oUiZEQ;iO44EkX$UQFM}&v~6GT&kwraM-eF~<-2yBUyFxS`;moNy!)Jfb!6EM$C z18}C$Eg}lZ0}Pf6XnOYtU>J~g0nOhV5sdw9=j%piGF&6)lT}S2Wxkwt zzHXbQz&4fEfZZe=LO$v&>{Fq`gzBAmK1MWxlyVnk%VpV`N5^NQ*6?h(%u{tK zvW#Wfwox`0%O;6z+oGjWMR_)ti}e7qEMVDwM%ipEn?83svQayDHXEyCArk|52(~=KFW3<=!JKGr0!}|9 zQrh$)RxjhDJujm)9T-jgz-T5b;$T9KIUAZ!o(DrOVKloUk&>4nN5Un^tB}K-j0*`V z;Zg?Jk_QnbmjRCCRRrWQz?n>6=_ZV0KvuGcq+P~KAK709zS`4|CnQ|Rf0^y#efrX7Z;enu(CsgdeI`j|oT+ zHXlIhE)gz*+EvL?Z+U`H13eiGeELu66s0VUP6_ye@a=OlpO>a>>I&g+{tMs z`yCu&v_yL<<$Idb%=SL05FkcNvD3&i?v_(XN}7Ed$=oZaP;oXpy^?6$C#R4pn{Lk_ z&gbN$y@(xlBX%<5^Bn4Dzl>;q=TLw9uL;`Ep#gR)mG=UNGVHgK%vKI%+Fu~f0~|Wf zej9PV$f1FDI^r5%;*ir`OZi@wnGx@@R}t-1+4>UVEc1-%7?P49I;|gB+fQ2rBt%sOJG>Gkt%E%0Md-_ z%E_b(JGq#Q@5#M+uaHFtXfW@U-%+;rIn87rOSJbnEzuq!=mSnO+uy_31H|&BUeGnrG_Y?gYFo5`G( zLMKb^W-|9+0CzK)W8F;VST~b7*3D$LTS;kA>UT9j30m~dgM*3kfjeh zS$c;O2dsgVJ zj&}v24Fty!TFmi$LBMJO$k=mWkm6S!z`SSc1%Z7G1)98xiXOm@n*;ig{;tlFq#}gA ztoqJ0s{U($_Ym#|YIHVh!^vT|ibTlR3S1&4b0!YYIVp7B^bMD!2?&n*@qqB8P&Lj= zxSRpfARb9{j-*TznA_`ZWH^X0aFAf@i%k8=*#*_u^LZW@aPyFjso?lZkPSF#JEjV9 zHpu;cC4hVYYjobNE2Vy^qBaT$f8c~<<3+1QZTej%$Ymh!V&qc8N|bapoMDnB_m`)l-i|GTZ#noJ_X|KJ2~P^(=KzM8c|&vXnS?<9o_IbN zz*YcL1rL)9MoB2?3D6w6VxOg4;{@e30PA_K1ULgXn9!1h+t(o>^=lA3FQaei6F?ei zE1>#!1)eknT#R-k=X2ntU>s`97({PJP%sZn8{`3!g8729L3Ghf!8|N!&{2#F3T9W* zVBHjQCIi93Ph_j}UJPam#=8s|gUBaK!Q3xx5Z%g9FkhH7h%O~5n9oadzJis9LduT~ z7Uv-(C>WnG407HNxfG1=0q{X41>=(dK0wtd7$+GroOc6D!T2`?CN+VTld^e0=AH(BUtG=@1*De z$wnf2rX2^)M%Q<_@a@qJqfG&D4-&s4fUf!8MdA>Gy+;8nLBDLk3J&id`NO#Aj|EvO zA<@0ku0%bU=o~nIMj|lLtC3hi0EvDAiN_G^2KQM-zaYpGxvb%*yhj&pfw$d^z(n7Q z#E%Ie(Hau(A=uxK6J5({y%Od1B85COftM_`lIY%Pti~?vq~{?pv1^f7LjZ~W3lel8 zW8W+CiJKQ}uDUX$bdtMuBA0tmh?h4JCzEj$`QImjr0VfGxJp7`<=&2jieUdj;oVx*U%KcMc)AF9gVlS5c)kM1nAb= zUqS4TEo_F&4SVq1i7?<3!8fUwB>fRQ8O$q?DPPSCo(8m(`LJM`2Pku!02UGOgaCd_ zfL`WL0G#I#5;g!phf^OXGHv#KiW)IQPRuUmWpwyU=!TKEafm#Sa(p!!h7W>c7fuGq zlf4RAa&S>H5@8^7DGilV$ftB85DN*(+$a}tkKYC$ZX+afGmYeqzxRPSjNr84B>q>_ zh18M-7bryM;sRw9LgqW7Zoj44I}5=1C3=Q9$H@K2klPQg-3ZPa&<=w(kolm-%gpKQ zxfBjY1m|W@2a23|GCMG>2L2X=L3dAq96Y3Yu6Aiag}^-koE!Nv;5}H*sTt__9BDv} z;P@Lju8DF;nRNoc5BSX00wCoN*d+k!%R5;Pyu#$%V9JoMHr<{9pT&S{uHrR$1swMa znXq&Q{6^s40e&yXn{L-uCQ5@&3(7H2P{)Kc=Wn4&X;6X~52QEXO}8Hew=`h2Q0FP2 zdqX84#W+9)JSfOXu#QGEGMy4oKYHgq^Kn5<2X%l^G-lBM!`+*}S5;m6KzTdU?xw$t4hv)0(|33fw$+~xsYp=c5+Iz3P_C65Q) zsbc_DuX18PBr>$B>(VfE40d}PTRfb132;{~LB@+H{yd;^5h9b|8I1y}*~1dAhX+_? zcgAv7Vb5+siM;^n+3yf|k`eaIk2TK6b*^~1sho^dYs@{S^;Kx&6F>vips*;-eiVM# zWV6G?ub9YRP}UlMH{1T2Fvv0)H^mslj%jgyZ44PS4NXq~Xa;@lB+Ve{Orxo6olS&y zWlTahjZs*{Q+p=2WsPp4=-X>e4Zx4Ph`B{5&z6w zTs;B^@r9Tn3IIaXfB=rbCF9m`&fF`LYo}WFY zvbB#SZOXVDRfV4xmgIk;j*v7Hkr@CXX(a+H09Nr=P309r(wB+hTp?-Y>Bz?CuzVwV zH}yx8bZ!Yn{7E3#0nj9!J5_V3hWh$@Q`zbv!d0n4&KoHEDnQ67hi7IoK*%`{fpY+m z=oT_%rj{t#q$N7DNOVdhIcuRXtV6tRxR;)UWy4ZR=tkY=~P^M$#l*+ z_W8nr%hAV;>}M?rjxNyU567xqp8O;g$&P34#$T|;M zivZKlLBu}4hQ()|W;(Htt&MjpnfGH9Is%Yd0hI6ogt%6(_)!+0mL}X;hQy@+A?~vX z+{g%tJA}Xk0DNkxh5K~aIxI=Ru=@y!8-=VFko6Q``UFHk9E-nWisPvzq|J0InRfz-Fb=Tmj@=Tmj@M^bggC{J+eoWeTq6fGI2Xm#<2Rdw-) zRdw-)RWss_>}JFr+0{J`wh}^*+bMP40b2?V*y`dB*y`dB*y`dB*y?zMM&L2p$=*Sq z6;7rT@c}4;IV@=lYA53GH#w{w3r+kVI&nuh4hw*tf)Hpe_ZNuao>L9NN!}fnJ%|Ki zcUbs5bui%$OEBRMOEBRMOK=xE`dxib#SOw)%3CXP_azWaxWgj1r($fjExFfw;-=9m~e+Bm~e+Bm~e+Bm~e+B=-pxYI6{-h7z1?blomW@<=ITlsFKqeE)s?ho zSS)sRg_lr4yg)9!K&mjW19igM3&b&^ z#-#Cqx(x9GWr!CjlU|?D#;F~;l&@8n~_CiQ84{!B)Yu7;b!GBoH`oea8e|& zovkfE&7>@GXjy54$VtkUh(GNrMsh+d6#$x#k5zY#yg7Z-)7p|LiLdF=_)loqHEK}^ZAj%cIjY3bG zmhA&TY_Cn{9gb1d-g8j?3_uPu3iFWial}3bC>)2#0R;8~ioBM65a!*eT#UWOm1yc( z(-dzDmFzK*hY=~pb~X4e+Rr~Xj+&AS<033_6?@_joQYmWPenERoFIE_SEKRK>ku77 zzKr3G7yG(sASJ8*(0b^xzF~5Sj zOR%Rp13(5Y5LGyc*gb$8D_OJu^fb1Zgnh9B;zsg(8yxC4V!; zeg@jWC*DOWNJIFrNw?<$y}iiI2N9!6kZ~nyUCx?6G$o#tnm8vUo3{Y>IM(-aeO>@) zCc0G>0M9B<7|c>;|P zd@U*E{yn~AtKv1po(BZ2$?>M{Wbc8N03K+uelro8YF(NQ{Q4zY&!DLn(beH^>nbb* z?r_qlL-^6Ap~GA1&d+meP}-mP;w)qFjd%{7Z~*`};kTlCk{s`t({CNtZ`eu-+>UH_ zFTR4luzwL+ceX=_{*v@>OT9<%oqRgJ{u2-)F8u}f6^dR65&NT=e?mAZ@MnA{Gu^>T z9ak#lr|5E?e_Xf@>8VqRy)=ViJW7lg2>Hj$#o0hAN2Y&*M8ZHvEDo#sCpruVcxxkt z|4nMHe{z_Q*x?&c z5wSu>GP*n0Ffv76An-NdN2HGAW@dwP_8oRI5oeMo_I?w|V&qO+D9n6`qy8=(0Re0; z!hft~588@SncIpld|uE$7(n0Pq$orT+M`Is!x$o)} z`Oi$mB7(J~8iV`y=)+1@zs2_PnU=z25Lx&(QVV&9sfc;SxkzgPhGszVI7Dto;5J68 z5&1a+KVf7xA{khdQvoGMFroa&G-wa9g?sF9-U~==K=wjF-fs};L7)qOPrkiMeyx2% zA0Gk7LjD`_cZcS${S+wFGTmVpiGZnE$et`(7kz<+x0%B4#tLt<$FZ=L{u!3u1m&o} zq#qWkZ?a1$_0jW?H5;ixr)ofxVU4)~0j7kkXLf`*(b9nVOi_?>;;Ti(PYYhnQgOi`*o5dXqFjWm72@!i9D6m`g^CAK>Q88*Lk+e_@R?1JFoWwW5O(!*nJ z-U~;VCFnA&z+8l*Q`nWW4Z7=M=+3rB$IxlAwt48HV_0Resq%2F%3^!8M6Mx$i|q>O z@I)P%BYaB=@ZDq4KT-(u?EtxK|0Py`zCDKZHQ(pkl~QF~8w;PL3wski+~V@FcXQjC zwSsM&WS6kQ=b?@_0J1n!A+eH;yo7}306Bw1R;Nef9Gq!P2jphR zWIJ#zsux@Ud;n|QBP?32)#o)JS080K1MsAi^m0Q{9yJ;uP6T}V<5~%gW-R$qm%7oiCjPe zC)-mP$rM{9lo`{=sZ{4c2cxTW0Cml7<+atXXe?MW`pU<)@JFF@WePk7|R?pi!*xHzQhO@Y-Gg zeU*=$ZTqrNAa6guehUmw0IUg}ru?}+%uC1tvx>p2zt#M${H^l9PkyXF#eunhD=$T& zHMP{r|D>t&faY<~dE#o_1}bCt#Ugk>I@`uw{2>yt>EN_Nx@8b0?$PZ=8UCzQ8+)RkiHdXJKE! z3XnNvQI5Z3!oKht&9(|#|Ju7}!i3T6J0|R_YDPx@lVyH6HlAa$@n&m{MOSXsv> zf$!r1vW~AoU?rg9R8!pW+N$J&aEVE@y+DTUon=3lL<=tO9u(S*>NgYLt%y8~097gP zW<*{<;5k6WmBW#9jsKK~+zS+V$Y1tXLoxGG{V-J_vt&TkXH97u8C84ZBKfz*MM(Wd zped)b@S7$B?+ye9{v7Bh(mZ5L1Hwu`5i{~j+H|{Dmtgb9Y&tbifJV!AJQQ94GLet{ zT9B{S%6lD!E&-|zK>lN^Zv7_}m^L_c-$gx9zY}ZjZ$T3mHnD(^l<84kR66B__$6`_PT+0a{5Po=GL$yuz~9 z0<@BTFU&fpwBXh?Kr7@UqL5c0ei=X%QX39O;}vp>Y2E4J{P5#s{+k<7$U~@fA3zlH zF9^I2sHio?H6tMpDrA#Mw7mdu$jAO^QY-OMAHfVLW0~^D`u-?HIyZ zOn1qa=+2dRg$Y25=`OK0uWf~o1E9t9?=o+kxe8`GK#S>si0L}ScK}38Hvn3qVWg3nHPW zHvG#dfR^NLk>pK?-v|(?X}jPxPii!t?lG-9Ph;7!_xR>xW)pjf?)7`!^JM6ClE^ZbxxI#S^A@f^h%KB-&meCfu(jJx6>TgB_^879hg?Gye=(T8>vt;F$g1T1Xx+QFe=0Ol8_*>yQS}vb|Dd`&I`Y zRs?9-UL~>}eKD3IK-`G5wzFwSfwKLIp~yMP?f6z-Gy+!A7H&qRr2wm(*E1hC#r)Xv zTJ|;WY8K9(sRak=Mj@dM=jC#CeP}uyp-1f(lZzT%u{qINhZvjL- z{u6=U0xJGuic>w|36Fw?_8 z()$GeR($itd(bR-sM2Wi?{Ywu^Sx zh~s0e4vQylos0z0cD)S@Z`Wj4We0;mdcGi~z0A*J`Um6ikvxnq+4G*C$8q>P*z!BT zMA^QcKZ$8)ug7K(AlQG23PC4ou*+DgF<9+r3R+s?>&yY4IhO80rEdVNN)EaCrkKwQ zKn>($U*Oy8Re1u%f5j^0^RaJkGF9BOiFujtc^2c5%sVLZPe9(eh?I6=1pySXRB`azn-KUcpopae&36!c2w>1$;h{N9G|PSc9-3!S z=Jxq?>!W)KYTUw7)jhm`vUO5zz5)Ikd^=U zxav~%YbUIFL1I;HKu{yafJm|eROhk+isy8_@HA;EuG2qI_-FGyg+E;s{u}7S?EtOt zr;EZDUJ4HaAWq@SjKYg1-)XSgUH}cs$6n;?0De*aZ9uREU`-0fb?`Q1zfUI@NhiGq zt^BgM>QZ&f3Hh@yv8q+JJQ=Jg6IPskfu`|vjA(xB-Crv5SWzad_$H{m1)y0`Cal0? zjn*2#6q#iv$}CfkX|fcc*V{=l3++PudO#e@s^VGJWm>nrKy2`r`*s%?mi-V2jsUE3 zy7WJ8s`#roD^7J^VljI3Uq_Kw0OI;6?}yt8kpBf!+_*mcS6b7?8Rv(rLQ~)Yl1~rO z%?^x5?`0Lb9JMzBWEHvxfdhyS~)B^H$vls$BfFf2dK8lok5IX?K<$Aow;I>~Q?oQkH+9*`y zBK$InyaNSu8+R2v{8@p1(E0r@{N#l4ZZacCsw*I%G}5VMX> z)lyR?)}4USyWz{8lYEX= zu5F%TTDA12RUOyJ^K67Jvp=JOSJ=ps58lWHx{;Mbjl7HguRN}i#wZ%0FEIZK%sPPl zYlb(n`h>$|vu>nns1fewtP9B`JQJvYz^*$-qmi#5>vS}53ZVD^BA-X#21Xu4~vnei;zcMa@aVieaN_OiylMxF*Jo15^zSryEEkOPyz;t$SIy*L<9m>De zRF0{~iMJ6Ki@L|GcB|@&IEt)V8qkAqBJz`^f573RAfS#+!4pNbG?)*VA{ntFNn=oi zR07Y% z0LX5)6@g`din0|6I5F__xt@&Sxh69=hB`VH2)ISR83D(b$-`d67UF<-Z-Pdj0oSKrnM?A?1xQJ+@8jIA(S0Ae3xZ9_glEQfz0 z@JB{yQ~cp-%lZ$1*a@E>z}NxET5h$V4nDRQh^^(Y8K#UwecBAqqWJFtvX%$8V}t=@ zEw4ae3LrmX5NVqMYx(_pE$7xc&UWyM`Mf}yZeMJNo4xjy0ONUVf{udA5!l2CZHK)G zd=Zd8Is$F%2_31B9z(W7AG z!{jXO)XR6^;s`)2*z9X?s}dl#?J)#?01%_~QG?Dp3dzNc*1>Dxy9S8rjr$k^1RAaP zBJg!asIHCJLd^mcv9c)RD~SCGAj&v-rB(*p3&fNI%J{%|AfYmrejHmhfG9@;0t*?T za$JhQdO-dRgJ`%iYQu61T9Nj=Vm>brYY&F(gbAj-JAm=)Y=X*o6oH>I!uI}xz?*>l z(-YehHKgw;d{3oH|fIQy+`V<1!Fo74p-az1GM#dpB>r*(p2gt>*H3+O^gcrZQhQL06T>RQ@ zTD7aND90{-y@~AC0eZ2#9!3}d#`GN_SQ3DMHPgEbs&E&yzBL6mS^@6dl={n%Pe@vj zdNR#h{krm*-tA7s+nw(e;x3?7oDWR;cIWR?_3h5#|6BFR88CqZ{xgA3u65$&!*fB1 z_YlzgU*t@@0P65fLh7b`xDhOehJ*V2C<%{7`)ap@arJXIvXkV^x!%>!uS*3Ka+4y1 zl6wH(?sxH(_(G7Rz;n#_4Zeatzkds=Bn56kELq-{oKzjS93lv4PMR(eyx)vDbrQ)7ZDnMJM4}_F!WpIoFb94L-YtF&67w|sF#uXIX8gLm7y2e&S_bnM`T^-9p)?) zs(V6wiZW@DMEXN~Uvg3d-qwZ{HN^KNC!LXbCL-HH@3PS|(=S3~AoLdWA?d8ZUSQiE z;`@@5&PnGBVXq6_z({lI4ip;<@qNij%W@AQ=cdqd=3JEjeMI(!&SlPWA?LQx6GXit zNNF7i@qNijEy*>A+#hOXWTnt{IK=lQC#?$n2nZgroV`F7NXmZ`*rT*^j}N&&k}N#<)&=LVBA zHlm#n9|a1AgvVBxj{*f#l3xMxK!}e51ydyw4)IZ-V49Gg7viHp!E}ifhWIE@Ff5U1 zh-X#7jP&mUL0OoO0tGWArz*rpfr1f<)P(pbP%uj(brv2mLoD0>JZY0hfs%6q_klJc zCpkBTD4Z%}hxo8TC?ku=qTu}BQNrP)K%uN$hRw}vb0so)G;+czk-+V2n|Gj7 zvZP~Hhz|~=WJ|;!;)6jcIU$w`0O~Mbe)^Ae&04zo>zh z-0)6~X1*dt-(*pyCqdETN+rt;@6>VOdZdSVYLZ%-!LSwPm7&z}0iq3rc*2-EK_a~2 zO)PT5J9VPNaPm=1k8@KehaVvtb}V&DP{;`Ja(8OEL;@lDR8lJ>5)RQ3lUgN_ybwJw zsnrsRhIqL~9@31ZSoWXd}DEwbY;KDzqV>77ntKqxnQ8LE zpu1!xc^dI!favGR(gP`cZ=iL)iU5=xU`Otgv{w;-9uU2iX%7nt4&H+^1`n$JB$=aQ=`I}N z0>-v=;o5$xEtDTY!VduBHnUoq9V`bOe?h`afKohcWqk}9Sn?uspHAo4?!5s%LBRMb zWRB@-y9{^OQi%T;5`O_Gkr#6OK1gPTZ^YCKnDE<7cnjA9H$J{t=$KBh?BC~ALxaoG zB5<~$_%uM750Q%yxR8ltiolDE>_(*Qvp@%!d>E0}Q0*DinfP5q&O_=MfGIyhWG);D6Mu}r*OBs7z@)xx zcqw8H_8{M$=X{$D?ncfZP~;gv*&rf;&tcgDlySKLAtCM&vc7o`b-hNVx+rc{w7{JZK{to45**V@N#;u*z2(;>Z*J6HK^; z@G0QQFFyy79E8F%s}JA0dse}(O#Tm$KUU}Cv;r@gDtyW0`~o=zZ^lIy8Z=iT{oHPi z{wWmdh^r31ag18!Ev5kf*A&|J@4QWzD_0V%(!=P>L#Q?e&!)W_x)``hKM!vNps=V% zV`lS(6>$-(^flD_aw>-QWPI6qc96zSJ1SiSsQ5b6=LS>Wj)gGH}vV9rT<}& zQmHngeg(atzl@RUh4MYr#kTVnQ9p-bl|Wq%D0>2tRs@zY;T2PPmTm_^M?-AwoS^fM zSZn9%*2tJwFV)EHSP0XDeC$!Se-Zd8jM)$5x3dAeSLY^nue~E{kHFvG*sG&oEuSL5HR_Rhzufg z8geG?LF93y{)FhBHI+%1Rrt5~m}r?tx6krIkd}PxQrowaEm6y6?Z!?RP#!eQk7?Pv z9&5CgdHFue3yt>hjkkUO@bIk#t~TPEWbh>lXE4TmPF58d~G>bpd@ zZbWoN2A!eNE9A4hP@%_-iMH<@59#Yb_-7*BF(T5M7>%v&&i}gVuYq!ia<A32YEIeM}3T@|(pMi~ud z%|Cnjm~X9u>rIXi0!qrzqYNXj;DAYg1T{)bI*Id!%~7OJA4)H@do%?yDbI_KG{#5H zi;EO2H<2fS>l%$q_or}`$)OkuuQ!oDB2w`5rMjKJAab8+AG1Q?pG>+G%InpINc@wg z5Q&ePbQ1s8PFR`zF`sTv09d@lD0FkE`#NjH*}AMD;rop3Csm z28M5zo!Yb-tXf}?RcqSRbf$k%Ho7OR2Z9>B(0>o!>W@$Pzg@x~OgRv>H@~6nkENi> z^{&mCu38M^>qjj?F~R%kFoT8TOjVhJtg0PsWxH$B=&XhPyL~L}Q(bv`C2LsIZy?$p zmqw~ht5J8Wr-KW7#WokSa`K zu5`R`r{TAdw$DToNW+eqzKgm?*<^asEkNNpJuixFerdKBKOiNFDbw4*i?0B<=L*Z7 zE4&x4a79YVt1OivyRyQ4*c}7PUu*+be7uG?0}Y@NIhy5w}(?5RU@shTe%aJr(8B4MU=@?K`I)!A<{oBvDRSv%?(ScJOh z+In5Io{CpxIC3j-|^BDv_%?P(e&m-_OU=}w&D-DKami~Mn z^<^Ve^Cb)efNX?%Fzv`jXa!Q50JF)_yG&iU3z3hFkZ9o@$o@J&wD2ebKV^hk_*Vqp z0+fHtRE*a`Bri9~hRsHq>N)5S7(IK~kZJFp3lm4Shb3Qzy8<8^$4e2o1R&eQ?;-FI zK(>i*84R{H$YHbAH<<{?k1%v54IrGFfxtvVOeHIf&VW;|V=E-wD*p;hHh^&JTm;T$gxuPMz(zp%nWl0) zw+bhkL>U-$CSn+;HzVbLA8~A!{~|G&!`Q0l1iZ~)Nwzhy_U`copoM$*FM*CPkTCA< z-$3AHM!4@k<*Q&1Ks*9hA+Q-Rhg*HU$G_1ag{HCR{Tc7TiV{&BLcx1klY9J>uVJ$c z7|&87yk&?j1&HweGlu0bv8?s|kyt3a8&G5?K!kS~fd?6(@cxOwe*r{z&l?1*j2wQB z`XapATQO$>M0inD6XC5w%7p+C-b`8bSdr5;gm)Jk=YIcT6gdnK;k|&sbBs`Uskgy_ z0VqG!RQ7~-70?t$O`-^|!bCjbv4mCrdqc2E_49rslJ8AS7U5ZQKVeYBcKo+()jNJ% z(}OXqc0R~|J!RE%WgawTJvFv>cTmdQcbp7@s{pbic?^N?0SbR^D##|Jo`%J1Cgmbh ziVyx}5K(X!QuK8=WC5}ZIRJL;M~>`5K8Dn-0PB>QaW=pyi{m0zJ-rfVo0QuHH?h;@ zC=Q3$QU4WyxFRZ1U?M=A6k8Fvf(dj*Jc7Xe0C7dUMw!wT(R>H)cmc!}Q3V-^D`FQ? z2AN7%#7d^FLf|2!+za4m-WxvXJRq2#GSB<(Si#9j^DaahAy}Mps`u`_`Q8a#*jf+- z%L!?CQ{V#cxGo*Xb@TXwT|#oDJMUrq5|XRjd3=J6kh(Z&fp;F5j`P5Ie7J^?x=79A zi-rg(CGKhEdnPBJch=%1=Px?z%#)+<{YkdwKZVuhaX{Fb=e<)$TkSlo3+TQ}g&}1R?cwHIJ|TBBYeM z3yQ#RLInRIYTkE}aFh#3p6Xh7Lv?9dB;=%xN?VefVTUol`o>wI&}<~3XC{c2@K0

oU{sSPJVrUSDJ?j8W-0W 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 NiI?93rs7ck{{ZB`OAP=3 diff --git a/solution.txt b/solution.txt index f14df7a..60103d9 100644 --- a/solution.txt +++ b/solution.txt @@ -1 +1 @@ -drdrdrdrrruuuuuulllllddrdrdrDulululldRdRdrdRRllululuurdrdrDululldRuuluurrrrrdddddrddlUUUUUUruLLLLLulDDdrdddrdRRlluluurdrDulldruluulldRuuurrrrrdddddrddlUUUUUUruLLLLLulDDdrdrdddRRlluurDldRuulululldRdRluuuurrrrrdddddrddlUUUUUUruLLLLLulDDdrdrdrddRluulululldRdRluuuurrrrrdddddrddlUUUUUUruLLLLLulDD +rrRlllllL diff --git a/src/ai/ai.c b/src/ai/ai.c index 74da426..c3e2191 100644 --- a/src/ai/ai.c +++ b/src/ai/ai.c @@ -1,161 +1,166 @@ -#include -#include #include #include - +#include +#include #include "ai.h" -#include "utils.h" #include "hashtable.h" #include "priority_queue.h" +#include "utils.h" /** * Retrieve solution and return a string containing the squence of moves -*/ -char* save_solution( node_t* solution_node ){ - node_t* n = solution_node; + */ +char *save_solution(node_t *solution_node) { + node_t *n = solution_node; char *solution_string = malloc(sizeof(char) * solution_node->depth+1); solution_string[n->depth] = '\0'; - while (n->parent != NULL) - { + while (n->parent != NULL) { switch (n->move) { - case up: - if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') - solution_string[n->depth-1] = 'U'; - else - solution_string[n->depth-1] = 'u'; - break; + case up: + if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') + solution_string[n->depth-1] = 'U'; + else + solution_string[n->depth-1] = 'u'; + break; - case down: - if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') - solution_string[n->depth-1] = 'D'; - else - solution_string[n->depth-1] = 'd'; - break; + case down: + if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') + solution_string[n->depth-1] = 'D'; + else + solution_string[n->depth-1] = 'd'; + break; - case left: - if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') - solution_string[n->depth-1] = 'L'; - else - solution_string[n->depth-1] = 'l'; - break; - - case right: - if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') - solution_string[n->depth-1] = 'R'; - else - solution_string[n->depth-1] = 'r'; - break; + case left: + if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') + solution_string[n->depth-1] = 'L'; + else + solution_string[n->depth-1] = 'l'; + break; + case right: + if (n->parent->state.map[n->state.player_y][n->state.player_x] == '$') + solution_string[n->depth-1] = 'R'; + else + solution_string[n->depth-1] = 'r'; + break; } n = n->parent; } + return solution_string; } /** * Copy a src into a dst state -*/ -void copy_state(sokoban_t* init_data, state_t* dst, state_t* src){ + */ +void copy_state(sokoban_t *init_data, state_t *dst, state_t *src) { dst->map = malloc(sizeof(char *) * init_data->lines); - for ( int i = 0; i < init_data->lines; ++i ){ + + for (int i = 0; i < init_data->lines; ++i) { int width = strlen(src->map[i]) + 1; dst->map[i] = malloc(width); memcpy(dst->map[i], src->map[i], width); } + dst->player_x = src->player_x; dst->player_y = src->player_y; } /** * Create the initial node -*/ -node_t* create_init_node( sokoban_t* init_data ){ - node_t * new_n = (node_t *) malloc(sizeof(node_t)); + */ +node_t *create_init_node(sokoban_t *init_data) { + node_t *new_n = (node_t *) malloc(sizeof(node_t)); + new_n->parent = NULL; new_n->priority = 0; new_n->depth = 0; new_n->num_childs = 0; new_n->move = -1; new_n->state.map = malloc(sizeof(char *) * init_data->lines); - for (int i = 0; i < init_data->lines; ++i) - { + + for (int i = 0; i < init_data->lines; ++i) { int width = strlen(init_data->map[i]) + 1; new_n->state.map[i] = malloc(width); memcpy(new_n->state.map[i], init_data->map[i], width); } new_n->state.player_x = init_data->player_x; - new_n->state.player_y = init_data->player_y; + return new_n; } /** * Create the a node from a parent node -*/ -node_t* create_node( sokoban_t* init_data, node_t* parent ){ - node_t * new_n = (node_t *) malloc(sizeof(node_t)); + */ +node_t *create_node(sokoban_t *init_data, node_t *parent) { + node_t *new_n = (node_t *) malloc(sizeof(node_t)); new_n->parent = parent; new_n->depth = parent->depth + 1; copy_state(init_data, &(new_n->state), &(parent->state)); return new_n; - } /** * Apply an action to node n, create a new node resulting from * executing the action, and return if the player moved -*/ -bool applyAction(sokoban_t* init_data, node_t* n, node_t** new_node, move_t action ){ + */ +bool applyAction(sokoban_t *init_data, node_t *n, node_t **new_node, \ + move_t action) { bool player_moved = false; - *new_node = create_node( init_data, n ); + *new_node = create_node(init_data, n); (*new_node)->move = action; (*new_node)->priority = -(*new_node)->depth; - player_moved = execute_move_t( init_data, &((*new_node)->state), action ); + player_moved = execute_move_t(init_data, &((*new_node)->state), action); return player_moved; - } /** * Book keeping variable and function to free memory once the solver finishes -*/ -node_t** expanded_nodes_table; -unsigned expanded_nodes_table_size = 10000000; //10M -void update_explore_table(node_t* n, unsigned expanded_nodes ){ - if( expanded_nodes > expanded_nodes_table_size - 1){ - expanded_nodes_table_size *= 2; - expanded_nodes_table = realloc( expanded_nodes_table, sizeof(node_t*) * expanded_nodes_table_size ); - + */ +node_t **expanded_nodes_table; + +// 10M +unsigned expanded_nodes_table_size = 10000000; + +void update_explore_table(node_t *n, unsigned expanded_nodes) { + if (expanded_nodes > expanded_nodes_table_size - 1) { + expanded_nodes_table_size *= 2; + expanded_nodes_table = realloc(expanded_nodes_table, \ + sizeof(node_t*) * expanded_nodes_table_size); } expanded_nodes_table[ expanded_nodes ] = n; - } -void free_memory(unsigned expanded_nodes ){ - for( unsigned i = 0; i < expanded_nodes; i++){ +void free_memory(unsigned expanded_nodes, int lines) { + for (unsigned i = 0; i < expanded_nodes; i++) { + for (int j = 0; j < lines; j++) { + free(expanded_nodes_table[i]->state.map[j]); + } + free(expanded_nodes_table[i]->state.map); free(expanded_nodes_table[i]); } + free(expanded_nodes_table); } /** * Given a 2D map, returns a 1D map -*/ -void flatten_map( sokoban_t* init_data, char **dst_map, char **src_map){ - + */ +void flatten_map(sokoban_t *init_data, char **dst_map, char **src_map) { int current_i = 0; - for (int i = 0; i < init_data->lines; ++i) - { + for (int i = 0; i < init_data->lines; ++i) { int width = strlen(src_map[i]); - for ( int j = 0; j < width; j++ ){ + for (int j = 0; j < width; j++) { (*dst_map)[current_i] = src_map[i][j]; current_i++; } @@ -165,13 +170,12 @@ void flatten_map( sokoban_t* init_data, char **dst_map, char **src_map){ /** * Find a solution by exploring all possible paths */ -void find_solution(sokoban_t* init_data, bool show_solution) -{ +void find_solution(sokoban_t *init_data, bool show_solution) { // Keep track of solving time clock_t start = clock(); // Solution String containing the sequence of moves - char* solution = NULL; + char *solution = NULL; HashTable hashTable; struct heap pq; @@ -185,32 +189,27 @@ void find_solution(sokoban_t* init_data, bool show_solution) // Choose initial capacity of PRIME NUMBER // Specify the size of the keys and values you want to store once // The Hash Table only accept a 1D key and value. - ht_setup( &hashTable, sizeof(int8_t) * init_data->num_chars_map, sizeof(int8_t) * init_data->num_chars_map, 16769023); - - + ht_setup(&hashTable, sizeof(int8_t) * init_data->num_chars_map, sizeof(int8_t) * init_data->num_chars_map, 16769023); // Data structure to create a 1D representation of the map // Needed to interact with the hash table - char* flat_map = calloc( init_data->num_chars_map, sizeof(char)); + char *flat_map = calloc(init_data->num_chars_map, sizeof(char)); // Initialize heap heap_init(&pq); // Initialize expanded nodes table. // This table will be used to free your memory once a solution is found - expanded_nodes_table = (node_t**) malloc( sizeof(node_t*) * expanded_nodes_table_size ); + expanded_nodes_table = (node_t **) malloc(sizeof(node_t *) * expanded_nodes_table_size); // Add the initial node - node_t* n = create_init_node( init_data ); + node_t *n = create_init_node(init_data); // Use the max heap API provided in priority_queue.h heap_push(&pq,n); - /** - * FILL IN THE GRAPH ALGORITHM - * */ - + // Implementation of Algorithm 1 while (pq.count > 0) { n = heap_delete(&pq); update_explore_table(n, expanded_nodes); @@ -226,6 +225,9 @@ void find_solution(sokoban_t* init_data, bool show_solution) bool player_moved = applyAction(init_data, n, &new, action); generated_nodes += 1; if (!player_moved || simple_corner_deadlock(init_data, &(new->state))) { + for (int i = 0; i < init_data->lines; i++) { + free(new->state.map[i]); + } free(new->state.map); free(new); continue; @@ -235,6 +237,9 @@ void find_solution(sokoban_t* init_data, bool show_solution) if (ht_lookup(&hashTable, flat_map) != NULL) { duplicated_nodes += 1; + for (int i = 0; i < init_data->lines; i++) { + free(new->state.map[i]); + } free(new->state.map); free(new); continue; @@ -243,15 +248,15 @@ void find_solution(sokoban_t* init_data, bool show_solution) ht_insert(&hashTable, flat_map, &flat_map); heap_push(&pq, new); } - } - - //---------------------------- + } // Free Memory of HashTable, Explored and flatmap ht_clear(&hashTable); ht_destroy(&hashTable); - free_memory(expanded_nodes); + free_memory(expanded_nodes, init_data->lines); free(flat_map); + + // Free initial data for (int i = 0; i < init_data->lines; i++) { free((init_data->map)[i]); free((init_data->map_save)[i]); @@ -259,27 +264,38 @@ void find_solution(sokoban_t* init_data, bool show_solution) free(init_data->map); free(init_data->map_save); free(init_data->buffer); - emptyPQ(&pq); - // free(pq.heaparr); - // printf("%d\n", pq.count); - //---------------------------- + // Free priority queue + for (int i = pq.count; i > 0; i--) { + for (int j = 0; j < init_data->lines; j++) { + if (pq.heaparr[i]->state.map[j]) { + free(pq.heaparr[i]->state.map[j]); + } + } + if (pq.heaparr[i]->state.map) { + free(pq.heaparr[i]->state.map); + } + if (pq.heaparr[i]) { + free(pq.heaparr[i]); + } + } + free(pq.heaparr); // Stop clock clock_t end = clock(); double cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; // Show solution - if( show_solution && solution != NULL ) play_solution( *init_data, solution); + if (show_solution && solution != NULL) play_solution(*init_data, solution); endwin(); - if( solution != NULL ){ + if (solution != NULL) { printf("\nSOLUTION: \n"); - printf( "%s\n\n", solution); + printf("%s\n\n", solution); + FILE *fptr = fopen("solution.txt", "w"); - if (fptr == NULL) - { + if (fptr == NULL) { printf("Could not open file"); return ; } @@ -289,34 +305,25 @@ void find_solution(sokoban_t* init_data, bool show_solution) free(solution); } - printf("STATS: \n"); - printf("\tExpanded nodes: %'d\n\tGenerated nodes: %'d\n\tDuplicated nodes: %'d\n", expanded_nodes, generated_nodes, duplicated_nodes); + printf("\tExpanded nodes: %'d\n\tGenerated nodes: %'d\n\t" \ + "Duplicated nodes: %'d\n", expanded_nodes, generated_nodes, \ + duplicated_nodes); printf("\tSolution Length: %d\n", solution_size); - printf("\tExpanded/seconds: %d\n", (int)(expanded_nodes/cpu_time_used) ); - printf("\tTime (seconds): %f\n", cpu_time_used ); - + printf("\tExpanded/seconds: %d\n", (int)(expanded_nodes/cpu_time_used)); + printf("\tTime (seconds): %f\n", cpu_time_used); } -void solve(char const *path, bool show_solution) -{ - /** - * Load Map - */ +void solve(char const *path, bool show_solution) { + // Load Map sokoban_t sokoban = make_map(path, sokoban); + sokoban.base_path = path; - /** - * Count number of boxes and Storage locations - */ + // Count number of boxes and Storage locations map_check(sokoban); - /** - * Locate player x,y position - */ + // Locate player x,y position sokoban = find_player(sokoban); - sokoban.base_path = path; - find_solution(&sokoban, show_solution); - } diff --git a/src/ai/ai.h b/src/ai/ai.h index 23f12ad..e87b37f 100644 --- a/src/ai/ai.h +++ b/src/ai/ai.h @@ -3,6 +3,7 @@ #include #include + #include "node.h" #include "priority_queue.h" diff --git a/src/ai/ai.o b/src/ai/ai.o index 40028f7500a85c5377c2fc26ab6422e5da40f839..fda4a3f8d0b56b796e2068bb1d871bc696e0b811 100644 GIT binary patch literal 54416 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 +#include #include #include - -#include - - #include "hashtable.h" -int ht_setup(HashTable* table, - size_t key_size, - size_t value_size, - size_t capacity) { +int ht_setup(HashTable* table, size_t key_size, size_t value_size, \ + size_t capacity) { + assert(table != NULL); - - if (table == NULL) return HT_ERROR; + + if (table == NULL) { + return HT_ERROR; + } if (capacity < HT_MINIMUM_CAPACITY) { capacity = HT_MINIMUM_CAPACITY; @@ -38,14 +36,19 @@ int ht_setup(HashTable* table, } int ht_copy(HashTable* first, HashTable* second) { - size_t chain; - HTNode* node; - assert(first != NULL); assert(ht_is_initialized(second)); - if (first == NULL) return HT_ERROR; - if (!ht_is_initialized(second)) return HT_ERROR; + size_t chain; + HTNode* node; + + if (first == NULL) { + return HT_ERROR; + } + + if (!ht_is_initialized(second)) { + return HT_ERROR; + } if (_ht_allocate(first, second->capacity) == HT_ERROR) { return HT_ERROR; @@ -59,7 +62,9 @@ int ht_copy(HashTable* first, HashTable* second) { for (chain = 0; chain < second->capacity; ++chain) { for (node = second->nodes[chain]; node; node = node->next) { - if (_ht_push_front(first, chain, node->key, node->value) == HT_ERROR) { + if (_ht_push_front(first, chain, node->key, node->value) == \ + HT_ERROR) { + return HT_ERROR; } } @@ -72,8 +77,13 @@ int ht_move(HashTable* first, HashTable* second) { assert(first != NULL); assert(ht_is_initialized(second)); - if (first == NULL) return HT_ERROR; - if (!ht_is_initialized(second)) return HT_ERROR; + if (first == NULL) { + return HT_ERROR; + } + + if (!ht_is_initialized(second)) { + return HT_ERROR; + } *first = *second; second->nodes = NULL; @@ -85,8 +95,13 @@ int ht_swap(HashTable* first, HashTable* second) { assert(ht_is_initialized(first)); assert(ht_is_initialized(second)); - if (!ht_is_initialized(first)) return HT_ERROR; - if (!ht_is_initialized(second)) return HT_ERROR; + if (!ht_is_initialized(first)) { + return HT_ERROR; + } + + if (!ht_is_initialized(second)) { + return HT_ERROR; + } _ht_int_swap(&first->key_size, &second->key_size); _ht_int_swap(&first->value_size, &second->value_size); @@ -104,7 +119,9 @@ int ht_destroy(HashTable* table) { size_t chain; assert(ht_is_initialized(table)); - if (!ht_is_initialized(table)) return HT_ERROR; + if (!ht_is_initialized(table)) { + return HT_ERROR; + } for (chain = 0; chain < table->capacity; ++chain) { node = table->nodes[chain]; @@ -127,8 +144,13 @@ int ht_insert(HashTable* table, void* key, void* value) { assert(ht_is_initialized(table)); assert(key != NULL); - if (!ht_is_initialized(table)) return HT_ERROR; - if (key == NULL) return HT_ERROR; + if (!ht_is_initialized(table)) { + return HT_ERROR; + } + + if (key == NULL) { + return HT_ERROR; + } if (_ht_should_grow(table)) { _ht_adjust_capacity(table); @@ -158,8 +180,13 @@ int ht_contains(HashTable* table, void* key) { assert(ht_is_initialized(table)); assert(key != NULL); - if (!ht_is_initialized(table)) return HT_ERROR; - if (key == NULL) return HT_ERROR; + if (!ht_is_initialized(table)) { + return HT_ERROR; + } + + if (key == NULL) { + return HT_ERROR; + } index = _ht_hash(table, key); for (node = table->nodes[index]; node; node = node->next) { @@ -178,8 +205,13 @@ void* ht_lookup(HashTable* table, void* key) { assert(table != NULL); assert(key != NULL); - if (table == NULL) return NULL; - if (key == NULL) return NULL; + if (table == NULL) { + return NULL; + } + + if (key == NULL) { + return NULL; + } index = _ht_hash(table, key); for (node = table->nodes[index]; node; node = node->next) { @@ -198,8 +230,13 @@ const void* ht_const_lookup(const HashTable* table, void* key) { assert(table != NULL); assert(key != NULL); - if (table == NULL) return NULL; - if (key == NULL) return NULL; + if (table == NULL) { + return NULL; + } + + if (key == NULL) { + return NULL; + } index = _ht_hash(table, key); for (node = table->nodes[index]; node; node = node->next) { @@ -219,8 +256,13 @@ int ht_erase(HashTable* table, void* key) { assert(table != NULL); assert(key != NULL); - if (table == NULL) return HT_ERROR; - if (key == NULL) return HT_ERROR; + if (table == NULL) { + return HT_ERROR; + } + + if (key == NULL) { + return HT_ERROR; + } index = _ht_hash(table, key); node = table->nodes[index]; @@ -241,7 +283,7 @@ int ht_erase(HashTable* table, void* key) { return HT_ERROR; } } - + return HT_SUCCESS; } } @@ -253,8 +295,13 @@ int ht_clear(HashTable* table) { assert(table != NULL); assert(table->nodes != NULL); - if (table == NULL) return HT_ERROR; - if (table->nodes == NULL) return HT_ERROR; + if (table == NULL) { + return HT_ERROR; + } + + if (table->nodes == NULL) { + return HT_ERROR; + } ht_destroy(table); _ht_allocate(table, HT_MINIMUM_CAPACITY); @@ -265,7 +312,11 @@ int ht_clear(HashTable* table) { int ht_is_empty(HashTable* table) { assert(table != NULL); - if (table == NULL) return HT_ERROR; + + if (table == NULL) { + return HT_ERROR; + } + return table->size == 0; } @@ -278,8 +329,8 @@ int ht_reserve(HashTable* table, size_t minimum_capacity) { if (!ht_is_initialized(table)) return HT_ERROR; /* - * We expect the "minimum capacity" to be in elements, not in array indices. - * This encapsulates the design. + * We expect the "minimum capacity" to be in elements, + * not in array indices. This encapsulates the design. */ if (minimum_capacity > table->threshold) { return _ht_resize(table, minimum_capacity / HT_LOAD_FACTOR); @@ -354,9 +405,11 @@ _ht_create_node(HashTable* table, void* key, void* value, HTNode* next) { if ((node = malloc(sizeof *node)) == NULL) { return NULL; } + if ((node->key = malloc(table->key_size)) == NULL) { return NULL; } + if ((node->value = malloc(table->value_size)) == NULL) { return NULL; } @@ -369,7 +422,8 @@ _ht_create_node(HashTable* table, void* key, void* value, HTNode* next) { } int _ht_push_front(HashTable* table, size_t index, void* key, void* value) { - table->nodes[index] = _ht_create_node(table, key, value, table->nodes[index]); + table->nodes[index] = \ + _ht_create_node(table, key, value, table->nodes[index]); return table->nodes[index] == NULL ? HT_ERROR : HT_SUCCESS; } @@ -440,4 +494,4 @@ void _ht_rehash(HashTable* table, HTNode** old, size_t old_capacity) { node = next; } } -} \ No newline at end of file +} diff --git a/src/ai/hashtable.h b/src/ai/hashtable.h index 06c0f68..9e77c51 100644 --- a/src/ai/hashtable.h +++ b/src/ai/hashtable.h @@ -13,23 +13,19 @@ #define HT_MINIMUM_CAPACITY 8 #define HT_LOAD_FACTOR 5 #define HT_MINIMUM_THRESHOLD (HT_MINIMUM_CAPACITY) * (HT_LOAD_FACTOR) - #define HT_GROWTH_FACTOR 2 #define HT_SHRINK_THRESHOLD (1 / 4) - #define HT_ERROR -1 #define HT_SUCCESS 0 - #define HT_UPDATED 1 #define HT_INSERTED 0 - #define HT_NOT_FOUND 0 #define HT_FOUND 01 - #define HT_INITIALIZER {0, 0, 0, 0, 0, NULL, NULL, NULL}; -typedef int (*comparison_t)(void*, void*, size_t); -typedef size_t (*hash_t)(void*, size_t); +typedef int (*comparison_t)(void *, void *, size_t); + +typedef size_t (*hash_t)(void *, size_t); /****************** STRUCTURES ******************/ @@ -58,13 +54,13 @@ typedef struct HashTable { /****************** INTERFACE ******************/ /* Setup */ -int ht_setup(HashTable* table, - size_t key_size, - size_t value_size, - size_t capacity); +int ht_setup(HashTable* table, size_t key_size, size_t value_size, \ + size_t capacity); int ht_copy(HashTable* first, HashTable* second); + int ht_move(HashTable* first, HashTable* second); + int ht_swap(HashTable* first, HashTable* second); /* Destructor */ @@ -73,16 +69,20 @@ int ht_destroy(HashTable* table); int ht_insert(HashTable* table, void* key, void* value); int ht_contains(HashTable* table, void* key); -void* ht_lookup(HashTable* table, void* key); -const void* ht_const_lookup(const HashTable* table, void* key); + +void *ht_lookup(HashTable* table, void* key); + +const void *ht_const_lookup(const HashTable* table, void* key); #define HT_LOOKUP_AS(type, table_pointer, key_pointer) \ (*(type*)ht_lookup((table_pointer), (key_pointer))) int ht_erase(HashTable* table, void* key); + int ht_clear(HashTable* table); int ht_is_empty(HashTable* table); + bool ht_is_initialized(HashTable* table); int ht_reserve(HashTable* table, size_t minimum_capacity); @@ -90,24 +90,34 @@ int ht_reserve(HashTable* table, size_t minimum_capacity); /****************** PRIVATE ******************/ void _ht_int_swap(size_t* first, size_t* second); + void _ht_pointer_swap(void** first, void** second); size_t _ht_default_hash(void* key, size_t key_size); + int _ht_default_compare(void* first_key, void* second_key, size_t key_size); size_t _ht_hash(const HashTable* table, void* key); + bool _ht_equal(const HashTable* table, void* first_key, void* second_key); bool _ht_should_grow(HashTable* table); + bool _ht_should_shrink(HashTable* table); -HTNode* _ht_create_node(HashTable* table, void* key, void* value, HTNode* next); +HTNode *_ht_create_node(HashTable* table, void* key, void* value, \ + HTNode* next); + int _ht_push_front(HashTable* table, size_t index, void* key, void* value); + void _ht_destroy_node(HTNode* node); int _ht_adjust_capacity(HashTable* table); + int _ht_allocate(HashTable* table, size_t capacity); + int _ht_resize(HashTable* table, size_t new_capacity); + void _ht_rehash(HashTable* table, HTNode** old, size_t old_capacity); -#endif /* HASHTABLE_H */ \ No newline at end of file +#endif diff --git a/src/ai/hashtable.o b/src/ai/hashtable.o index ed45f884fe582794c251399f2d298a667c8bfe46..f856644d49b9dfabe449fa656c7319eaa5c26089 100644 GIT binary patch delta 19899 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 F`oH^+b#MRx delta 20000 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 z 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 = 0; h->size = initial_size; h->heaparr = (node_t **) malloc(sizeof(node_t*) * initial_size); - for(int i = 0; i < initial_size; i++) - h->heaparr[i]=NULL; + + for (int i = 0; i < initial_size; i++) { + h->heaparr[i] = NULL; + } - if(!h->heaparr) { + if (!h->heaparr) { printf("Error allocatinga memory...\n"); exit(-1); } - } -void max_heapify(node_t** data, int loc, int count) { +void max_heapify(node_t **data, int loc, int count) { int left, right, largest; - node_t* temp; - left = 2*(loc) + 1; + node_t *temp; + left = 2 * (loc) + 1; right = left + 1; largest = loc; - if (left <= count && data[left]->priority > data[largest]->priority) { largest = left; - } + } + if (right <= count && data[right]->priority > data[largest]->priority) { largest = right; - } + } - if(largest != loc) { + if (largest != loc) { temp = data[loc]; data[loc] = data[largest]; data[largest] = temp; max_heapify(data, largest, count); } - } -void heap_push(struct heap* h, node_t* value) -{ +void heap_push(struct heap *h, node_t *value) { int index, parent; // Resize the heap if it is too small to hold all the data - if (h->count == h->size) - { + if (h->count == h->size) { h->size += 1; h->heaparr = realloc(h->heaparr, sizeof(node_t) * h->size); - if (!h->heaparr) exit(-1); // Exit if the memory allocation fails + + // Exit if the memory allocation fails + if (!h->heaparr) { + exit(-1); + } } - - index = h->count++; // First insert at last of array + + // First insert at last of array + index = h->count++; // Find out where to put the element and put it - for(;index; index = parent) - { + for (; index; index = parent) { parent = (index - 1) / 2; - if (h->heaparr[parent]->priority >= value->priority) break; + + if (h->heaparr[parent]->priority >= value->priority) { + break; + } + h->heaparr[index] = h->heaparr[parent]; } + h->heaparr[index] = value; } -void heap_display(struct heap* h, sokoban_t* init_data) { - int i; - for(i=0; icount; ++i) { - node_t* n = h->heaparr[i]; +void heap_display(struct heap *h, sokoban_t *init_data) { + for (int i = 0; i < h->count; ++i) { + node_t *n = h->heaparr[i]; - printf("priority = %d", n->priority); - printf("\n"); - for (int i = 0; i < init_data->lines; i++) - mvprintw(i, 0, n->state.map[i]); + printf("priority = %d\n", n->priority); + + for (int j = 0; i < init_data->lines; j++) { + mvprintw(i, 0, n->state.map[j]); + } + move(n->state.player_y, n->state.player_x); } } -node_t* heap_delete(struct heap* h) -{ - node_t* removed; - node_t* temp = h->heaparr[--h->count]; - +node_t *heap_delete(struct heap *h) { + node_t *removed; + node_t *temp = h->heaparr[--h->count]; - if ((h->count <= (h->size + 2)) && (h->size > initial_size)) - { + if ((h->count <= (h->size + 2)) && (h->size > initial_size)) { h->size -= 1; h->heaparr = realloc(h->heaparr, sizeof(node_t) * h->size); - if (!h->heaparr) exit(-1); // Exit if the memory allocation fails + + // Exit if the memory allocation fails + if (!h->heaparr) exit(-1); } + removed = h->heaparr[0]; h->heaparr[0] = temp; - if(temp == removed) h->heaparr[0] = NULL; - max_heapify(h->heaparr, 0, h->count); + if (temp == removed) { + h->heaparr[0] = NULL; + } + + max_heapify(h->heaparr, 0, h->count); return removed; } -void emptyPQ(struct heap* pq) { +void emptyPQ(struct heap *pq) { while(pq->count != 0) { - node_t* n = heap_delete(pq); - for (int i = size; i >= 0; i--) { - free(n->state.map[i]); - } - free(n->state.map); + node_t *n = heap_delete(pq); free(n); } } diff --git a/src/ai/priority_queue.h b/src/ai/priority_queue.h index f8ca1b4..c11778d 100644 --- a/src/ai/priority_queue.h +++ b/src/ai/priority_queue.h @@ -2,20 +2,19 @@ #define __PQ__ /** - * NIR: Adapted from https://gist.github.com/aatishnn/8265656#file-binarymaxheap-c + * Adapted from https://gist.github.com/aatishnn/8265656#file-binarymaxheap-c */ #include #include #include + #include "node.h" #include "../../include/sokoban.h" - /** * size is the allocated size, count is the number of elements in the queue */ - struct heap { int size; int count; @@ -24,16 +23,16 @@ struct heap { #define initial_size 4 -void heap_init(struct heap* h); +void heap_init(struct heap *h); -void max_heapify(node_t** data, int loc, int count); +void max_heapify(node_t **data, int loc, int count); -void heap_push(struct heap* h, node_t* value); +void heap_push(struct heap *h, node_t *value); void heap_display(struct heap *h, sokoban_t *init_data); -node_t* heap_delete(struct heap* h); +node_t* heap_delete(struct heap *h); -void emptyPQ(struct heap* pq); +void emptyPQ(struct heap *pq); #endif diff --git a/src/ai/priority_queue.o b/src/ai/priority_queue.o index 0302ed6c593400cbe27fa51c3e26377da50d3a14..fd3f269348d5642b6f867bdfdb5b28beed18f6c2 100644 GIT binary patch literal 17768 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 R@?Gt8_ODR>e|-=8{{xulD+T}n literal 18336 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 diff --git a/src/ai/utils.c b/src/ai/utils.c index 81b072f..af54f94 100644 --- a/src/ai/utils.c +++ b/src/ai/utils.c @@ -1,256 +1,316 @@ #include +#include + #include "utils.h" +/********* +* MACROS * +*********/ +#define TERMINAL_TYPE (strcmp(getenv("TERM"), "xterm") == 0 ? "rxvt" : \ + getenv("TERM")) /************************************** * Box movement given a state state * ***************************************/ -bool is_goal_loc(int y, int x, sokoban_t* init_data) -{ - return (init_data->map_save[y][x] == '.') || (init_data->map_save[y][x] == '+') || (init_data->map_save[y][x] == '*'); +bool is_goal_loc(int y, int x, sokoban_t *init_data) { + return (init_data->map_save[y][x] == '.') || \ + (init_data->map_save[y][x] == '+') || \ + (init_data->map_save[y][x] == '*'); } +bool push_box_left(sokoban_t *init_data, state_t *state) { + if (state->map[state->player_y][state->player_x-2] == '$' || \ + state->map[state->player_y][state->player_x-2] == '*') { -bool push_box_left(sokoban_t* init_data,state_t* state) -{ - if (state->map[state->player_y][state->player_x-2] == '$' || state->map[state->player_y][state->player_x-2] == '*') { return false; } else if (state->map[state->player_y][state->player_x-2] == '#') { return false; } else { state->map[state->player_y][state->player_x-1] = '@'; - if(state->map[state->player_y][state->player_x-2] == '.') + + if (state->map[state->player_y][state->player_x-2] == '.') { state->map[state->player_y][state->player_x-2] = '*'; - else + } else { state->map[state->player_y][state->player_x-2] = '$'; - + } + state->map[state->player_y][state->player_x] = ' '; - if (is_goal_loc( state->player_y, state->player_x, init_data) && state->map[state->player_y][state->player_x] == ' ') { + + if (is_goal_loc(state->player_y, state->player_x, init_data) && \ + state->map[state->player_y][state->player_x] == ' ') { + state->map[state->player_y][state->player_x] = '.'; } + state->player_x--; } + return true; } -bool push_box_right(sokoban_t* init_data,state_t* state) -{ - if (state->map[state->player_y][state->player_x+2] == '$' || state->map[state->player_y][state->player_x+2] == '*') { +bool push_box_right(sokoban_t *init_data, state_t *state) { + if (state->map[state->player_y][state->player_x+2] == '$' || \ + state->map[state->player_y][state->player_x+2] == '*') { + return false; } else if (state->map[state->player_y][state->player_x+2] == '#') { return false; } else { state->map[state->player_y][state->player_x+1] = '@'; - if(state->map[state->player_y][state->player_x+2] == '.') + + if (state->map[state->player_y][state->player_x+2] == '.') { state->map[state->player_y][state->player_x+2] = '*'; - else + } else { state->map[state->player_y][state->player_x+2] = '$'; + } + state->map[state->player_y][state->player_x] = ' '; - if (is_goal_loc( state->player_y, state->player_x, init_data) && state->map[state->player_y][state->player_x] == ' ') { - state->map[state->player_y][state->player_x] = '.'; + + if (is_goal_loc(state->player_y, state->player_x, init_data) && \ + state->map[state->player_y][state->player_x] == ' ') { + + state->map[state->player_y][state->player_x] = '.'; } + state->player_x++; } + return true; } -bool push_box_up(sokoban_t* init_data,state_t* state) -{ - if (state->map[state->player_y-2][state->player_x] == '$' || state->map[state->player_y-2][state->player_x] == '*') { +bool push_box_up(sokoban_t *init_data, state_t *state) { + if (state->map[state->player_y-2][state->player_x] == '$' || \ + state->map[state->player_y-2][state->player_x] == '*') { + return false; } else if (state->map[state->player_y-2][state->player_x] == '#') { return false; } else { state->map[state->player_y-1][state->player_x] = '@'; - if(state->map[state->player_y-2][state->player_x] == '.') + if (state->map[state->player_y-2][state->player_x] == '.') { state->map[state->player_y-2][state->player_x] = '*'; - else + } else { state->map[state->player_y-2][state->player_x] = '$'; + } state->map[state->player_y][state->player_x] = ' '; - if (is_goal_loc( state->player_y, state->player_x, init_data) && state->map[state->player_y][state->player_x] == ' ') { - state->map[state->player_y][state->player_x] = '.'; + + if (is_goal_loc(state->player_y, state->player_x, init_data) && \ + state->map[state->player_y][state->player_x] == ' ') { + + state->map[state->player_y][state->player_x] = '.'; } + state->player_y--; } + return true; } -bool push_box_down(sokoban_t* init_data,state_t* state) -{ - if (state->map[state->player_y+2][state->player_x] == '$' || state->map[state->player_y+2][state->player_x] == '*') { +bool push_box_down(sokoban_t *init_data, state_t *state) { + if (state->map[state->player_y+2][state->player_x] == '$' || \ + state->map[state->player_y+2][state->player_x] == '*') { + return false; } else if (state->map[state->player_y+2][state->player_x] == '#') { return false; } else { - state->map[state->player_y+1][state->player_x] = '@'; - if(state->map[state->player_y+2][state->player_x] == '.') + if (state->map[state->player_y+2][state->player_x] == '.') { state->map[state->player_y+2][state->player_x] = '*'; - else + } else { state->map[state->player_y+2][state->player_x] = '$'; + } state->map[state->player_y][state->player_x] = ' '; - if (is_goal_loc( state->player_y, state->player_x, init_data) && state->map[state->player_y][state->player_x] == ' ') { - state->map[state->player_y][state->player_x] = '.'; + + if (is_goal_loc(state->player_y, state->player_x, init_data) && \ + state->map[state->player_y][state->player_x] == ' ') { + + state->map[state->player_y][state->player_x] = '.'; } + state->player_y++; } + return true; } - - /************************************** * Player Moves given a state state * ***************************************/ -bool move_left_player(sokoban_t* init_data,state_t* state) -{ +bool move_left_player(sokoban_t *init_data, state_t *state) { if (state->map[state->player_y][state->player_x-1] != '#') { - if (state->map[state->player_y][state->player_x-1] == '$' || state->map[state->player_y][state->player_x-1] == '*') { + if (state->map[state->player_y][state->player_x-1] == '$' || \ + state->map[state->player_y][state->player_x-1] == '*') { + return push_box_left(init_data, state); } else { state->map[state->player_y][state->player_x-1] = '@'; state->map[state->player_y][state->player_x] = ' '; - if (is_goal_loc( state->player_y, state->player_x, init_data) && state->map[state->player_y][state->player_x] == ' ') { + + if (is_goal_loc(state->player_y, state->player_x, init_data) && \ + state->map[state->player_y][state->player_x] == ' ') { + state->map[state->player_y][state->player_x] = '.'; } + state->player_x--; + return true; } } + return false; } -bool move_right_player(sokoban_t* init_data,state_t* state) -{ +bool move_right_player(sokoban_t *init_data, state_t *state) { if (state->map[state->player_y][state->player_x+1] != '#') { - if (state->map[state->player_y][state->player_x+1] == '$' || state->map[state->player_y][state->player_x+1] == '*') { + if (state->map[state->player_y][state->player_x+1] == '$' || \ + state->map[state->player_y][state->player_x+1] == '*') { + return push_box_right(init_data, state); } else { state->map[state->player_y][state->player_x+1] = '@'; state->map[state->player_y][state->player_x] = ' '; - if (is_goal_loc( state->player_y, state->player_x, init_data) && state->map[state->player_y][state->player_x] == ' ') { + + if (is_goal_loc(state->player_y, state->player_x, init_data) && \ + state->map[state->player_y][state->player_x] == ' ') { + state->map[state->player_y][state->player_x] = '.'; } + state->player_x++; + return true; } } + return false; } -bool move_up_player(sokoban_t* init_data,state_t* state) -{ +bool move_up_player(sokoban_t *init_data, state_t *state) { if (state->map[state->player_y-1][state->player_x] != '#') { - if (state->map[state->player_y-1][state->player_x] == '$' || state->map[state->player_y-1][state->player_x] == '*') { + if (state->map[state->player_y-1][state->player_x] == '$' || \ + state->map[state->player_y-1][state->player_x] == '*') { + return push_box_up(init_data, state); } else { state->map[state->player_y-1][state->player_x] = '@'; state->map[state->player_y][state->player_x] = ' '; - if (is_goal_loc( state->player_y, state->player_x, init_data) && state->map[state->player_y][state->player_x] == ' ') { + + if (is_goal_loc(state->player_y, state->player_x, init_data) && \ + state->map[state->player_y][state->player_x] == ' ') { + state->map[state->player_y][state->player_x] = '.'; } + state->player_y--; + return true; } - } + } + return false; } -bool move_down_player(sokoban_t* init_data,state_t* state) -{ +bool move_down_player(sokoban_t *init_data, state_t *state) { if (state->map[state->player_y+1][state->player_x] != '#') { - if (state->map[state->player_y+1][state->player_x] == '$' || state->map[state->player_y+1][state->player_x] == '*') { + if (state->map[state->player_y+1][state->player_x] == '$' || \ + state->map[state->player_y+1][state->player_x] == '*') { + return push_box_down(init_data, state); } else { state->map[state->player_y+1][state->player_x] = '@'; state->map[state->player_y][state->player_x] = ' '; - if (is_goal_loc( state->player_y, state->player_x, init_data) && state->map[state->player_y][state->player_x] == ' ') { + + if (is_goal_loc(state->player_y, state->player_x, init_data) && \ + state->map[state->player_y][state->player_x] == ' ') { + state->map[state->player_y][state->player_x] = '.'; } + state->player_y++; + return true; } } + return false; } - -bool execute_move_t(sokoban_t* init_data, state_t* state, move_t move) { - +bool execute_move_t(sokoban_t *init_data, state_t *state, move_t move) { bool player_moved = false; - //Determine which button is pushed + // Determine which button is pushed switch (move) { - case up: - player_moved = move_up_player(init_data, state); - break; + case up: + player_moved = move_up_player(init_data, state); + break; - case down: - player_moved = move_down_player(init_data, state); - break; + case down: + player_moved = move_down_player(init_data, state); + break; - case left: - player_moved = move_left_player(init_data, state); - break; - - case right: - player_moved = move_right_player(init_data, state); - break; + case left: + player_moved = move_left_player(init_data, state); + break; + case right: + player_moved = move_right_player(init_data, state); + break; } return player_moved; - - } /***************************************************************************** * Function: simple_corner_deadlock * -* Parameters: sokoban_t* init_data, state_t* state * +* Parameters: sokoban_t *init_data, state_t *state * * Returns: bool * * Description: Check if box has been pusehd into a loc in a corner wall * * and loc != destination * *****************************************************************************/ - -bool corner_check(int x, int y, sokoban_t* init_data, state_t* state){ +bool corner_check(int x, int y, sokoban_t *init_data, state_t *state) { // Check if corner if (((state->map[y][x+1] == '#' && state->map[y+1][x] == '#') || (state->map[y+1][x] == '#' && state->map[y][x-1] == '#') || (state->map[y][x-1] == '#' && state->map[y-1][x] == '#') || (state->map[y-1][x] == '#' && state->map[y][x+1] == '#')) && - !is_goal_loc( state->player_y, state->player_x, init_data) ) { + !is_goal_loc(state->player_y, state->player_x, init_data)) { + return true; } return false; } -bool simple_corner_deadlock(sokoban_t* init_data, state_t* state) -{ +bool simple_corner_deadlock(sokoban_t *init_data, state_t *state) { bool deadlock = false; int x = state->player_x; int y = state->player_y; - if (state->map[state->player_y + 1][state->player_x] == '$'){ + if (state->map[state->player_y + 1][state->player_x] == '$') { y = state->player_y + 1; deadlock = corner_check(x, y, init_data, state); } - if( state->map[state->player_y-1][state->player_x] == '$'){ + + if (state->map[state->player_y-1][state->player_x] == '$') { y = state->player_y - 1; deadlock = corner_check(x, y, init_data, state); } - if( state->map[state->player_y][state->player_x+1] == '$'){ + + if (state->map[state->player_y][state->player_x+1] == '$') { x = state->player_x + 1; deadlock = corner_check(x, y, init_data, state); } - if( state->map[state->player_y][state->player_x-1] == '$'){ + + if (state->map[state->player_y][state->player_x-1] == '$') { x = state->player_x - 1; deadlock = corner_check(x, y, init_data, state); } @@ -258,46 +318,36 @@ bool simple_corner_deadlock(sokoban_t* init_data, state_t* state) return deadlock; } - /***************************************************************************** * Function: winning_condition * -* Parameters: sokoban_t* init_data, state_t* state * +* Parameters: sokoban_t *init_data, state_t *state * * Returns: bool * * Description: Check if all boxes are in a destination * *****************************************************************************/ - -bool winning_condition(sokoban_t* init_data, state_t* state) -{ - +bool winning_condition(sokoban_t *init_data, state_t *state) { for (int y = 0; y < init_data->lines; y++) { - for (int x = 0; init_data->map_save[y][x] != '\0'; x++) { - if (state->map[y][x] == '$') - return false; - } + for (int x = 0; init_data->map_save[y][x] != '\0'; x++) { + if (state->map[y][x] == '$') { + return false; + } + } } return true; - } -/********* -* MACROS * -*********/ -#include -#define TERMINAL_TYPE (strcmp(getenv("TERM"), "xterm") == 0 ? "rxvt" : \ - getenv("TERM")) - -void play_solution( sokoban_t init_data, char* solution ){ - +void play_solution(sokoban_t init_data, char *solution) { SCREEN *mainScreen = newterm(TERMINAL_TYPE, stdout, stdin); set_term(mainScreen); int cols = 1; - for(int i = 0; i < init_data.lines; i++){ - if(strlen(init_data.map[i]) > (size_t) cols){ + + for (int i = 0; i < init_data.lines; i++) { + if (strlen(init_data.map[i]) > (size_t) cols) { cols = strlen(init_data.map[i]); } } + WINDOW *mainWindow = newwin(init_data.lines, cols, 0, 0); cbreak(); @@ -310,24 +360,29 @@ void play_solution( sokoban_t init_data, char* solution ){ wnoutrefresh(mainWindow); doupdate(); refresh(); - for (int i = 0; i < init_data.lines; i++) + + for (int i = 0; i < init_data.lines; i++) { mvprintw(i, 0, init_data.map[i]); + } move(init_data.player_y, init_data.player_x); int key_pressed = 0; - if( solution[i] == 'u' || solution[i] == 'U') + if (solution[i] == 'u' || solution[i] == 'U') { key_pressed = KEY_UP; - else if( solution[i] == 'd' || solution[i] == 'D') - key_pressed = KEY_DOWN; - else if( solution[i] == 'l' || solution[i] == 'L') - key_pressed = KEY_LEFT; - else if( solution[i] == 'r' || solution[i] == 'R') - key_pressed = KEY_RIGHT; + } else if (solution[i] == 'd' || solution[i] == 'D') { + key_pressed = KEY_DOWN; + } else if (solution[i] == 'l' || solution[i] == 'L') { + key_pressed = KEY_LEFT; + } else if (solution[i] == 'r' || solution[i] == 'R') { + key_pressed = KEY_RIGHT; + } + init_data = key_check(init_data, key_pressed); init_data = check_zone_reset(init_data); usleep(500000); } + touchwin(mainWindow); wnoutrefresh(mainWindow); doupdate(); @@ -335,12 +390,12 @@ void play_solution( sokoban_t init_data, char* solution ){ usleep(1500000); } -void print_map(sokoban_t* init_data, state_t* state ){ +void print_map(sokoban_t *init_data, state_t *state) { initscr(); cbreak(); noecho(); clear(); - for (int i = 0; i < init_data->lines; i++){ + for (int i = 0; i < init_data->lines; i++) { mvprintw(i, 0, state->map[i]); move(state->player_y, state->player_x); } diff --git a/src/ai/utils.h b/src/ai/utils.h index 165c017..b769885 100644 --- a/src/ai/utils.h +++ b/src/ai/utils.h @@ -1,15 +1,16 @@ #ifndef __UTILS__ #define __UTILS__ +#include +#include +#include #include #include #include -#include #include -#include -#include #include -#include +#include + #include "../../include/sokoban.h" #define SIZE 4 @@ -19,14 +20,11 @@ * Data structure containing the information about the game state * representing the state of the game. */ -struct state_s{ +typedef struct state_s{ char **map; int player_x; int player_y; -}; - -typedef struct state_s state_t; - +} state_t; /** * Move type @@ -38,15 +36,18 @@ typedef enum moves{ down=3 } move_t; - - - /** * Helper functions */ + bool execute_move_t(sokoban_t *init_data, state_t *state, move_t move); + bool simple_corner_deadlock(sokoban_t *init_data, state_t *state); + bool winning_condition(sokoban_t *init_data, state_t *state); -void play_solution( sokoban_t init_data, char* solution ); + +void play_solution(sokoban_t init_data, char* solution); + void print_map(sokoban_t *init_data, state_t *state); + #endif diff --git a/src/ai/utils.o b/src/ai/utils.o index 76f58467cbd6493fe7c8d84daadcd5ef721622cd..bcf4c542aa1cad26870e886d10f812814ebc3371 100644 GIT binary patch delta 9107 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 LW&Rs<-dpg$)G%SP diff --git a/src/find_player.c b/src/find_player.c index d324c87..77cfe8b 100644 --- a/src/find_player.c +++ b/src/find_player.c @@ -5,30 +5,32 @@ ** Function for finding the player on the map */ -#include -#include -#include #include +#include +#include +#include + #include "../include/libmy.h" #include "../include/sokoban.h" -sokoban_t find_player(sokoban_t sokoban) -{ +sokoban_t find_player(sokoban_t sokoban) { sokoban.player_x = 0; sokoban.player_y = 0; + for (int i = 0; i < sokoban.lines; i++) { for (int j = 0; sokoban.map[i][j] != '\0'; j++) { sokoban = check_if_player(sokoban, i, j); } } + return (sokoban); } -sokoban_t check_if_player(sokoban_t sokoban, int y, int x) -{ +sokoban_t check_if_player(sokoban_t sokoban, int y, int x) { if (sokoban.map[y][x] == '@') { sokoban.player_x = x; sokoban.player_y = y; } + return (sokoban); } diff --git a/src/find_player.o b/src/find_player.o index 37fd3b8d0dee3aa2c40c3a1b38f13e105c94c028..af2e445a4e234bb5a1d75c78f54e13d80b72f720 100644 GIT binary patch delta 483 zcmXwzJxc>Y5QcYlGn?C7lDp(KF@j1G6oMo{ObUY$VxvV0?G&sm6jJy>5TaH5Xhf{M z*3Kq{g%E7S|KT6-XIMD9O9po4ede7RcG8-(KE7ehJ!BNzOPZ4KPAE$wd)yDJz?kjx zv^AJ_c6`ZrMm^Jj+u&IXp&JY20XZcHp@jtpISXY6`K-BI^G1X5IpdMF)|{m+v>g;I zY|yucbXL)0yeM9%q>P3|zeac9l#=fnE2fdYA#2_IBz;Y)V-(BSfzWOkY2uZ|Up!w5 zD`smJff3<=fsTK96$)`u)S)=Zi-g%til1x;g63&Fx7 z*IHSnun+qFc#(ktr#nVOT)Z;;11;$K= zhfSRM=O>!1CiO#QpYPxzj(eB zRrJ;@A}w+Q21)wMtDsWPsY7Afc7)giCi!g6i9o + #include "../include/libmy.h" -int helper(void) -{ +int helper(void) { my_putstr("USAGE\n"); my_putstr(" ./sokoban <-s> map \n\n"); my_putstr("DESCRIPTION\n"); diff --git a/src/helper.o b/src/helper.o index 92fe570ebec977c4c1812c6a1fe30b3db935551a..84efedfc6e8affdc1cedf796d51f7b482ce43f33 100644 GIT binary patch delta 45 wcmbQCIzx5Cb4Es<$uAi1F!D}5%Jfr2h=G%d0ScJ88CjXUS%o%VVm`(P04U}P-T(jq delta 45 wcmbQCIzx5Cb4Et)$uAi1F!D@3%Jfr&k%5zm0ScJ88CjXUSs6E9Vm`(P049?Px&QzG diff --git a/src/key_check.c b/src/key_check.c index 65f61ba..60cbbec 100644 --- a/src/key_check.c +++ b/src/key_check.c @@ -5,25 +5,34 @@ ** Function that manage key press for sokoban */ -#include -#include -#include #include +#include +#include +#include + #include "../include/libmy.h" #include "../include/sokoban.h" -sokoban_t key_check(sokoban_t sokoban, int key) -{ +sokoban_t key_check(sokoban_t sokoban, int key) { if (key == KEY_LEFT) { sokoban = move_left(sokoban); } - if (key == KEY_RIGHT) + + if (key == KEY_RIGHT) { sokoban = move_right(sokoban); - if (key == KEY_UP) + } + + if (key == KEY_UP) { sokoban = move_up(sokoban); - if (key == KEY_DOWN) + } + + if (key == KEY_DOWN) { sokoban = move_down(sokoban); - if (key == ' ') + } + + if (key == ' ') { play(sokoban.base_path); + } + return (sokoban); } diff --git a/src/key_check.o b/src/key_check.o index 941ce77a2985229b33ca868e633ce426a7bb67a4..0fd99698b4d3593196cd3499e79b48379b26f63d 100644 GIT binary patch delta 487 zcmY+AJxc>Y5QcYVvwL@5a<2I}6@o^q6cUo)M=DKYBlf1XNFk!A2qBFjRth%p`hYg3 z6b>vDM7wm7pI|SNpWy5+VjS3=dFGvcxw%1QP;~ui*D;+^O#}ANM$Q!4Xj$o z8K}``osq3ahhfNXDNX4bRMh87N-Y-24SOtk*lg?O2fwRUeWgcqV0of0h`;{IM8D+6 z_lXk1S2U8lP>B|teCJgN2?FK+%;k$nNx*tQ64r7d5pU}`?(YbXUI4CT+-JchKX2I4 zG^y9djmw_AY>?9bRk*y+r8e8ng`u%KB@+(W_{mwvc_2!|Vh60Q<%|3;+NC delta 487 zcmY+AJxc>Y5QcYVZ};w!OYZVv{2*u&n^a=_z*L&XPOvnsMG6r`Y@#U)5yVc6*9WvQ zrEr}lgoZOdse#?TRzso1JWm1-DEm4Gol z!MLl|m~*gu#L$bKsop3F4S|8Ay+g{B0bfJjK%k*uAmuCPveVpKKV+EJ(xQ -#include -#include #include +#include +#include +#include + #include "../include/libmy.h" #include "../include/sokoban.h" -void loose_check(sokoban_t sokoban) -{ - if( sokoban.map[sokoban.player_y+1][sokoban.player_x] == '$') - storage_loose_check(sokoban.player_y+1, sokoban.player_x, sokoban); - if( sokoban.map[sokoban.player_y-1][sokoban.player_x] == '$') - storage_loose_check(sokoban.player_y-1, sokoban.player_x, sokoban); - if( sokoban.map[sokoban.player_y][sokoban.player_x+1] == '$') - storage_loose_check(sokoban.player_y, sokoban.player_x+1, sokoban); - if( sokoban.map[sokoban.player_y][sokoban.player_x-1] == '$') - storage_loose_check(sokoban.player_y, sokoban.player_x-1, sokoban); +void loose_check(sokoban_t sokoban) { + if (sokoban.map[sokoban.player_y + 1][sokoban.player_x] == '$') { + storage_loose_check(sokoban.player_y + 1, sokoban.player_x, sokoban); + } + if (sokoban.map[sokoban.player_y - 1][sokoban.player_x] == '$') { + storage_loose_check(sokoban.player_y - 1, sokoban.player_x, sokoban); + } + + if (sokoban.map[sokoban.player_y][sokoban.player_x + 1] == '$') { + storage_loose_check(sokoban.player_y, sokoban.player_x + 1, sokoban); + } + + if (sokoban.map[sokoban.player_y][sokoban.player_x - 1] == '$') { + storage_loose_check(sokoban.player_y, sokoban.player_x - 1, sokoban); + } } -void storage_loose_check(int y, int x, sokoban_t sokoban) -{ +void storage_loose_check(int y, int x, sokoban_t sokoban) { if (sokoban.map[y][x] == '$') { if (((sokoban.map[y][x+1] == '#' && sokoban.map[y+1][x] == '#') || - (sokoban.map[y+1][x] == '#' && sokoban.map[y][x-1] == '#') || - (sokoban.map[y][x-1] == '#' && sokoban.map[y-1][x] == '#') || - (sokoban.map[y-1][x] == '#' && sokoban.map[y][x+1] == '#')) && - !is_goal_cell(y, x, sokoban ) ) { + (sokoban.map[y+1][x] == '#' && sokoban.map[y][x-1] == '#') || + (sokoban.map[y][x-1] == '#' && sokoban.map[y-1][x] == '#') || + (sokoban.map[y-1][x] == '#' && sokoban.map[y][x+1] == '#')) && + !is_goal_cell(y, x, sokoban ) ) { + endwin(); exit (1); } } } - diff --git a/src/loose_check.o b/src/loose_check.o index e7160ba48114d69c03527e3306501dcc5a91da98..7d04ef8f64b3b7e24563132b859bdf92892eb0f9 100644 GIT binary patch delta 713 zcmYjOO=uHQ5PtLC&g*W|)~x1lQ-9K6NIX~-#6&D?#6v~wQOw@-kcNtiRH@a=Qh%U` zNb#KnFS$2b$-&T*C+X3Xkh_8>p%Kq@=B-5^?0oahH#_t3-lxV+W1|K;A5OfJv2;<; zk?t6SC zPtd0{vyC{1pi+ydv|8E3Iu&&b>n)CFgmly?yu{GPu!C93UN3K!SsLB{KK@Gw zYkzNsUxQ!l2HicM_5QBkLHJ>!{2r{DsIUj?CJN@^mFWg`7?@!Y!pH>05Pq7d7|P6~ oSsTlltzr!dW=Q3R38q8%Vj_x7^M>Mv8BT|u$R!&-n{NKtACWa=#sB~S delta 682 zcmYjNJ8u&~5Z>9_+1#BC_F+f1iNOSMl2Z^|MA#A*2cqEh17gZ6947@RJd}inLm?um zBE+^xC}pHLfLsuzN`>+ZXu%By5(P;ERhZe6C04rcG2durbcd~j)|)yUe45&oiE_I_ z29-F14oSK|9)zsvzxsaM5 z$CK;s@%p|Ku)LXNAqL_TY%+DlpPG0=l|do(%ooU-$L z%IIZQs1p8P$#MixHD8^ZkTYd*$94^m@sR$2=iu0*f5h55geMBuw}Lg TH_UJ%^8SpcfBTEsF4g`4&M0I+ diff --git a/src/main.c b/src/main.c index d370ea9..8bec272 100644 --- a/src/main.c +++ b/src/main.c @@ -5,29 +5,32 @@ ** Main function for the my_sokoban */ -#include -#include #include +#include #include +#include + #include "../include/libmy.h" #include "../include/sokoban.h" #include "ai/ai.h" -int main(int argc, char const **argv) -{ - if (argc < 2 || argc > 4) +int main(int argc, char const **argv) { + if (argc < 2 || argc > 4) { return (84); - if (argv[1][0] == '-' && argv[1][1] == 'h') + } + + if (argv[1][0] == '-' && argv[1][1] == 'h') { return(helper()); - else if (argv[1][0] == '-' && argv[1][1] == 's'){ + } else if (argv[1][0] == '-' && argv[1][1] == 's') { bool show_solution = false; - if (argc > 3 && strcmp(argv[3], "play_solution") == 0) + if (argc > 3 && strcmp(argv[3], "play_solution") == 0) { show_solution = true; + } solve(argv[2], show_solution); return 0; - } - else if (argv[1][0] != '-') + } else if (argv[1][0] != '-') { return(play(argv[1])); + } return (84); } diff --git a/src/main.o b/src/main.o index 10208f841307b5c9fae191449727af378170ca23..aba0412ee6d77e9ac1d619a1a8d6891e76cf95d6 100644 GIT binary patch delta 258 zcmX?Le!zS~Fe9Vj z2v!LYBZ8F^M6pG&a)D`HR(TK|%gV^i6QRJ$#hkAIWC}*GGP5z4DhRW3unDrV=>vJu yY)x#D5MxagScO5Fn9CFxm}FTPy;uc6++84|38<8xm645^ml0@K@#bZ0QlbFXmm4+! delta 258 zcmYL>F;Bxl429!3&w*={rixM^N~D8IjAcQ}*qt>j-P4)W7Hm`XqQ z_e|9Np!lFCs2O}&140Pp^$MIqS*8V4i5t%kh#P}T2L_=NSwa2k7^Tx^5RZ(8;x}zE xHelgKr#O=d+ diff --git a/src/map_check.c b/src/map_check.c index f9b9db0..5a24085 100644 --- a/src/map_check.c +++ b/src/map_check.c @@ -5,56 +5,53 @@ ** Function used to check if a map is valid or not */ -#include -#include #include +#include +#include + #include "../include/libmy.h" #include "../include/sokoban.h" -void map_check(sokoban_t sokoban) -{ - +void map_check(sokoban_t sokoban) { int player = 0; for (int i = 0; i < sokoban.lines; i++) { for (int j = 0; sokoban.map_save[i][j] != '\0'; j++) { - check_tile(i, j, sokoban); player += count_player(i, j, sokoban); } } - } -int check_tile(int y, int x, sokoban_t sokoban) -{ - if (sokoban.map_save[y][x] != '@' && sokoban.map_save[y][x] != '$' - && sokoban.map_save[y][x] != '#' && sokoban.map_save[y][x] != ' ' - && sokoban.map_save[y][x] != '\n' && sokoban.map_save[y][x] != '.' - && sokoban.map_save[y][x] != '+' && sokoban.map_save[y][x] != '*') - { +int check_tile(int y, int x, sokoban_t sokoban) { + if (sokoban.map_save[y][x] != '@' && sokoban.map_save[y][x] != '$' && \ + sokoban.map_save[y][x] != '#' && sokoban.map_save[y][x] != ' ' && \ + sokoban.map_save[y][x] != '\n' && sokoban.map_save[y][x] != '.' && \ + sokoban.map_save[y][x] != '+' && sokoban.map_save[y][x] != '*') { + write(2, "Unknown read character in map\n", 26); exit(84); } + return (0); } -int count_case_number(int y, int x, sokoban_t sokoban) -{ +int count_case_number(int y, int x, sokoban_t sokoban) { int i = 0; if (sokoban.map_save[y][x] == '$') { i++; } + return (i); } -int count_player(int y, int x, sokoban_t sokoban) -{ +int count_player(int y, int x, sokoban_t sokoban) { int i = 0; if (sokoban.map_save[y][x] == '@') { i++; } + return (i); } diff --git a/src/map_check.o b/src/map_check.o index b619ee338dfc3d3702bb3096a77694a32df0d2b0..5da307cbdf9f56a448e433196d4cd17a427cd0f4 100644 GIT binary patch delta 915 zcmZ`%Jxo+V5Z>8+v%KTDcR%m(I38ZOA0mf^a3Ya{ct|5)Wr7i7qlM9D)CkdlHW!0N z6BB`KVyBITISV6ROpF$`mR5v@%8Eo2Vk4c-?%vtC$7cD6=# zp}}2bbhz84o#S31D|I-{lbHcv%<#O&B$#{i@@>XbiAPjmJGf^+#+Ie!dCKH1$QW?Q zf~)~W3v!-TuDUC6;}+w-NsZZ5V8C$;dJUMQwU$XXL6`ARJSEqyW2m7X2Qi5y?-2|& zOs-N?&`}RvijR~ipNbhAGjhx`^swnwj))q=14iatnmUKeCSJ(cqEX$;H(8e2tF~Py z^sy^Mc7@;V6{4WCLS#hk3Q<+du$*p#w0T|~u4}`XdLdH1>By8=h6UO~Mtu=sK9|&z zozts>>~#jd`YDPKD9<_VMA)~jvQA!2U{0+$&;Jpv34HCsTeX{7YE)Q)cT|K2$X!3c zF2Edx5^zRz&wt%UUy2pL3K55=P~1U>aYx9jh}!3oYv<#PVSPloj3O^z%Foh0iY3ja zZH>HPN}w$umMYLDjD!>gg9A;5IIf+zsD5~3aUN^(8qMc&4MXz%Q&TvzNu%EAQH!7C z1^Ek0G)5jENFOKVLsNYw2(e#!7%rL?oJV+td!^zLF;VTmw-#Hc(4wzubRa_FsquS$M9a&$|qn|#pOCYQ%$n#YOh@9AF}FHE>zQ% kDtuINr4Bo)Np?f+k)2f|Lv=V%@lZXnU$7&-tF6Jozv>lrLI3~& delta 874 zcmZ`#J!n%=6u#%)cWz#q=A|!rd1+ch)23()Vq0wefk5IUt*g>>6cLP~Bq~&=2({Fo z!Ji9mI*4Gw#Sn1N!PT)-ap~?Nv@RX>oO^?tf%l#7JLi1gJ>Y?DUWCLC^EA z2_dA9gj5n-G(%I4gp(kI?Z{M;*MxuTN=L}ik#**7lD1;Zi6F5`lW`|9Rvd9+%!;xT zVTO~d{(8H2Tga>(&AU;~ibW?PE6xhfzeBM}`h?7T&!~(rhehP)piN<^2P9*bsr$rA z%tq-WUYn+Qx-HZ_pA!lvI@=IfGX^y?}r3lG>!r6JiKX*dO zop3ljp%k&5Pbk??cS5PkF(S)02<+d>^f`kN=8a0{g9*FhIwIlJF-+eyhJ~|0Gtpn{gZZrd@%d zU3Gx;l%iA{pw$#NTu>fQF;{D5KbXHdq1(KrH!!AJtk+S#qKCHmq1G3@rhj9F9?^#g zI;S`7?!_pNMV-O8WevE3@J=`WI~qL6%*ny$@Tmt6&H1m&@vruWkC(|X|F@3_v=76wi7G@i;Z@Pq(GkfeW DgHLiD diff --git a/src/map_reading.c b/src/map_reading.c index bda1459..5f4c331 100644 --- a/src/map_reading.c +++ b/src/map_reading.c @@ -5,15 +5,15 @@ ** Main function for the my_sokoban */ -#include -#include -#include #include +#include +#include +#include + #include "../include/libmy.h" #include "../include/sokoban.h" -char *open_map(char const *path) -{ +char *open_map(char const *path) { int reading; char *buffer; @@ -22,58 +22,63 @@ char *open_map(char const *path) write(2, "No such file or directory\n", 26); exit (84); } + buffer = read_map(reading); close(reading); return (buffer); } -char *read_map(int reading) -{ +char *read_map(int reading) { char *buffer = malloc(sizeof(char) * 10000); int size = 32; size = read(reading, buffer, 10000); - if (size == -1) + if (size == -1) { exit(84); + } + buffer[size] = '\0'; return (buffer); } -int count_columns(sokoban_t sokoban, int position) -{ +int count_columns(sokoban_t sokoban, int position) { int columns = 0; for (; sokoban.buffer[position] != '\n'; position++) { columns++; } + return (columns); } -sokoban_t count_lines(sokoban_t sokoban) -{ +sokoban_t count_lines(sokoban_t sokoban) { sokoban.lines = 0; for (int i = 0; sokoban.buffer[i] != '\0'; i++) { - if (sokoban.buffer[i] == '\n' || sokoban.buffer[i] == '\0') - sokoban.lines++; + if (sokoban.buffer[i] == '\n' || sokoban.buffer[i] == '\0') { + sokoban.lines += 1; + } } + return (sokoban); } -sokoban_t make_map(char const *path, sokoban_t sokoban) -{ - sokoban.buffer = open_map(path); - sokoban = count_lines(sokoban); +sokoban_t make_map(char const *path, sokoban_t sokoban) { int k = 0; int columns = 0; + + sokoban.buffer = open_map(path); + sokoban = count_lines(sokoban); sokoban.num_chars_map = 0; sokoban.map = malloc(sizeof(char *) * sokoban.lines); sokoban.map_save = malloc(sizeof (char *) * sokoban.lines); + for (int j = 0; j < sokoban.lines; j++) { columns = count_columns(sokoban, k); sokoban.num_chars_map += columns; sokoban.map[j] = malloc(sizeof(char) * columns + 1); sokoban.map_save[j] = malloc(sizeof(char) * columns + 1); + for (int i = 0; i < columns; i++) { sokoban.map[j][i] = sokoban.buffer[k]; sokoban.map_save[j][i] = sokoban.buffer[k]; @@ -81,12 +86,14 @@ sokoban_t make_map(char const *path, sokoban_t sokoban) sokoban.map_save[j][i+1] = '\0'; k++; } + k++; } + return (sokoban); } -int is_goal_cell(int y, int x, sokoban_t sokoban) -{ - return (sokoban.map_save[y][x] == '.') || (sokoban.map_save[y][x] == '+') || (sokoban.map_save[y][x] == '*'); +int is_goal_cell(int y, int x, sokoban_t sokoban) { + return (sokoban.map_save[y][x] == '.') || \ + (sokoban.map_save[y][x] == '+') || (sokoban.map_save[y][x] == '*'); } diff --git a/src/map_reading.o b/src/map_reading.o index df7832ab7f3f00ce6127814a4673246c7e9327ae..a38c8ffa862c9e911398f42bdf990248fde3ed79 100644 GIT binary patch delta 1833 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 -#include -#include #include +#include +#include +#include + #include "../include/libmy.h" #include "../include/sokoban.h" +sokoban_t move_box_left(sokoban_t sokoban) { + if (sokoban.map[sokoban.player_y][sokoban.player_x - 2] == '$' || \ + sokoban.map[sokoban.player_y][sokoban.player_x - 2] == '*') { -sokoban_t move_box_left(sokoban_t sokoban) -{ - if (sokoban.map[sokoban.player_y][sokoban.player_x-2] == '$' || sokoban.map[sokoban.player_y][sokoban.player_x-2] == '*') { return (sokoban); - } else if (sokoban.map[sokoban.player_y][sokoban.player_x-2] == '#') { + } else if (sokoban.map[sokoban.player_y][sokoban.player_x - 2] == '#') { return (sokoban); } else { - sokoban.map[sokoban.player_y][sokoban.player_x-1] = '@'; + sokoban.map[sokoban.player_y][sokoban.player_x - 1] = '@'; - if(sokoban.map[sokoban.player_y][sokoban.player_x-2] == '.') - sokoban.map[sokoban.player_y][sokoban.player_x-2] = '*'; - else - sokoban.map[sokoban.player_y][sokoban.player_x-2] = '$'; + if (sokoban.map[sokoban.player_y][sokoban.player_x - 2] == '.') { + sokoban.map[sokoban.player_y][sokoban.player_x - 2] = '*'; + } else { + sokoban.map[sokoban.player_y][sokoban.player_x - 2] = '$'; + } sokoban.map[sokoban.player_y][sokoban.player_x] = ' '; sokoban.player_x--; } + return (sokoban); } -sokoban_t move_box_right(sokoban_t sokoban) -{ - if (sokoban.map[sokoban.player_y][sokoban.player_x+2] == '$' || sokoban.map[sokoban.player_y][sokoban.player_x+2] == '*') { +sokoban_t move_box_right(sokoban_t sokoban) { + if (sokoban.map[sokoban.player_y][sokoban.player_x + 2] == '$' || \ + sokoban.map[sokoban.player_y][sokoban.player_x + 2] == '*') { + return (sokoban); - } else if (sokoban.map[sokoban.player_y][sokoban.player_x+2] == '#') { + } else if (sokoban.map[sokoban.player_y][sokoban.player_x + 2] == '#') { return (sokoban); } else { - sokoban.map[sokoban.player_y][sokoban.player_x+1] = '@'; + sokoban.map[sokoban.player_y][sokoban.player_x + 1] = '@'; - if(sokoban.map[sokoban.player_y][sokoban.player_x+2] == '.') - sokoban.map[sokoban.player_y][sokoban.player_x+2] = '*'; - else - sokoban.map[sokoban.player_y][sokoban.player_x+2] = '$'; + if (sokoban.map[sokoban.player_y][sokoban.player_x + 2] == '.') { + sokoban.map[sokoban.player_y][sokoban.player_x + 2] = '*'; + } else { + sokoban.map[sokoban.player_y][sokoban.player_x + 2] = '$'; + } sokoban.map[sokoban.player_y][sokoban.player_x] = ' '; sokoban.player_x++; } + return (sokoban); } -sokoban_t move_box_up(sokoban_t sokoban) -{ - if (sokoban.map[sokoban.player_y-2][sokoban.player_x] == '$' || sokoban.map[sokoban.player_y-2][sokoban.player_x] == '*') { +sokoban_t move_box_up(sokoban_t sokoban) { + if (sokoban.map[sokoban.player_y - 2][sokoban.player_x] == '$' || \ + sokoban.map[sokoban.player_y - 2][sokoban.player_x] == '*') { + return (sokoban); - } else if (sokoban.map[sokoban.player_y-2][sokoban.player_x] == '#') { + } else if (sokoban.map[sokoban.player_y - 2][sokoban.player_x] == '#') { return (sokoban); } else { - sokoban.map[sokoban.player_y-1][sokoban.player_x] = '@'; + sokoban.map[sokoban.player_y - 1][sokoban.player_x] = '@'; - if(sokoban.map[sokoban.player_y-2][sokoban.player_x] == '.') - sokoban.map[sokoban.player_y-2][sokoban.player_x] = '*'; - else - sokoban.map[sokoban.player_y-2][sokoban.player_x] = '$'; + if (sokoban.map[sokoban.player_y - 2][sokoban.player_x] == '.') { + sokoban.map[sokoban.player_y - 2][sokoban.player_x] = '*'; + } else { + sokoban.map[sokoban.player_y - 2][sokoban.player_x] = '$'; + } sokoban.map[sokoban.player_y][sokoban.player_x] = ' '; sokoban.player_y--; } + return (sokoban); } -sokoban_t move_box_down(sokoban_t sokoban) -{ - if (sokoban.map[sokoban.player_y+2][sokoban.player_x] == '$' || sokoban.map[sokoban.player_y+2][sokoban.player_x] == '*') { +sokoban_t move_box_down(sokoban_t sokoban) { + if (sokoban.map[sokoban.player_y + 2][sokoban.player_x] == '$' || \ + sokoban.map[sokoban.player_y + 2][sokoban.player_x] == '*') { + return (sokoban); - } else if (sokoban.map[sokoban.player_y+2][sokoban.player_x] == '#') { + } else if (sokoban.map[sokoban.player_y + 2][sokoban.player_x] == '#') { return (sokoban); } else { - sokoban.map[sokoban.player_y+1][sokoban.player_x] = '@'; + sokoban.map[sokoban.player_y + 1][sokoban.player_x] = '@'; - if(sokoban.map[sokoban.player_y+2][sokoban.player_x] == '.') - sokoban.map[sokoban.player_y+2][sokoban.player_x] = '*'; - else - sokoban.map[sokoban.player_y+2][sokoban.player_x] = '$'; - + if (sokoban.map[sokoban.player_y + 2][sokoban.player_x] == '.') { + sokoban.map[sokoban.player_y + 2][sokoban.player_x] = '*'; + } else { + sokoban.map[sokoban.player_y + 2][sokoban.player_x] = '$'; + } sokoban.map[sokoban.player_y][sokoban.player_x] = ' '; sokoban.player_y++; } + return (sokoban); } - -sokoban_t move_left(sokoban_t sokoban) -{ - if (sokoban.map[sokoban.player_y][sokoban.player_x-1] != '#') { - if (sokoban.map[sokoban.player_y][sokoban.player_x-1] == '$' || sokoban.map[sokoban.player_y][sokoban.player_x-1] == '*') { +sokoban_t move_left(sokoban_t sokoban) { + if (sokoban.map[sokoban.player_y][sokoban.player_x - 1] != '#') { + if (sokoban.map[sokoban.player_y][sokoban.player_x - 1] == '$' || \ + sokoban.map[sokoban.player_y][sokoban.player_x - 1] == '*') { + sokoban = move_box_left(sokoban); } else { - sokoban.map[sokoban.player_y][sokoban.player_x-1] = '@'; + sokoban.map[sokoban.player_y][sokoban.player_x - 1] = '@'; sokoban.map[sokoban.player_y][sokoban.player_x] = ' '; sokoban.player_x--; } } + return (sokoban); } -sokoban_t move_right(sokoban_t sokoban) -{ - if (sokoban.map[sokoban.player_y][sokoban.player_x+1] != '#') { - if (sokoban.map[sokoban.player_y][sokoban.player_x+1] == '$' || sokoban.map[sokoban.player_y][sokoban.player_x+1] == '*') { +sokoban_t move_right(sokoban_t sokoban) { + if (sokoban.map[sokoban.player_y][sokoban.player_x + 1] != '#') { + if (sokoban.map[sokoban.player_y][sokoban.player_x + 1] == '$' || \ + sokoban.map[sokoban.player_y][sokoban.player_x + 1] == '*') { + sokoban = move_box_right(sokoban); } else { - sokoban.map[sokoban.player_y][sokoban.player_x+1] = '@'; + sokoban.map[sokoban.player_y][sokoban.player_x + 1] = '@'; sokoban.map[sokoban.player_y][sokoban.player_x] = ' '; sokoban.player_x++; } } + return (sokoban); } -sokoban_t move_up(sokoban_t sokoban) -{ - if (sokoban.map[sokoban.player_y-1][sokoban.player_x] != '#') { - if (sokoban.map[sokoban.player_y-1][sokoban.player_x] == '$' || sokoban.map[sokoban.player_y-1][sokoban.player_x] == '*') { +sokoban_t move_up(sokoban_t sokoban) { + if (sokoban.map[sokoban.player_y - 1][sokoban.player_x] != '#') { + if (sokoban.map[sokoban.player_y - 1][sokoban.player_x] == '$' || \ + sokoban.map[sokoban.player_y - 1][sokoban.player_x] == '*') { + sokoban = move_box_up(sokoban); } else { - sokoban.map[sokoban.player_y-1][sokoban.player_x] = '@'; + sokoban.map[sokoban.player_y - 1][sokoban.player_x] = '@'; sokoban.map[sokoban.player_y][sokoban.player_x] = ' '; sokoban.player_y--; } } + return (sokoban); } -sokoban_t move_down(sokoban_t sokoban) -{ - if (sokoban.map[sokoban.player_y+1][sokoban.player_x] != '#') { - if (sokoban.map[sokoban.player_y+1][sokoban.player_x] == '$' || sokoban.map[sokoban.player_y+1][sokoban.player_x] == '*') { +sokoban_t move_down(sokoban_t sokoban) { + if (sokoban.map[sokoban.player_y + 1][sokoban.player_x] != '#') { + if (sokoban.map[sokoban.player_y + 1][sokoban.player_x] == '$' || \ + sokoban.map[sokoban.player_y + 1][sokoban.player_x] == '*') { + sokoban = move_box_down(sokoban); } else { - sokoban.map[sokoban.player_y+1][sokoban.player_x] = '@'; + sokoban.map[sokoban.player_y + 1][sokoban.player_x] = '@'; sokoban.map[sokoban.player_y][sokoban.player_x] = ' '; sokoban.player_y++; } } + return (sokoban); } diff --git a/src/movement.o b/src/movement.o index 109e4b4d28a4ea65c33d38c0036105d6c5d884b0..3bf7821c9c7f2054a84f3088fe28a9f857278e9e 100644 GIT binary patch delta 1366 zcmcgsO-~bH5Z?FQ&a%5A^nx_p(Z9fn7`?#JiwDBVgE;#xSWq}=++=6wnVFq^-e{17AgPn1cO`yOTc8H#30@_D+i9y- z2B=c&0Ji|A9pDk5!2#YXd$Orck7w>k+$Tz{PN_zKb_e(cND-}jG*+Wq;sN;?Io*!g z5^kynU#iDp&5yNOh%I1RGsq5U9c%`lYX+Zb5XE&WPT&qDCYjK{r^Ww5fYl9&q7~*D59?joWXwFS(j24C;EplY_(naOFODC=o9} zC~X0Zfu;;XC1qsg2_%KT1x@5rS!jA{TWuIp^20Ik^?{ZJ-#gGQQ1b$`QIpmUZ7D*% z!2L9d0ecT}QIV%C&}$dlABFPNqR=C;PiF&K zx`@s!@ku*;XczyAPqV$L1B3>Tu8KH$f3} z={IjV4()8nG;|4C3`zhIQg{EXzi5E0)EPxQb>x#pZD|o@Fm_nd~}lk$r?lBFjc_ HG!gj;60XY4 delta 1301 zcmcgs%}*0i5a0KsIyj?2g>l4L~a2`0)U_4a5^qSe~0@XgFggVdVjRMjA6 z>P%8&kOq^~8pLZ7YmGR$MV-DLzavqbk?Js0c7t@9#9@$#WKr+pu?+tbby}VwXu>Cp zd`tDwMGwEsoVtmHv|XjxALr5~HHC_{p_IAyD5B)(ntApvojzF%T?( zKb8Wx222@(YK+LrL+CPa0{n>K1o)SPWy2621^WQ7IM`Q#rLlAgLRi8Q5Q-w}2kO9c z2#|Nkct__po;;| zf-cX*1crM-kCxZbYpi2xe-Q%^>MJjT6cxKzLw@<-7B->%49b{89Whe}?*Dilw@}Aq zr4E_JP{}kZ5nfonmny3nF`4}Wu(BQ>3cpk-$kdbjtH;5|ox1!U!u+Yz)$TNJ9gW*J zSHPmkGZ{Fg5E`&$3I!lvGfKtN -#include -#include #include +#include +#include +#include +#include + #include "../include/libmy.h" #include "../include/sokoban.h" /********* * MACROS * *********/ -#include + #define TERMINAL_TYPE (strcmp(getenv("TERM"), "xterm") == 0 ? "rxvt" : \ getenv("TERM")) SCREEN *mainScreen = NULL; WINDOW *mainWindow = NULL; - -int play(char const *path) -{ - /** - * Load Map - */ +int play(char const *path) { + // Load map sokoban_t sokoban = make_map(path, sokoban); + sokoban.base_path = path; - /** - * Count number of boxes and Storage locations - */ + // Count number of boxes and Storage locations map_check(sokoban); - /** - * Locate player x,y position - */ + // Locate player x,y position sokoban = find_player(sokoban); - - sokoban.base_path = path; mainScreen = newterm(TERMINAL_TYPE, stdout, stdin); set_term(mainScreen); int cols = 1; - for(int i = 0; i < sokoban.lines; i++){ - if(strlen(sokoban.map[i]) > (size_t) cols){ + + for (int i = 0; i < sokoban.lines; i++) { + if (strlen(sokoban.map[i]) > (size_t) cols) { cols = strlen(sokoban.map[i]); } } + mainWindow = newwin(sokoban.lines, cols, 0, 0); cbreak(); @@ -63,18 +58,18 @@ int play(char const *path) touchwin(mainWindow); wnoutrefresh(mainWindow); doupdate(); - for (int i = 0; i < sokoban.lines; i++) + + for (int i = 0; i < sokoban.lines; i++) { mvprintw(i, 0, sokoban.map[i]); + } + move(sokoban.player_y, sokoban.player_x); sokoban = game_management(sokoban); } } -sokoban_t game_management(sokoban_t sokoban) -{ - int key_pressed = 0; - - key_pressed = getch(); +sokoban_t game_management(sokoban_t sokoban) { + int key_pressed = getch(); sokoban = key_check(sokoban, key_pressed); sokoban = check_zone_reset(sokoban); loose_check(sokoban); diff --git a/src/play.o b/src/play.o index 79e1141f26a0774bc8a94c4e18f5a1bd2d2ac36a..10bd622f21b80f008fc553ff60ad5fcab6def316 100644 GIT binary patch delta 1352 zcmZ8hUuYCZ7@u$UW^UHqB$vI-?QJ-(y*6hP)BL%(5z)rISV~e0LLS80+6Tpl z`~BwIxo?MEJpv0EkhG!i& zH&Im*T_k}j!X$p_oPrXT-O6jF0%_W%^|IUCN!R+)Gp=_psf5dkZk!>|@8C!77TB3A zyVqdTW~Z|565E^do&3Lg#PPHCf$nmXysJs>b&?0|NGTzBzOx^fI|uQf&ePC?A9^8v z@8x`(U~%#6JZ7-xWiy)yuX{mvWY`X~W(kS|C~$bk7i%7chshuQW~dGlTlUsr-6X() z`M22MaYp%L=1b=8XFk>o{Zp*Otv%uuSt?_#d> z1$3{^++(a`TB7h47NqSx)}fjnW5E;rq42_#&$5JOGQd2&P_;-0zxyq-_)jdW@&%UR z`c5!V*=FvZYN-4-jjtP5YC#yasCP}bacoF+Pm3Cv zy>DY>BnYQl)B|Sk0#1zt@CnY0JOi4{Y{>!);A|8?70*RO;bnOU6+d#ls)MQY0^W&+ z;5x!+0LvJT4uyHs@JWl)#)G31;a5iOOTRjLAj)_JSETxlQI8r`O+%F)CzY+Yvv4tK zjKu)kuoizz*C>{~GOor&IE0NjhM%!kkKt3Ct;ZW~q#p!Aelw=s)J_CZ<|suk+FGZT!tFz1}_ zXU_eZn=BuPpN_++5je22`7qbs_@;_Sc%Ggj{>snki)Tu!{z>hwY)Z4q7~`g(NXbyi zRH172Iqwo{1x(CRHa76=!3Hz!zS}yvLSy-rc z*qLCD3NUsN!i*QmdOgiAbAi0o&%uVNQs&1oHruyyEhjD{RtTzCSJOhKN5y(M&EZko=N} z%akHhe-Jt*TnYG2`o7r#AsN?o5Kfr5O4LLC_?gh;w?a}a7KAS6ghgeEWG7zDA-^y*A>k~}4!iXm(Fv*Vl%?mNd*S#y;#KPF;*IFU6`$+kxB4r? zOEI{Mv*T`-M;BJTsD4I2M_1jzqok&KRN7=P9>Nt;cl4-#M(SR?O6vX|wG!R0r_h;j zv#<52pGJ#a#M;C?(EZw^0omQ*Y-~k_g<7O4ci_RPF}Q%ODHlG+b5mp4o6*#ldz{zt z7CEa}oOWR=ZlB%*m+&an-{EPhKftS0-}L{Q{@#F9zg_VFo -#include -#include #include +#include +#include +#include + #include "../include/libmy.h" #include "../include/sokoban.h" -void win_check(sokoban_t sokoban) -{ +void win_check(sokoban_t sokoban) { for (int i = 0; i < sokoban.lines; i++) { for (int j = 0; sokoban.map_save[i][j] != '\0'; j++) { - if (sokoban.map[i][j] == '$') - return ; + if (sokoban.map[i][j] == '$') { + return; + } } } endwin(); exit (0); - -} \ No newline at end of file +} diff --git a/src/win_check.o b/src/win_check.o index 413161b4b4e8d541e0710f2ceccb0a230c249e1b..9fa6380d492d82bb936ba620c724cefaa74f66c0 100644 GIT binary patch delta 253 zcmbQCHA8EIG-Evz2P*>*FmbShC>D-XAjt+|IxukyC^0fHfW?`3z!D4`xrqe~OuU>u zKm`yTOnhLD07Mx-TR2cg0>Tjhb7UYKK`=)F!V%&FnXJK4o@tlIz$6ToGJr^lfH@`* zjwqO80d!Uo&{$3&W?&Lyo&==0Kx{^V$u}5f83i_fW9(pNRGwVVTE-}~`5S8yt7Icc W9tc3{IDj}5Xdei4Y;NS9&Itgj3mH%V delta 253 zcmbQCHA8EIG-EvrM=ApY0}}@;kOWffAc_q{I52SuDlsxJfJKOgFW3@?}?0O9blhXZ9KARK-$M+U+X0CN-|96^4N$r>ExnRa;$OhRBO1BjF`m}3Ir zh=4g33@jW)Kw~+9n1M-@WfG9$0 -#include #include +#include +#include + #include "../include/libmy.h" #include "../include/sokoban.h" -sokoban_t check_zone_reset(sokoban_t sokoban) -{ - sokoban = reset_zone(sokoban.player_y+1, sokoban.player_x, sokoban); - sokoban = reset_zone(sokoban.player_y-1, sokoban.player_x, sokoban); - sokoban = reset_zone(sokoban.player_y, sokoban.player_x+1, sokoban); - sokoban = reset_zone(sokoban.player_y, sokoban.player_x-1, sokoban); +sokoban_t check_zone_reset(sokoban_t sokoban) { + sokoban = reset_zone(sokoban.player_y + 1, sokoban.player_x, sokoban); + sokoban = reset_zone(sokoban.player_y - 1, sokoban.player_x, sokoban); + sokoban = reset_zone(sokoban.player_y, sokoban.player_x + 1, sokoban); + sokoban = reset_zone(sokoban.player_y, sokoban.player_x - 1, sokoban); return (sokoban); } -sokoban_t reset_zone(int y, int x, sokoban_t sokoban) -{ - if ( is_goal_cell(y, x, sokoban ) && sokoban.map[y][x] == ' ') { +sokoban_t reset_zone(int y, int x, sokoban_t sokoban) { + if (is_goal_cell(y, x, sokoban ) && sokoban.map[y][x] == ' ') { sokoban.map[y][x] = '.'; - return(sokoban); } return (sokoban); } - diff --git a/src/zone_check.o b/src/zone_check.o index 4059b88d75a2e6775f47b794333dcdfe4d8e03c9..bfbb570ea153b0645c2408a2cb6d37064bf52555 100644 GIT binary patch literal 9568 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 a*Gq2lrlccqn#<`wOY#4CQdLr_{(k@tSW=Pz literal 10008 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 h9NokVvt%W%v#P>fp(D?MrTjoKk|2M6uvxfix