From a7da366a02103432d12cf57c3b1b633fc972298b Mon Sep 17 00:00:00 2001 From: Alexandre Date: Thu, 7 Nov 2024 20:13:35 +0100 Subject: [PATCH] added exploration function --- bin/main | Bin 222033 -> 227310 bytes main.cmi | Bin 5677 -> 5940 bytes main.cmo | Bin 20192 -> 26551 bytes main.ml | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 115 insertions(+), 5 deletions(-) diff --git a/bin/main b/bin/main index f5e98d685b9688914bede9a9f3757ca7389fb9bc..39de58c6e2030e42c72cb37d2e8365ce259321a4 100755 GIT binary patch delta 3812 zcmds3Yf#ix6yJL;i@OWU{udSjmtfH`D;!8sL9HMyozxkc>@h`2g=nUUlZ=*@+w}ZE zk4Yv^GrjoWj59H#y{7F=Pb;mctW2p){UQ%pBn9!o_B;RmFN-{KroOc^KhC}PoO92) z=k@1@o$k)C`=LkGThw`k8V&9`LUX7^^R!l)s#3YGmDVdamnxkx{cfAhc0X_D1$vi-!W>freJIzqt>^VurT+l%!%F98e z;ZO%XFBcr8-BB`uU7hrz-Bjn`Y4Y=T$LTVDwS$s5B}_}>oC@XSJz>gsJ7B>DNRX4c zsg*K#dn-Bk3ZKsAAK@WyBAxAydEWFNa1z} zbIOSUhoCWnLv?a$=cW^s0kZc5VjnC1G0)f9r5@vZI4t~4$H=gYgB!S1BdnI%_I5I|`f)6(D+Z~`-c-$Xc3~-HrWj>5R~b@a z#k{G57NKZRQ5ZiRRE9*MjuuJ-`S|5N)IgkR@cur^HhqK`>ZUTrT-Rx8qB=}Xv-Ny2 z=A5v}G^;_G)o^tZUMzDl1CWqQo~8pk;BN`&W>9fG4;Y#riTgl$iq4mrxb!Ps6qPPL#smc6NHwB_` zt%zo-T-wmVTl&a~ccCO{GMHmd(Oh9B^Sn+n;z~%;O6<_Ga>bymI6bkfaD9TFFsv_P zFEab$e;)XGClODxMIMPq4vis^L$3@Dveg65;kO3q0=>$abLEr}9B|xf5Zir3O zWUfooe(zAx2cN6g>!--zlDkD%)Jy7-~$}iS|+$Pyj-L+CrazYCU_;*V)c3;9T43i^7sZdk}g$`aXW~++Nxan ztk~XR~>l1W7uS?WE?oYs96^g`!r-sshf)h?0St#aGZ9IO56rzrVZNJeP$SiMzwf5D8J0g=5H z{gvlu>L-Hxur0&!NkAr8DIh<2TE4lm*|s1TgZB>%+21i_f8mh*YiG~ZzdXK|LbBNk z;s@rw?@T1(s*eQo$7f#0aYN?0Ig@Z9#uDZch?8ke^UJbB%I>vb&_{mr7k z^WiLA6m04}*OS+=cR@|A%(AF-hFmXSq%XQ7ktFNfu&DgkA@Wk0A}8JRd1uu8A2268 z>4`i*?v}cjHSQU2GNm!(Kz<@DZ7+LC-~nzLr~O%?Gae9jOkdc43cIB~r_7jn1-2Ie z@)K8NJrg*nqEkUWx&^>8KyIG}2>(!Mk6&-eNzL7fCr-lktI_aF9kww~hBnU9&6&ZO z71j5xSygjy^=*MGYiq0TSyLOBQaH7spukl&I;){^1m4uq)ht#+WARXH!P>w))7UVM z#b{_Osi94s<*M&*p8G_`OfrJy|6VvVF#G@_O$S)7K(8N>XGzG#$l8Mo%I zp>g8%D?)!P)=$~h;n1p^b+s}MeqXlvqQ$jKE35BYQLEIU(7{{u`Z31xZ8hC>d)I6@ g`|RScif?>8o$tC+Z==H7*;}P^D0e?ksnUVJ0SmuoaR2}S delta 1643 zcmcIiU2KzO6z+RYw{=}tTP$n0V%K(Mv^KQj=Gdm0Ly2Cn$Px?}jJTUk(1eY|h8iW^ zE{vF%U;<$WNL-dl+y$g0jO0VXG1PS8&o&hmMTWr(C9Ew~gD|#zp11vmTa(2r-}LEu zpY!vc=X^P-bm`ZL(%v`3X-NGJlO;5|OSs5<1AK5!PXl-1DH^#6HesM0Hy}!`8Ss;L z8urrs99Sqm4ZCxw>LI)*M(3;DOWxz!9X)sXy4{+1A zG`zJmaO^&{(9}F^Cs$@sZL2WSLi-KI)RbaT`vJ3(-Sk2M8mM27wN#zv(xZrO zIm^ER15M2>^x_m7J*-D=u{focPTk^KR{_`ZEZN#8h`&RtFw0r&)O81J|HDAr3}~aq z6!>VrVYz{d|9c?gas!ntJJ9vJU{lIWI4hJcD@F>%N&3}}L4rb7^sKt4QrW~yo zrH*9>%}&4p6pe)NsQ9@n_v$-%?nk> zxFB@8dbS7H@=xbw$g`0l;~&%GtIp z?>IQtSlKWlK@ZJ5iN{ZX?&QQKOq={a&|sob}jOF8m6hh{Bor3_@8_%rwH z6@Era@i1h*S-UTmB4hH%w@eJlA7lK?wc1)xLkO+qvRLkhOk8+KCSIj*i1#BF!qM_3 z=1zt@^83hp17nJIgn2QqDf`0M=UU;q$~rmrz)J49+Mp}yRl?8Vgrg_CArk4_wL9Wo z7p@6~LdNEN$H4LXo=5XjG{>Tpn*0>aF>rkCLZfH0Z8WO9xDy8p#4k#57j_EE)MWDk z|CUHcd*`b!MFgvlbz`*1qV`(j#*YrayRxC>;`+EpfUP-_SM}X9P(q{1e=ftb-PRuqlgv zRFGI00XNBW&>dbT6_5in$ri|im&jFk0{$ffrS9-5d0y%Z^GHz2g}LOQG!W*HNZmv5 z3K^>F53|XOx?Gq=YITKhivaEh^NAVfz-wd-9vyd^TES~uJ)i|-7w!{(M>B|bi}XTr z7x#_7%hFXM{W{5)v*TM>x=^IwAamv35=Nv>PBsQaK1j~V84?DP5MhRQNlt_X-XY}? zg-OfBnzuz*MNUNwgk_{-q{X;Iq?Zy~necG$9rG zF%p)@Nqut$)*Y>HuxP#Ih!xdz0*yk}g!c-qAh!(t(lHL*f}6yWmGq88Ay@G`R+Dj2 zeIzW`E{uu>2}h7+(cNGT*%{r{pHW<h&qUGB4mrInxkkJE|P^F}uCU?byCM#Z4N4*HvvuZCg+F#gQR8b8H5MezVO5Ua7X{{sQ}Ff{Cy zJsd9IV3FR$(pWDtA2By&E{AWJNN(mPYI(4Q2X)NW5>x_)JTMHTww8wD!DE=Obv`y1 zhu2!JI2|^?QQ^6OUjVi;A2Q4qsckfcqqKjKbdSZeiMErS#$Nu-Xd)PbU|2+nwc)sm z0ryVRfPFkFZPjXXsP`eca1_=A{`>CB$`yxD;yU1{b-S z8(l;a8m9S4*JkW4p^p-sb}8WY#2C}re?aT>e<$rAFMdcXu4@Nq1(?#olto2*E(WpU zUC?7}tXgeX+v+jlHgS?LeVCn`fUHBUx#8#tOV$J`(?C1^Q?H3e3l;iD_J%XC~$$ zw`L;Mt=jA=-~{dKPL}#s*H^O5vx)LQvBU(CILj&LMDDz$hjthP02q>oLh^7bf?O0b zVl`4pOne7FHig>6hs5m{*t3?*P8OtTK-ea(UKHWaBK(Eh_?0!g9zcfVsgOLKqBn4{ zfT2G|Uai^t>8sQ0S4!-F6Zxq3i-MOZR<}p!%N%fp0X_k+Li$!n-$?zHH!m!GmrME9;aKSlStx|=pgF<9X{()Rmf(IW>b<$|AbUH zPR1o9`)>p6f_xj~PoShbT=+B+HqwV!Bc+Aj=?M6g5K8FgSF1#prm@&H&ujB*wb@|yfo?^D!=yha$PCOhSfgwv`!xk(VrLBdzas@MUrnKZ>F=cd_b%(OZ!9zWprFrgyF3yOMXOObQ}`dZ8m>DME9XnjbL zEXWF)X3(_IcxohWHJfV{$?Y-I!5ic&w|W3yC84U7uuUyBq3rGjWjxFGNfsEI;y zjQSN#``2ygf8hNK@nEO<^~hn_#i1X~Y6F7E0ooGKPN#8gB=#{^^>3@LGCW>dqQ&O$ z+Nb#)ZWrL|++2llvRkck$WNU5XGXmRIYGM_v<;McYb4&qsCUmImY#`8_(qtjQUM~k z_NZKeUpUuZ#0aclrR|e8fLDNH<@B z1@uS0F0}TEuvvt^h8iZx$s*s+z5K?!oCj11y*i-R18U|%BVbDcW?uR_lsoXdg<+B}8xn14aZ%4|M zlZ5AkY+Nc8>Bb{0fDSRRwsLXm6u-^sC>rRs7qiAl4Ky{$|9(19Q62NIZYheXtqe8WyAs(yOXSX<9o|*J8-{HlK6*6sf z*UCkDoNJt58YV!E(Dx?vy-Nk3;mN;DA|Jh~N<3L^^|}J#xd41OETKq~1n0>}zwj7= zol*;bL*%Eq?in7OWd>dV)Cu~*pdUgFyvUO*W?(9Mi*1_C>I$f%N$1qFobD_Wt0i9P(_(gt!YhUESC1#=+P#5UefPMotQNok$%tRS-Q4_A9(e1U_y@2nl z_lqK>1Vf9}&6Oq#`YQ~0Spb*0OuN9YGR4^d5*Ye}A(<)$cruVFE?j)8;6W;zu5Nc!x6>&`7v1D8ZZYZQ02mB~V3(m#p z7TW>;#XH^Y1%8{>jW>#t?r?#-Okh1gE~M>&v}P)>fhPxLHS=GtxVFn$8f|2apHp{UH4bs?yApRHkwa(0o-TwZvL# zx6n)BAG&D@bi2YxCm$^>jj-YI(+nv_<)kgQ>YPnaxf%Q zz7C>EH0p6Xz!J!DKu#%TxylniV|f6mh7=|a=+*UJ?@ci~menMhChpBXa(zX^ti)~b EA94hQW&i*H diff --git a/main.cmo b/main.cmo index 4db212b8b179597185bd9a013494f709933d200d..fb2bd70218ce93f3b8319bf27d4059f652843f70 100644 GIT binary patch literal 26551 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 RPk?R&JsnF+d&FFZ{{uW&S1AAh delta 6077 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 ara5^B6C-kILNPVb<)^DTp(qD~{PTY!Uzpke diff --git a/main.ml b/main.ml index 234bc4a..c446b9b 100644 --- a/main.ml +++ b/main.ml @@ -94,6 +94,8 @@ exception ReturnInt of int ;; (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +let current_status = ref BlowUpCrates ;; + let equal_pt (p1 : pt) (p2 : pt) = p1.x = p2.x && p1.y = p2.y ;; @@ -269,6 +271,35 @@ let evaluate_dangers (gd : game_data) = done done ; + (* add players as warning (in case they bomb) *) + for p = 0 to gd.nplayers -1 do + if p <> gd.player_id then begin + let halt = ref false in + + let bx = gd.players.(p).xy.x + and by = gd.players.(p).xy.y in + + for dir = 0 to 3 do + for w = 0 to gd.players.(p).bomb_radius do + let cx = bx + w*(fst order.(dir)) + and cy = by + w*(snd order.(dir)) in + if not !halt && is_valid (cx) (cy) lines cols then begin + if gd.laby.(cx).(cy) = 1 then (* bedrock *) + halt := true ; + if gd.laby.(cx).(cy) = 2 then begin (* crate *) + halt := true ; + res.(cx).(cy) <- danger_priority res.(cx).(cy) Danger ; + end + else begin + res.(cx).(cy) <- danger_priority res.(cx).(cy) Danger ; + end + end + done; + halt := false ; + done + end + done; + (* sort bombs based on detonation time *) for b = 0 to gd.nbombs -1 do let m = ref gd.bombs.(b).det_time @@ -323,6 +354,7 @@ let is_safe = function let move_safe (gd : game_data) (dgs : danger array array) = (* use this whenever you are standing on a non-safe tile *) + (* Strat : find the closest safe tile (or warning tile if there are no reachable safe tile) *) let pid = gd.player_id in let lines = Array.length gd.laby @@ -330,12 +362,16 @@ let move_safe (gd : game_data) (dgs : danger array array) = (* BFS to find the nearest safe spot (if it exists) *) try + (* 0. if you're standing on a safe tile, stay there *) + let (cx, cy) = (gd.players.(pid).xy.x, gd.players.(pid).xy.y) in + if dgs.(cx).(cy) = Safe then + raise (ReturnInt 4) ; + let q = Queue.create () in let visited = Hashtbl.create 100 in (* 1. try not to walk on fatal tiles *) - if debug then Printf.printf "Attempt 1/3...\n"; - let (cx, cy) = (gd.players.(pid).xy.x, gd.players.(pid).xy.y) in + if debug then Printf.printf "[escape] Attempt 1/3...\n"; if cx <> 0 && is_safe dgs.(cx-1).(cy) then (* North *) Queue.add (cx-1, cy, 0) q ; if cx <> lines -1 && is_safe dgs.(cx+1).(cy) then (* South *) Queue.add (cx+1, cy, 2) q ; if cy <> 0 && is_safe dgs.(cx).(cy-1) then (* West *) Queue.add (cx, cy-1, 3) q ; @@ -356,7 +392,7 @@ let move_safe (gd : game_data) (dgs : danger array array) = done; (* 2. find the path that get you off fatal tiles ASAP *) - if debug then Printf.printf "Attempt 2/3...\n"; + if debug then Printf.printf "[escape] Attempt 2/3...\n"; if cx <> 0 && dgs.(cx-1).(cy) <> Blocked then (* North *) Queue.add (cx-1, cy, 0) q ; if cx <> lines -1 && dgs.(cx+1).(cy) <> Blocked then (* South *) Queue.add (cx+1, cy, 2) q ; if cy <> 0 && dgs.(cx).(cy-1) <> Blocked then (* West *) Queue.add (cx, cy-1, 3) q ; @@ -377,7 +413,7 @@ let move_safe (gd : game_data) (dgs : danger array array) = done; (* 3. no safe tile within reach (very rare), look out for warning *) - if debug then Printf.printf "Attempt 3/3...\n"; + if debug then Printf.printf "[escape] Attempt 3/3...\n"; if cx <> 0 && dgs.(cx-1).(cy) <> Blocked then (* North *) Queue.add (cx-1, cy, 0) q ; if cx <> lines -1 && dgs.(cx+1).(cy) <> Blocked then (* South *) Queue.add (cx+1, cy, 2) q ; if cy <> 0 && dgs.(cx).(cy-1) <> Blocked then (* West *) Queue.add (cx, cy-1, 3) q ; @@ -398,11 +434,85 @@ let move_safe (gd : game_data) (dgs : danger array array) = done; (* you're probably dead if the code reaches here *) - if debug then Printf.printf "Attempt F...\n"; + if debug then Printf.printf "[escape] Attempt F...\n"; 4 with | ReturnInt k -> k ;; +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +let move_explore (gd: game_data) (dgs : danger array array) = + (* destroy crates *) + let pid = gd.player_id in + + let lines = Array.length gd.laby + and cols = Array.length gd.laby.(0) in + + (* find nearest crate and blow it up *) + try + let q = Queue.create () in + let visited = Hashtbl.create 100 in + let (cx, cy) = (gd.players.(pid).xy.x, gd.players.(pid).xy.y) in + + (* O. if there's a crate right next to you, blow it up *) + if cx <> 0 && gd.laby.(cx-1).(cy) = 2 then (* North *) begin current_status := EscapeDeath; raise (ReturnInt 4) end ; + if cx <> lines -1 && gd.laby.(cx+1).(cy) = 2 then (* South *) begin current_status := EscapeDeath; raise (ReturnInt 4) end ; + if cy <> 0 && gd.laby.(cx).(cy-1) = 2 then (* West *) begin current_status := EscapeDeath; raise (ReturnInt 4) end ; + if cy <> cols -1 && gd.laby.(cx).(cy+1) = 2 then (* East *) begin current_status := EscapeDeath; raise (ReturnInt 4) end ; + + (* 1. search without walking on dangerous tiles *) + if debug then Printf.printf "[explore] Attempt 1/2...\n"; + if cx <> 0 && is_safe dgs.(cx-1).(cy) then (* North *) Queue.add (cx-1, cy, 0) q ; + if cx <> lines -1 && is_safe dgs.(cx+1).(cy) then (* South *) Queue.add (cx+1, cy, 2) q ; + if cy <> 0 && is_safe dgs.(cx).(cy-1) then (* West *) Queue.add (cx, cy-1, 3) q ; + if cy <> cols -1 && is_safe dgs.(cx).(cy+1) then (* East *) Queue.add (cx, cy+1, 1) q ; + + while not (Queue.is_empty q) do + let (cx, cy, dir) = Queue.pop q in + Hashtbl.add visited (cx, cy, 1) 1 ; + if gd.laby.(cx).(cy) = 2 then + raise (ReturnInt dir) + else begin + (* add neighbors *) + if cx <> 0 && Hashtbl.find_opt visited (cx-1, cy, 1) = None && is_safe dgs.(cx-1).(cy) then (* North *) Queue.add (cx-1, cy, dir) q ; + if cx <> lines -1 && Hashtbl.find_opt visited (cx+1, cy, 1) = None && is_safe dgs.(cx+1).(cy) then (* South *) Queue.add (cx+1, cy, dir) q ; + if cy <> 0 && Hashtbl.find_opt visited (cx, cy-1, 1) = None && is_safe dgs.(cx).(cy-1) then (* West *) Queue.add (cx, cy-1, dir) q ; + if cy <> cols -1 && Hashtbl.find_opt visited (cx, cy+1, 1) = None && is_safe dgs.(cx).(cy+1) then (* East *) Queue.add (cx, cy+1, dir) q ; + end + done; + + (* 2. search one anyway *) + if debug then Printf.printf "[explore] Attempt 2/2...\n"; + let (cx, cy) = (gd.players.(pid).xy.x, gd.players.(pid).xy.y) in + if cx <> 0 && is_safe dgs.(cx-1).(cy) then (* North *) Queue.add (cx-1, cy, 0) q ; + if cx <> lines -1 && is_safe dgs.(cx+1).(cy) then (* South *) Queue.add (cx+1, cy, 2) q ; + if cy <> 0 && is_safe dgs.(cx).(cy-1) then (* West *) Queue.add (cx, cy-1, 3) q ; + if cy <> cols -1 && is_safe dgs.(cx).(cy+1) then (* East *) Queue.add (cx, cy+1, 1) q ; + + while not (Queue.is_empty q) do + let (cx, cy, dir) = Queue.pop q in + Hashtbl.add visited (cx, cy, 2) 1 ; + if gd.laby.(cx).(cy) = 2 then + raise (ReturnInt dir) + else begin + (* add neighbors *) + if cx <> 0 && Hashtbl.find_opt visited (cx-1, cy, 2) = None && dgs.(cx-1).(cy) <> Blocked then (* North *) Queue.add (cx-1, cy, dir) q ; + if cx <> lines -1 && Hashtbl.find_opt visited (cx+1, cy, 2) = None && dgs.(cx+1).(cy) <> Blocked then (* South *) Queue.add (cx+1, cy, dir) q ; + if cy <> 0 && Hashtbl.find_opt visited (cx, cy-1, 2) = None && dgs.(cx).(cy-1) <> Blocked then (* West *) Queue.add (cx, cy-1, dir) q ; + if cy <> cols -1 && Hashtbl.find_opt visited (cx, cy+1, 2) = None && dgs.(cx).(cy+1) <> Blocked then (* East *) Queue.add (cx, cy+1, dir) q ; + end + done; + + (* no crates ? Go for kills *) + if debug then Printf.printf "[explore] Attempt F...\n"; + 4 + with + | ReturnInt k -> k ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + let game_d = parse_input "input_test.txt" ;; let dangers = evaluate_dangers game_d ;; print_game_data game_d ;;