From f5e5113e72f5f7db8c02fb909379878b785fd662 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Wed, 6 Nov 2024 15:54:18 +0100 Subject: [PATCH] added danger map --- bin/main | Bin 181607 -> 184393 bytes main.cmi | Bin 2979 -> 4065 bytes main.cmo | Bin 8334 -> 11964 bytes main.ml | 111 ++++++++++++++++++++++++++++++++++++++----------------- 4 files changed, 78 insertions(+), 33 deletions(-) diff --git a/bin/main b/bin/main index 3a170239ca12e1efe4020d9dd592de941b248640..a2cd4de507b1be7a9330edf981f16d1fc8285800 100755 GIT binary patch delta 2510 zcmbVNZA_b06y_ejS_)g)Kx`Om3rt85(8X3{;`qXl6< zwgt^*V;0nXciJb?O6z_l{3!#D^CP^OD+ zQQNs%MRVURmuxLj>qF9u@N9Yi;y-Ch&TUROvy15xF5*XAIGG~Sq!n%o)%|z zLCn*|F)0qS22QR3BLFGC2`~t0lM6E=$3}o0ZC>1<8(=+IuNuG&a3}gWfG_~MaeJNd zEG8IX8@3Et^yJ`sp!>hUNrD8{ipylJ<03sf8+%MV88T(YJPkU~F%?mE5Z75HJB~eW zf{t-g#$b8q%xqHyv5p>Vd{PF0o_;)v<&177keE<8?3fTML;En#hysHoXJ!Zex2)_y zw;E?9F>Tl?)tRkq=%{OC6C zN+2Bw-jFrYC*7t^ulGrnJ{6Km-5nC2&W5BwYxp`Fl5)M)F9osBLvp9lR|lmocE^AW z80{XCdt=`Z%1cJS8x~(|YDgY3CaBl@#jAe~%Rap@3ct1yxyP6ejgHEf=9nH1OQWX~ zB$-kxM*PzJz!AU|J^72*L#l~oU5B|<9&Mqv_bjh#Fd~Ip=)fbVL)RJ(PW9qW)A1J6a<(6(9UT;RCOuAS z#hC2aKfTgk_Stah*%ZN`wmvDI@pDP*{FeE!*SLO4+b6K;QdoSZN4*hgG`-ppksi~h z^ATw>A@1E``j_o4j>+3*K-K_M|kiifQKoHWJI* z0kFZCfYEb)DRWvPra=uKFh$jN>w&fPBp!|f8n!DBleJuSiO#;3yDiae)g~}wvoO;U z#N;@-GKTf|q!b^TM^X6~QU&ng-&5keX=(NR>ffv9pC!%DVa~S7js6<03NvapuxoL( zmj`qEo@ZXP6CfRW%R51L{;znP#3LZi-2DJ;>>HDFKD<^aQ_q-?^^Zx}8J()H^V|mo zH{`>AUdlUxF>O2}UNau+I3pJ~Z}8y0mv<2BL+nxKNXyENt$#x*3gq{Ct^G*8Hjk;9 zLw~yGB-483S62`F_B`3$5j^EP5ex-S^r(MMJU0w7GI9dWTXw3?nR&PL5nlj+Py?Zc zf**pP!a)cJeKW|?k^g>az}FB6;63x+-hdyT&gLYNx^Ye_R#W;9li2Aw`9RF`vFcCc zVdEbACUBv$rT1uiaG4zM delta 537 zcmZ8ePe{{Y7~cC-=A7ip!L|lViEw6k@Q}s&vx3^e@KO|{{ehCQP;1QQpP$p3&fmri zN$H6Q47+sdu#6wnv8=qhv$8t?|C1-k8kO*=X2gOHZBWD z_v8BpejG-xoMYTVlbq)(3k`f|p^ga)5%#80%~cBlzO>+TwvS+suwq2pvuQjM9#3PR z(>#U;!XKkJ;NXriyuGda?HQbsF6T)Gap8OhKCX{rL9X!mgeq6LGKn41%{4>U7_t$S z>pWv4&aYWD7j0aW9@gg2#+FGH5;?@A&lp2o&f%%tU@DIex%pdiR`WO^l3=ue4xYB* zNgkd;Tkw+0<=U(0mp^>#FQ?dd7oo=Ndb#Y@<0gfv)PM6)ovT!@=1fF( z)*IVq#kaL`*`y9=nn$@_vBmJr%4jrrNIMg1s#an8{fa^Qr}g1OPU|%8hqnbZ7zNF4 zQOk0rYtt9!(=#;qSo0e1QtV#jWb*Qb vu7U2PXnM~QDl5E4=A2`}Iseqq&*1EQ>+B0oe9(`|#^^2~j6j%;CDi=_Oz@sU diff --git a/main.cmi b/main.cmi index 4d5bcb58b2f80fcf8fbb36a96e0311e6cd93daf8..65809bd7ccbe24c3e95e21610ec3bc1e260f2317 100644 GIT binary patch delta 2050 zcmYk7dr(wW9LLY^?7g5s8%Tm+0>MHfgb_|5sdN!?z^0ehI9A47WWk-5-F4Z8!5Q0L ze^q}hoUs|5W?ExvrW_MpdZ3|@W(gXUib{ea4@oG>N2M5b&e?l9yEAv^dw%yfzt8t~ zUbiK2IJK-queCo^SXfw|w>0mq?H?aP$ee)?zJgG6F?}Flc~ZAI0;2Jqc| zok4$#rPArNKd$*Ttlk_(8rs`bX2CeN$&mrUrsize-_(%{`0BMJOXeU!p0ACRcUI|~4O1uKTARpjI;B(TC3!sgdO=~coM_w?c!XdKNln)(b zkLh9fnv9s%#p8HpL%ARw946&TUOc{s$9KzkCwZ5}=kxeeGTudcm28X?$c&O6^Noxj zA&b=|7$=eqY8w1VwyH(YN7~gV5>LvUAEfLh3nP}p39>$-D5hJ6d&sVcm2jL~jL>4f zli}}4PUH$WMm9%27IRdFza_!Qa$i>mJ>X>W%6rjEokVebUgM^6U#%W_^|2x#<;a6>2c@ z&lowoX@0+<+j#z1wNKNEHTGjYo;O}@Qxq1ay-n!F8r_DuHixIeSzRG!DygrtOJiH1 zNKWTZok8WC9G()J^fWJh6_tRg9ZVe*Gim5<>cOYN?HY~<)n*h51DqT}DC4r^8A_Nh zhy8+ZmJ?>s8c-I4l1mA94E-qU5=U=lfCpV})+ zfh}S%#5;JcQ49E51350;U1z0x(B-AOFjd$OyLG4NiZn{-uLAKKN4x>(J&2u!I7|_5 ziosnR(TqyjEM+(7Zbt>*7J$=21Qqtsl0M^NpB6I|*5~gO8LP<&kyaD#hLj>*VP>fpE>{wctJ3Gp{~ zuout(ByWUdojPb00~dF27;Rt<@~ri`-K%@pNo02~Jss)Hf{zl~B;gi2C+qoXd6Au# z%ktH2DQBd-Bb@xhopb{lgycR*W(T!L3`V(=0rV1ck`=lS0B6uol~NJ*xtZl9`T@;C z$~2^0rzOsc!7W~59N9E2^!WxiLa2Z~z4ZAg5c+=m^P=ZWrN1BbSwiH$i-uk{J=+${ IkJq_WDr2LF=RaBNYQ~{&mP_Q{*E3d1oDVCZg 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 delta 2433 zcmZ8ieQZ-z6u-arzSq~+uOXv_siV_&3^&S#3orz2aRTxoix5Lp?8-Kvux_}Ok0EA2 zh+stRdLi+HNI@kk#t?^56NCMOL}fE#Bt``dCTcLE;wOKI&U0^HS;I|k&+oi@&hPy0 zx%c(GxALi&|IS3Jv!SV}X=(kf^^BFBU(Oi&%RbnpPd5j5U3Wke7sodyANy})#7PUa zH09WQjX#%slb*Y2`e=@!c^yreBdyD_9>DE+?k8(Wc_P>7HcQn)sTI zbZag*kgZ;pZtqO4O6PK!jJT;j!X!Er%^g~l%e)z0o=kO^$MTa>iDZ9QB-IJF8{UiX zx%1ps#O1Ll<3$jEI?2@#10=$GTyd<$zZiwFo z_B4DS!}oKZ&o1J>M)?YXiV%&GXjUgMTY{CqgCzb|B|g#9ljxJZj3?ULdw@N(5>YFu z#QKi-rjE8WkfDd%0A82r>w$C9_X1b0q3JEs*h1OL@+IrQp2ZjqW5RjLvhb7=iF3QV zQ>Kz=qeC0uN!YeYyB9W9vKF?y^s}%VB2ifpwUh9YGg+o?0_!dvi9+jDG;KV$@ zPl2D2ehOUfoNs_uCT%Y?%99GTnbP(_TOjQ=Xe*@cho%(nghtyFJPqxok|Ui&ZRkz+ z(xLYAufa}WTomJ4^Zc74UN_pZVytSK_NP>J4jQQ$;3LqLnirriCSQXFoyrLQ3iJ=9 zJqrB`Y2Sc;LE0P~?h+Z*&D|5bI;u#91}E4M{Kw%xLylQ=z7`EZf3@R5#csgSu0Smu zvO5|gaL89iLjxRnkqS;*O0UVM2-G1kn`o+wP8;2E$7vNg2M#6aC=5=LG|Y$5qQF8J z87cBd7)tzE7=MaO!HKm|)&tKDc=i)z%)&>B(K%i*u7EQr^De`=K+LY1FmowOz~zK% zC&jl|I4k4NtN1l=QZoklr!dP)n&F%y2C4!g9|~8ihOAbnbnazi` z99lcYAF=Sm*}8yO7etm+Fs(7ig?o7~zFlt=mr zTL5hbv;o4WE&N)xZi<*&J+lxuUah0qP?6@(272S<0W;?#{a zFG?Pp4wJ4X9p^`IQCA5J!&NxfPvBZ%m1vfKx@w9`)z^n+vc=GsL0>~fnk?KIqmy#A zD$;tm){1X$uDJIeb`SK&p+8T7OD%j*1(JBGJ`b+rCA*+kCbg7ml#H@&EebJCl%wDa1WPgn%vTv=^?ZYhvRZyvrj8vBT}e47`ny8Ebkswco1HC7q5O(YYP8Ys-yNHwgScvF#aZv z;R1FVS35dZWNOD%d%sgOXX(Q$1=wGJuUUaZ@U<%N5`5dmQ0+v&{R+Du>~>65qcT z?#|X_T)w@MginEQpLo7*g6=ynC5aPtH$I>~-tf`JrN-i=l3#TAF44oxn~`MKhK=cX zx}!H8NpDHhRp5_+eTG01f!*Y6D?0lrr)+I5m(6PY0Lq33r%joPaz2!)j~#sbt_cSN iPj0 0 + | Danger -> 1 + | Powerup -> 2 + | Fatal -> 3 + | Blocked -> 4 ;; + +let danger_of_int = function + | 0 -> Safe + | 1 -> Danger + | 2 -> Powerup + | 3 -> Fatal + | _ -> Blocked ;; + (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) let print_game_data (gd : game_data) = - Printf.printf "-----------------------| Board data |-----------------------\n" ; + Printf.printf "--------------------------------| Board data |--------------------------------\n" ; Printf.printf "Time : %f\n" gd.dt ; Printf.printf "ID : %d\n" gd.player_id ; Printf.printf "Laby [of size %d %d]:\n" (Array.length gd.laby) (Array.length gd.laby.(0)); @@ -90,6 +106,20 @@ let print_game_data (gd : game_data) = Printf.printf " [Boost] (at %d %d) (of type %d)\n" gd.boosts.(b).x gd.boosts.(b).y gd.boosts.(b).spec ; done;; +let print_danger_levels (map : danger array array) = + Printf.printf "--------------------------------| Danger levels |--------------------------------\n" ; + for l = 0 to (Array.length map -1) do + for c = 0 to (Array.length map.(l) -1) do + match map.(l).(c) with + | Blocked -> Printf.printf "@ " + | Safe -> Printf.printf ". " + | Danger -> Printf.printf "! " + | Fatal -> Printf.printf "X " + | Powerup -> Printf.printf "P " + done; + Printf.printf "\n" + done ;; + (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) @@ -119,17 +149,7 @@ let int_n_of_string (str : string) (n : int) (nlast : int ref) = let parse_input (str : string) = let ptr = open_in str in - let (res : game_data) = { - dt = 0. ; - player_id = 0 ; - laby = [||] ; - nbombs = 0 ; - bombs = [||] ; - nplayers = 0 ; - players = [||] ; - nboosts = 0 ; - boosts = [||] ; - } in + let (res : game_data) = {dt = 0. ; player_id = 0 ; laby = [||] ; nbombs = 0 ; bombs = [||] ; nplayers = 0 ; players = [||] ; nboosts = 0 ; boosts = [||] ;} in try (* time *) if debug then Printf.printf "Time\n" ; @@ -159,11 +179,7 @@ let parse_input (str : string) = and last = ref 0 in let dat = int_n_of_string psd 3 last in let dtime = Float.of_string (String.init (String.length psd - !last) (fun i -> psd.[i + !last])) in - res.bombs.(b) <- { - x = dat.(0) ; - y = dat.(1) ; - size = dat.(2) ; - det_time = dtime ; + res.bombs.(b) <- {x = dat.(0) ; y = dat.(1) ; size = dat.(2) ; det_time = dtime ; } done; @@ -174,16 +190,7 @@ let parse_input (str : string) = res.players <- Array.make res.nplayers default_player ; for p = 0 to res.nplayers -1 do let dat = int_n_of_string (input_line ptr) 8 useless in - res.players.(p) <- { - id = dat.(2) ; - x = dat.(0) ; - y = dat.(1) ; - nspeed = dat.(3) ; - nbomb_atonce = dat.(4) ; - bomb_radius = dat.(5) ; - ndash = dat.(6) ; - ntraps = dat.(7) ; - } + res.players.(p) <- {id = dat.(2) ; x = dat.(0) ; y = dat.(1) ; nspeed = dat.(3) ; nbomb_atonce = dat.(4) ; bomb_radius = dat.(5) ; ndash = dat.(6) ; ntraps = dat.(7) ;} done; (* boosts *) @@ -193,11 +200,7 @@ let parse_input (str : string) = res.boosts <- Array.make res.nboosts default_boost ; for p = 0 to res.nboosts -1 do let dat = int_n_of_string (input_line ptr) 3 useless in - res.boosts.(p) <- { - x = dat.(0) ; - y = dat.(1) ; - spec = dat.(2) - } + res.boosts.(p) <- {x = dat.(0) ; y = dat.(1) ; spec = dat.(2)} done; if debug then Printf.printf "Done!\n" ; @@ -208,4 +211,46 @@ let parse_input (str : string) = close_in ptr ; failwith "cannot happen unless something is wrong" ;; -print_game_data (parse_input "input_test.txt") ;; \ No newline at end of file +let warn_level (b : bomb) (ct : float) = match (b.det_time -. ct) with + | k when k < 1.0 -> Fatal ; + | _ -> Danger ;; + +let danger_priority (p1 : danger) (p2 : danger) = + danger_of_int (max (int_of_danger p1) (int_of_danger p2)) ;; + +let evaluate_dangers (gd : game_data) = + let lines = Array.length gd.laby + and cols = Array.length gd.laby.(0) in + let res = Array.make_matrix lines cols Safe in + + (* add solid blocks *) + for l = 0 to lines -1 do + for c = 0 to cols -1 do + if gd.laby.(l).(c) = 1 || gd.laby.(l).(c) = 1 then + res.(l).(c) <- Blocked ; + done + done ; + + (* add bomb tiles *) + for b = 0 to gd.nbombs -1 do + let dgr = warn_level gd.bombs.(b) gd.dt in + for off = -gd.bombs.(b).size to gd.bombs.(b).size do + let ln = min (lines -1) (max 0 (gd.bombs.(b).x + off)) + and cl = min (cols -1) (max 0 (gd.bombs.(b).y + off)) in + if res.(ln).(gd.bombs.(b).y) = Safe then + res.(ln).(gd.bombs.(b).y) <- danger_priority (res.(ln).(gd.bombs.(b).y)) dgr ; + if res.(gd.bombs.(b).x).(cl) = Safe then + res.(gd.bombs.(b).x).(cl) <- danger_priority (res.(gd.bombs.(b).x).(cl)) dgr ; + done; + done; + + (* add powerups *) + for p = 0 to gd.nboosts -1 do + res.(gd.boosts.(p).x).(gd.boosts.(p).y) <- Powerup ; + done; + + res ;; + +let game_d = parse_input "input_test.txt" ;; +print_game_data game_d ;; +print_danger_levels (evaluate_dangers game_d) \ No newline at end of file