From 523a9c78f7c6f923e3c1e72f7e9d6027229d7075 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Thu, 14 Nov 2024 22:26:57 +0100 Subject: [PATCH] E --- again | Bin 228706 -> 227628 bytes again.cmi | Bin 8811 -> 9049 bytes again.cmo | Bin 28920 -> 27884 bytes again.ml | 198 ++++++++++++--------------- entrees.txt | 41 +++--- iachallenge2024_bomberman_tkinter.py | 4 +- 6 files changed, 108 insertions(+), 135 deletions(-) diff --git a/again b/again index 4aedcf8dc2d973e68cee13d2420e85bb4e096c95..4805f31d0e4482a939b4d70744c642baf94ad9a1 100755 GIT binary patch delta 3693 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 TNe^$^-QUpE)U>gFN&SBTC8B~0 delta 4100 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 HBl-UUVF$R| literal 8811 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 literal 28920 zcmeHv3wTxKmG)W5Ik|BQ5ClUACs&d{!T|yVLch+ zE4ATL%T%q0Y86{sEw$dpDs_BXXC54>(iz**Y8`CtFZQ>;RIR1uf8VwD3Y*=8gc;lU zpN`+-;#=SMt@~Qv+IuH?tf<-8G-2AbX^SG0B7wldhU!2daKqq0pb&ErKwP*K^Kcih zz}(M;D=>5LJOqdXR00YB@t$>m;1dDa0P;ow976%rL3;A~_1=m-jwHZj#R7pccP3vR zfObkG>c_VFl7gACF9ak2%xC&(u^7<9Icbss z%K={nj0U6v=nv(Re~7#0%stKnJ#!{-$_N7(W70GM=;L(&`b)bwMgpQlFjfGlhrE=@ znX*Wm4Im%wrc9((op8{V}EN zRRE4D&eWx=5o>Qe7?-F^Lz$+VcIN=7?@EBx4rjC58&AgOMgZw&0nBfc$K3G#@Z4fR z{@&!B!styNeL9d&9fHI5L0q zhxz5*=Dla0Slc{L0x<8?&mP44YAbaPxnvBjFH(13cvu(4 zbG?Tr3Y>%bD9h_BYk>K;JG2pa9e{L%D1d{!^xb&r59^UJARS}C*?i|rp7Q{i0LD1% z&dV?}7OZdbF_!*&L0;Z_iwAWZPG07~8xzL8(nI5=WlrM({vK6}J=PZW)Ar8*mI4X^ ztP8JC=0EkAY}(J>Xlv@{c{70Z;60=5!Ih(w5>7kE77JKM^ zz~5^RZGmsBO~yM4;IQ~vJ+rs)-m;#pht>dR-80^VD1d{!|CJs}U10$4`7!|SHlI;u zBjvNlu-90<*qn(y@?`k+IkZ|~`?=kQMSRUUg! zZ}J*@k@w%-6A!~a_QdA^f3H39v+&LOO%ymsUwR_nNB>qmaSe2tjpx!6`EJhlS=M+E z!1odI^Bv4)_EGybB@KHi>HYfHm#+YD*la!fe|qno_A&R~cqh#I?#Ntt-%I(t^}m<$ z{dzgz%K*MdvriE=0C>ipW#0nZf%7i2c3A_I&zW-l@2Fg}Cj2tiW6%15)c|MOodK}= zr~ppgtpMuaHx$1mSchJ^O022h=txUC>b3e!0?zknp7EW4IA_)`Z4A3J>vs}>!+JI8 zyfHKTwqZXG!1}EN@LmvS&*M7~M_**{u6SkeK2Zksa+nO-PG3#G&G!Dn-1)!h?3;)> z7!P|U&{o>cefy5O6Lm-##zUNR@qoVYU+3coTbC^R&Z2L9`Oad#ICcRF0sPLQ4IGTY zxzzR7K~G;;(}eEodN20>t95;iD}(QqR@ciRZcU9*;+cZjsCLDI5D*&D_JINpZ6We%#fGzK{BGg&-hKlJmx)eRr*=}tFm zmAdJ()hPQ|5`e#xqHVVCr7;^!CgsyV(i3=BjL&A;$vZ)ykEB29v2_I2^pUzvE^XuB zonfz`T+RgEjinbB~=o%LjP*h_44^0_dmZ z4XE0|-eS<5%~ME-VSMaChBGcX0LIPscy9ht-XZ|?(s!?X+uwkF))wPo?+|Uk*=uV7 z>{lrOKMl_bR-e}cxB89;PM!Ai1@=1bdFzC>P-iQ^bg=hXj;uDAU+=pEc}Pcl`0ha4 zlH4`rFb9kQpUuo|7{DB`c5?uvC6JDCqW})$wK$T8^c>X5bI!EeY_pkXv?mJSFxlLv z4lj?@*SYk!`%z=HkaI3Poj#s;@D~7RXCa^nz}%g!HqBq!Z+ZOI{n9r7`F~gKvR40Ewac7X47;mci>Kwr z=CjqVKd*nQ+TH1^T|QI0t6kPFYln5n*?h9Pv-K*RaZm<(HV5gghFCjZe(tkorUQ6p za!f8`&7KzWoEbgOjNbMbd)u1@ocZBs0PtSj2!P9{{B=48`&P$ZxwMIE-UrJ`t-EJ> zjHap&G`!0uhcTrcw263k-yuKq?0IX!fBuMj&N#5oECXB$ARS{!xo3Mu-+}XZz}cSB zl-&$q?Rn`e#;w@57?O^y5s!j@T!NbDw!3Za){9?%}83ec}1dpU-@!qE6LGbJV-H~*{QZD^ z!FmSobS1#w5BxNw9$Xw`Uh%%|6JV^-w(rxlbC(=O}Zg zz{Qxe0PNX(e{Sd_ZvAYQOOHuq@b?}+hm!L!v&XX6O$Kn7&M_XG``G~6Zs$vY(EZpSyf^`0b_+<~#@BjVo)%@@+Hg;35F?$=G{o zdaB1<(6Jt=gV3FR+Sdr6kEV;Vy|!7MGDmX(R)ef7q_9uVV#7 z1hB4&R{_i)u0I6`0vJC#?g8p>w{yl&u2w0{AXNw=lJer zHQNH*{9-Iw<90^btR2cWUzjWM+nTm`a~H*$quiO)S3bum<3a#q;LRV`)XVx~JcxJq zF81`_Ab-pe@An7*b3}W&HeW4|tOd)X(e#u{-Wlf7?qU;g-UY^l@wM1nFY)G(w5%`Y z(rn-!^)r{=J=*Eb6X_URZ>~0A?adW)NuNv(bICqo>nLyz)_`|^7S^cPrd2>vfo^m_^XWkq$&K8ri<(F~w=9c;J=9T&I z<}`{mM^yj)%h=QA|4i(E^fAVsamWHNzSf^F2VMY(2UtAlH(@h?&tLkdFF*PI7a#%{1>m>^Fb%+Z%@&6C&kQ#X5v!8qXbn|$}Wb;CL(Pd0#OjG^U+_Rwd` zD^RTu*1C6(abta$EtJD?D}eka?-t;U8RO1Dy-k4bVr04O$#?3bzm$~>7z^Nd9e$Z@ ztl=>L`fGAXZ|7m)S)Mg>&Nxf~a2TEK+xh~Wk&m(CSp|STTn3;n0`COtc{IRubI)V| zRbADXGXTBO(3jq5XhUx_%nfC+UhF-deq0aWy`l`;w>U6QUb}O!=CHksfad|26Vv~3 z#Q9>#vp9R@Ephj)SJ37i0P1J2s0A=D^8prLpl9TVHN$(sSorBvu~!H1%Ao#rzCG%y z_w9M(yBueXCF{Xr)t&9UXDHiKtOMH2`(pIgOKB%%TR&$0jE1%mHUpSL>y36!8O#su z;MfJQJQ)q|iQ%N-Jz!iYcM-sBWZYN}p8+fdL;;jfTJAHZ)_=~%M_hAsXS8lJfy6=ncl+~Nu=Uln$Rq+6eR|W91`Cf%{iy7}8{U?w4 zeKy`Km)9FNFR#h4n1NjH(8m?aU;dS1Y2OGI%f94@zR~x-_(s~wKGL#hvyN&3%*|YY z#g)0SJ>tFT4ugjGjP z+?$>p(AEN2%d|BF=qZM)ab_{( zbI%(?+G;VR9Im}_^q*6YKbC$P%J;|8OH+k&%LQk?H<)g-h558xa5g`^a+ouM$>7X; z=$Azr=Fa4B<~yLDuCMu}y?x2Az1!RK4s5D35%am`mpnb?H-a!dmx0o^x z-rRc6=sVB-x%JcZHAbwHzQpKd-?JNR`tC#@Y5@fR%Bl0BU>#XJE(Ol_HAS!GQwC)lEx$GBD}k})cW4fv7~tm}gFUkm zsD9_t#{b{xEQYj|qXDo5!1(bQ%$Ruh*gqK`#@fDT7*F!^esYg_<(|nVy+1#^qolWd zaZO-9vqAmdJ-=MaBvb%s4`+KnXD{JdC4gs~c}5wurxsxM)Molgo5}$kT>F7{hgX`IfIk#zitKi~SmN$1=vZwllkK`!&d9?$zo z`OM`E&|BZ<%pBR-&;EF(u0y`{J-+p=ShL?SpOnQr&zaw;ocV6Yd9*ucW2P?FLdG8) zJ7^ne&I6boE~-Z``9>Il!-izl2j-UZS#zE5G#o4;+o^%XA9FwoMD z40q1NOc}hZZSOg9X`|mSqxsJNbz(u?q~ZHI=X7_@a_3ykXgN+C%LTiJCT3ph54s^irBmjY-D2hW)s zo^yEV`(a(_?lBfdV>YoCNYB}NlIgW)gWxO&!1|#K>Lo4t@?G5GLEEX%FT?+=34?~Q z=Uq6PeO7yvOMQ$dXN#fb&FFYWu)Lq=u34Ylx0rkDi~C{s+~Q$5p?^FtaA(Gz>v8T} z;?5Cwp6Je{?#wulp0VUS-JNH+GkYTUqwYM%oh>F+?s}d(FL39D?tHO3FLvi8?p*E8 zm%8&Z%+ys3;NUwT@o8LOZ2RK<&)_$Tc#QUgiQ%=#_EN;WAdpwSzNWExu`FB`i|sC| z#s7|Mb^TSFYMMG?vChr|(`wr4!<$<+h1)j)sae~ysUzIcP}32f{m8+B8giCwY?8oJ zGW;qT{)L0VIK%fxqY{Y4Vmo)`U(!+6)VNjx`=MZxDyV5|tJ%DIeSOF3n!36+kpi3q zgCg@dCrVs@&M6X?1{?N8WBV?Obsi|{XxrS_yuPHQB;}EV!LY>LD9dwX`Rs$iEW;O; zM`3dm|9Gi`DKI520#kzd5?4l(N*t3`uU_2N*xa#B;wtIv?wrXblO=8?l$SVW*43?E z*VIzeA#ts=Xp+Qra-Jgb5VJctO@cEhZoG+`SJU3mv9?Kq)!Z(&?N4v2-&8Nb2J%!% za0liIsz8OWZdtb)R!DHKV??9`auK=R5v6Huxu(9&H6w@+?hKBU;9-gyE5Q?7XGkc_ z^#lpQkDbA638}eLCA5d@0tp@D`Ai8Nqsc1veJK3l5gU=Ly{4uoxwIqeu(ssNiuZ>TO}FtnL~yz z8GcfBGW^&X{H&y;as3aH0)KY~KPM@w^Bzgr&UL4xJj(O0Ny@8S-y!{iTz^CQ6>xo* z^sDB4kM!HZ{r`}DCprI0`YYXUq<@6#!kxi?k^#?i{(%gn!68YJfqS^|BN+&9cLraQfsAlShRVQW6!D@A zeD}2513%>6AsK{_?Sy%QVE*pl`!Z-D*T0rQs`jJ|x{K>~WY7yLEKUY#oZgev5xS8i zsWV9N2T5(SSnG<>brIs3L_j)G=eDq&eDKC9Ok=+a>K$ zMXr{#ql#>nVXz01x5%(+MQ)T~4*ShAY_IOzBEya-vR#HbT(`-2@9NI>dR`DZ?F8 z_sDR^oiE97hwIBS0)d8#yJbY3A~6}!q{zK8V!tBy%ZNu5c~C|iSL7iXaRTm~?hfT_ zhLT=}&0t8q2sLOENpD=kdYaB zct}RBROBTY>Dc+QjNFbLZ!>PUW;_x>LiX;Kke zQR-$~f{c0#JHb*J1t!oQmQ2k>+#tz3q_jgM^T-*dWF94DTv#%X0SR6vnaUcMFQb!` zBUeU86d5CRz)UB_*zA#NSHYY)=8L5PTyQuF zawkL(jjU?2$di)As5^}w{he*zd6;Br65>83Sv$I9ZLHZ)zxwL>+78KrB0lu+ATx+c z7PSTkOV&ZoX_5ttcL#?{mIf$Yvd3|~SF&+acH`lgy_oY?B%7-6*vszVe4k`*XH;I4 z?ANgl;SrkS1mkAOQLE!_ksQb4?UJ)sX>OC8n0l87@8Dj}e%-E@9ApWhzDshRr_fg< z=dhmKEjcIjdEv$S( z@;VjyN6C9ak!K|Dpd#Owykm+yFL}om`Jv>e0YTHv&(Mt*B|oajVacDT$Sab+O_6_- zd}bgN_Y=u~frunZzT?DeGUjzXdP53=io7WWFxlP`3d(fzSt(ek$nT`!RYgunVL*`& zq_9bmkEF0ekv~b{T}0voQh1*t@ltq5kpw9`qDZn7o>Zj26sg|$K~e<0;2I)D8mjnV zQlz0m7cN?(MMW#vdJVolIcqQy8J@akJF-VG= zJc@G{&#zRy*NMbS))kWVIq1FK7CTStRZ2(gc2#nd6n83exfCNo@b6YBe#9d??^89` zIZk~^P$F4BmFxrv-)oD3r-eJDj&u|dWZf;rZz*z(6rWJ!UMX?nzE4V`8t!T-fxk$} z15#3_G!IM39^Lt-lsu|5Ka-N9UYq8$v}{y|e;_hgaxx`n0c`rAEtYs}Qc|^P{5X|< zNXC~ca=(m+1+emE8DFhxZj$jRCG5N^;}2nHvW6ZX1#T5I)i0J8wy(l}Oxq5<#fD%BEm(Q_bf3wsty%?*JJsd1aDU zheez%T24FEMXf$Xj?-RzHbhRS;lGp#0o@rO6Vj+m{!u0@)SaO+VLx}!NhcguBuyq9 zQ)IYI_)w8_nb=>EQ8F<@k+4jpU!h=*OjO6vP$yP%C$3s1Zt=J=29a*>aJ-l;QYd56 zWlR;kh}vTDX)laeotSt?4V)_zk0>%)Ccdu7MKbXORmmS@Qbcz?Et9sZIg4b{Ly9bs zNlz=XR3$5bt%_0+}V5<~746|Bn@x*DfTw1lN6jh1Pc1Y=B zMJ|@om5N*^rLBs5MoRZ8a+8!k0gasplE>86G&i?&gd1vFTkD&{o0^;I+uOtKEgS1Q z8qi0=jqTxU+FF{|Gu59LDU-rPDIAW)?Y5YO54O@5RO}8ZJq(Y6k4ouDdM4E}8AbuQ zOeQ;F*e#O}s?*<>$;Z`%$y8s{9L7_(etmsgxS)A_bD?^_Ujip&^jBo`0qA?s7B4{G zlvLICfJ_;o!j{UED0WW2QB^e5w8@lC?BP*2LCR|~6*<%5SQzWv*=h|rD?&N%OWCMy1vR=wwP~=J}dsTV6avHkE=+nS_tu4+c^IOVu zwUoW9$Yz;_n8LX&GK~d1QQNlr+UY(orxhs0R+)AL6lj>!(E7mgS(zSGWQR<5NWLJ` z=eZH$k6w}&7xyx@gfB!LhMVfIu5W4&Z|Q})m=`4!lfbtm?L!%sip4%#)Sm7{AHP~{ zYSZh~+52UBlOi|C^lN$LLl4OGgNl4zrhll&H{}AW)H6$DA1}@tExafKl#^E%rb|a8 z@NF6PvSt6_YeI(1SgGpYml?3bbD7+?JM|-BiUhtcY4=FllMpo37T;4r52>KZGUHK2 z2FVOWzw42eyr{P#+7h1AQqxu!uB+*&>08Mq%$LCDW#D2N*Z^}D*y1Tq$$i{fwc=*# z^-5SIGxZ6OP$)BTN4s1d!*}NJbXHJ8tpskDf!~vXKgOcY7H`19ee+`bqSm9jkeF7Y zQ$5ZPK3!pX>r#TFk*}E%jqVLHvrLg?GSfeSLm*e^5nswLbkGh11Z2@lH5Js!tP7S^oY9A43~F5KRDUA_8` zr)Q@O3d^7}*np>}v-ormHmvyz%ji?is_7}gTn$l_16xzh)P(DrS4XO`wALxaU&&0T z5D&^sZz1L)K5E)W64)h!9+pA>4AcH-i2z zqyb1!W_2i%D6_V>A?YT_Yy2%Hu|xuUBsES_GY^Im$J-)@H)_^4W;n4}X6;Y}qW8L@ z|FXp-UMPV(BsD6jc&a7Nv&9uE=&15n$*g0Fgk=_bQmJK#40Xug*Ce2}fqnP_`Fy0lG%$jSZy-< zK1DXkY~%=WyjEtvuE_Ng4SH-G&#bMW>{a0c{JMg+?v%inCG~rf`tMkv*mW_ur~2-` zw#F8Q3#?vQW8HZ<0W@oyTCU;C?xxl-vocN#HISyj}+1h{&9<#jd_*G14W@ zo5$!Ds!mFg=r*v z(9%@L9BX#Fy}W+T?&Y1!u2sveXI6_-GurBsOTFPho74KY(lMKLjV9>)hno33YNq^z z=IdE0KdHz+$Q)#+E6xSZ*R7UJ(kl{($&eq(5WHq5;l0OM{IQ1^cXRQ_n>265%vq_5 z|F_JkQ{;J>)2g|DTjso=$ZuuNF-3kS6<*^a?p?w6ch`+iPL#k`Whj1cP;oGnoMekD zyD_r+99X7t<2yFD)`xq#@w~sd;(QLAzPomY|(BHeX%S)L0j;Yiz@hj~iQ> zaRZW<1+I~Pw@Sagz?ZxDx1p&rsNyb@%Ko0j=3l&MN%cHlo#cialLhp9*QjbuF(h=IJvc4*nXe1E2MJn&} z3cYNuS^8LDlk}U6-}gc2<1W6^Bh;aEgg&9No|Z~9B?!GkDi3*uUQ#`O;X;k+;lS0> z?+WSn83_H6i{IiA>QFjDUsqZGCY5g~@`zO8PTH@d?YHJK_gZY?7v^)f`wsD29GMFz z_3$Cb9HdUuCsjzk`!m}rq~HDh^18PA_J-9hEvp;rq^gM&2gd841e7eP@7UDVJioaE zg^`jJxLgt+!+*e&UHmXAs;Yz921pf50c*s|irQ}?Z(3l5Bp$(kz=yf`yW~Y)m|Dle zz$xs+ygTLC*l!zwQ>4QVE`q~U?rtCv&^)%jxudPVzP+U5S~YmC#C6KbY*{%ATB~d^ z9}?!j>qzKRccxD5t9g2T=}xo6eOXpj%Bm$;wAf-f-<%dSFl{N7vY^$~!4^`mqE&yq z$!bWsLE`R|Rn4+$8x}X(;(pYF-yZGttHS5@U@Fpf-@z}6|J+;0Y%`XR4(9>E7bun3 z^>(oUwFN&9$%01}xnCCG7VO#;!Zlx59gW4h{`O&MEq-p+8EKjJ?xydy@0tGO#Ft(; zx#CZ&VzI8j!EkF$Rgp~(>mXh`O*EhWUr0_OK*Q< z*`04cxpn)$-X4pc@hj8L$o)%?=R9-lCv8W6I{4;$^B2Asi~0Y$qcig1zM9Xa{ON=5 zrr&UK*(=}tT0f5^Rs3_2&Pe40uYS~0UcUKT^5fe+zwOr>JeJID>}aS*L~_6O%CHCG zZd?70e|hlz@BHEqGdz~?M~$74nm5P%`l)N5-Lv?)J(pHoll@bVj5(Xut)q-@wd{Io z!-4mczLB=))d80tz0zZd{#Lm&vMh7y+xr$g^!O_e4%nakgJ;WPG561LIwQqN`Rks! z@wumVHn&Zh*0J-oSgfo9fBnNBnzl99G*z{ z@0CaEUix7y7V1~r85z`Z_<oI(5=p*v~0SFNqjsO4v diff --git a/again.ml b/again.ml index 7a17582..1cc1835 100644 --- a/again.ml +++ b/again.ml @@ -8,6 +8,7 @@ TODO : (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) let debug_all = false ;; +let logg = true ;; (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) @@ -80,8 +81,8 @@ type game_data = { type danger_map = { explosionTimes : (float list) array array ; + playersTimes : (float list) array array ; bonusMap : bool array array ; - playersMap : (int * int * int) array ; explodedCrates : bool array array ; } @@ -165,7 +166,7 @@ let print_game_data (gd : game_data) = let print_dangers (dgs : danger_map) = for w = 0 to Array.length dgs.explosionTimes -1 do for h = 0 to Array.length dgs.explosionTimes.(0) -1 do - Printf.fprintf stderr "%d " (List.length dgs.explosionTimes.(w).(h)) ; + Printf.fprintf stderr "%d " ((List.length dgs.explosionTimes.(w).(h)) + (List.length dgs.playersTimes.(w).(h))) ; done ; Printf.fprintf stderr "\n" ; done ;; @@ -316,12 +317,13 @@ let build_danger_map (gd : game_data) = and cols = Array.length gd.laby.(0) in let (res : danger_map) = { explosionTimes = Array.make lines [||] ; + playersTimes = Array.make lines [||] ; bonusMap = Array.make lines [||] ; - playersMap = Array.make (gd.nplayers) (0, 0, 0) ; explodedCrates = Array.make lines [||] ; } in for l = 0 to lines -1 do res.explosionTimes.(l) <- Array.make cols [] ; + res.playersTimes.(l) <- Array.make cols [] ; res.explodedCrates.(l) <- Array.make cols false ; res.bonusMap.(l) <- Array.make cols false ; done; @@ -332,6 +334,9 @@ let build_danger_map (gd : game_data) = ) gd.bombs ; + (*if gd.nbombs > 0 then + Printf.fprintf stderr "%f %f\n" (gd.bombs.(0).det_time) (gd.bombs.(Array.length gd.bombs -1).det_time) ;*) + (* add bombs *) let halt = ref false in for b = 0 to gd.nbombs -1 do @@ -366,8 +371,7 @@ let build_danger_map (gd : game_data) = let bx = gd.players.(p).xy.x and by = gd.players.(p).xy.y in let bsize = gd.players.(p).bomb_radius - (*and dtime = min (gd.dt +. 5.5) (List.fold_left min (gd.dt +. 1000.) res.explosionTimes.(bx).(by)) in*) - and dtime = (gd.dt +. 5.5) in + and dtime = min (gd.dt +. 5.5) (min (List.fold_left min (gd.dt +. 1000.) res.explosionTimes.(bx).(by)) (List.fold_left min (gd.dt +. 1000.) res.playersTimes.(bx).(by))) in for dir = 0 to 3 do for w = 0 to bsize do if (not !halt) && (w > 0 || dir = 0) then begin @@ -375,7 +379,7 @@ let build_danger_map (gd : game_data) = and ny = by + w * (snd order.(dir)) in if is_valid nx ny lines cols then begin if (gd.laby.(nx).(ny) = 0 || gd.laby.(nx).(ny) >= 3) || (gd.laby.(nx).(ny) = 2 && res.explodedCrates.(nx).(ny)) then - res.explosionTimes.(nx).(ny) <- (dtime)::(res.explosionTimes.(nx).(ny)) + res.playersTimes.(nx).(ny) <- (dtime)::(res.playersTimes.(nx).(ny)) else if gd.laby.(nx).(ny) = 1 then halt := true else if gd.laby.(nx).(ny) = 2 then begin @@ -387,7 +391,6 @@ let build_danger_map (gd : game_data) = done; halt := false ; done - (*res.playersMap.(p) <- (gd.players.(p).xy.x, gd.players.(p).xy.y, gd.players.(p).bomb_radius) ;*) end done; @@ -449,12 +452,32 @@ let reverse_simulate_bomb (dgs : danger_map) (save : (int * int, float) Hashtbl. save ;; let is_dead (dgs : danger_map) (x : int) (y : int) (t : float) (dt : float) = - List.fold_left + (List.fold_left + (fun acc curtime -> + acc || (t >= curtime && t <= curtime +. dt) + ) + false + dgs.explosionTimes.(x).(y) + ) || (List.fold_left + (fun acc curtime -> + acc || (t >= curtime && t <= curtime +. dt) + ) + false + dgs.playersTimes.(x).(y) + ) ;; + +let is_dead_2 (dgs : danger_map) (x : int) (y : int) (t : float) (dt : float) = + (List.fold_left (fun acc curtime -> acc || (t > curtime && t < curtime +. dt) ) false - dgs.explosionTimes.(x).(y) ;; + dgs.explosionTimes.(x).(y) + ) ;; + +let is_dead_all (dgs : danger_map) (x : int) (y : int) (t : float) (dt : float) = function + | true -> is_dead_2 dgs x y t dt + | false -> is_dead dgs x y t dt ;; (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) @@ -519,7 +542,7 @@ let sees_a_crate (gd : game_data) (dgs : danger_map) (x : int) (y : int) = with | ReturnBool b -> b ;; -let bfs_for_crate (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (stime : float) = +let bfs_for_crate (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (stime : float) (searchCrate : bool) (searchBonus : bool) (minDist : int) (ignorePlayers : bool) (maxDist : int) = let lines = Array.length gd.laby and cols = Array.length gd.laby.(0) in @@ -527,99 +550,34 @@ let bfs_for_crate (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (sti let q = Queue.create () in let interval = Float.pow (0.9) (float_of_int gd.players.(gd.player_id).nspeed) in - Hashtbl.add visited (x0, y0) 1 ; + Queue.add (x0, y0, stime +. interval, 4, 1) q ; - Queue.add (x0+1, y0, stime +. interval, 2) q ; - Queue.add (x0-1, y0, stime +. interval, 0) q ; - Queue.add (x0, y0+1, stime +. interval, 1) q ; - Queue.add (x0, y0-1, stime +. interval, 3) q ; + Queue.add (x0+1, y0, stime +. interval, 2, 1) q ; + Queue.add (x0-1, y0, stime +. interval, 0, 1) q ; + Queue.add (x0, y0+1, stime +. interval, 1, 1) q ; + Queue.add (x0, y0-1, stime +. interval, 3, 1) q ; try while not (Queue.is_empty q) do - let (x, y, ct, direction) = Queue.pop q in - if is_valid x y lines cols && gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2 then begin (* within the map *) - if Hashtbl.find_opt visited (x, y) = None then begin (* has not been visited yet *) - Hashtbl.add visited (x, y) 1 ; - if not (is_dead dgs x y ct interval) then begin (* is not lethal *) - if (is_empty_lst dgs.explosionTimes.(x).(y)) && (sees_a_crate gd dgs x y && not dgs.explodedCrates.(x).(y)) then begin (* is a safe and valid tile *) + let (x, y, ct, direction, polar) = Queue.pop q in + if is_valid x y lines cols && gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2 then begin (* within the map *) + if Hashtbl.find_opt visited (x, y, polar) = None then begin (* has not been visited yet *) + Hashtbl.add visited (x, y, polar) 1 ; + if not (is_dead_all dgs x y ct interval ignorePlayers) && ct < stime +. (float_of_int maxDist) *. interval then begin (* is not lethal *) + if + (ct >= stime +. (float_of_int minDist) *. interval) && + (is_empty_lst dgs.explosionTimes.(x).(y)) && (* safe *) + (not searchCrate || (sees_a_crate gd dgs x y && not dgs.explodedCrates.(x).(y))) && (* sees a crate *) + (not searchBonus || dgs.bonusMap.(x).(y)) (* is a bonus *) + then begin raise (ReturnInt direction) end; - (*Printf.fprintf stderr "+4 (%b %b)\n" (is_empty_lst dgs.explosionTimes.(x).(y)) (sees_a_crate gd dgs x y) ;*) - for dir = 0 to 3 do - Queue.add (x + (fst order.(dir)), y + (snd order.(dir)), ct +. interval, direction) q ; - done - end - end - end - done; - 4 ; - with - | ReturnInt k -> k ;; - -let bfs_gtfo (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (stime : float) = - let lines = Array.length gd.laby - and cols = Array.length gd.laby.(0) in - - let visited = Hashtbl.create 100 in - let q = Queue.create () in - let interval = Float.pow (0.9) (float_of_int gd.players.(gd.player_id).nspeed) in - - Hashtbl.add visited (x0, y0) 1 ; - - Queue.add (x0+1, y0, stime +. interval, 2) q ; - Queue.add (x0-1, y0, stime +. interval, 0) q ; - Queue.add (x0, y0+1, stime +. interval, 1) q ; - Queue.add (x0, y0-1, stime +. interval, 3) q ; - - try - while not (Queue.is_empty q) do - let (x, y, ct, direction) = Queue.pop q in - if is_valid x y lines cols && gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2 then begin (* within the map *) - if Hashtbl.find_opt visited (x, y) = None then begin (* has not been visited yet *) - Hashtbl.add visited (x, y) 1 ; - if not (is_dead dgs x y ct interval) then begin (* is not lethal *) - if (is_empty_lst dgs.explosionTimes.(x).(y)) then begin (* is a safe and valid tile *) - raise (ReturnInt direction) - end; - for dir = 0 to 3 do - Queue.add (x + (fst order.(dir)), y + (snd order.(dir)), ct +. interval, direction) q ; - done - end - end - end - done; - 4 ; - with - | ReturnInt k -> k ;; - -let bfs_bonus (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (stime : float) = - let lines = Array.length gd.laby - and cols = Array.length gd.laby.(0) in - - let visited = Hashtbl.create 100 in - let q = Queue.create () in - let interval = Float.pow (0.9) (float_of_int gd.players.(gd.player_id).nspeed) in - - Hashtbl.add visited (x0, y0) 1 ; - - Queue.add (x0+1, y0, stime +. interval, 2) q ; - Queue.add (x0-1, y0, stime +. interval, 0) q ; - Queue.add (x0, y0+1, stime +. interval, 1) q ; - Queue.add (x0, y0-1, stime +. interval, 3) q ; - - try - while not (Queue.is_empty q) do - let (x, y, ct, direction) = Queue.pop q in - if is_valid x y lines cols && gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2 then begin (* within the map *) - if Hashtbl.find_opt visited (x, y) = None then begin (* has not been visited yet *) - Hashtbl.add visited (x, y) 1 ; - if not (is_dead dgs x y ct interval) && ct < stime +. 7. *. interval then begin (* is not lethal *) - if dgs.bonusMap.(x).(y) then begin (* is a safe and valid tile *) - raise (ReturnInt direction) - end; - for dir = 0 to 3 do - Queue.add (x + (fst order.(dir)), y + (snd order.(dir)), ct +. interval, direction) q ; - done + (*Queue.add (x, y, ct +. interval, direction, polar+1) q ;*) + if not (x0 == x && y0 == y) then begin + for dir = 0 to 3 do + Queue.add (x + (fst order.(dir)), y + (snd order.(dir)), ct +. interval, direction, polar) q ; + done; + end end end end @@ -633,20 +591,35 @@ let move_crate (gd : game_data) (dgs : danger_map) = let cxi = gd.players.(pid).xy.x and cyi = gd.players.(pid).xy.y in try - let bonusres = bfs_bonus gd dgs cxi cyi gd.dt in - if bonusres <> 4 then raise (ReturnInt bonusres) ; - if (is_a_crate_nearby gd dgs) && (is_empty_lst dgs.explosionTimes.(cxi).(cyi)) then begin - Printf.fprintf stderr "trying...\n" ; - let saved = simulate_bomb_deconstruct dgs cxi cyi gd.players.(pid).bomb_radius (gd.dt +. 5.5) in - let result = bfs_gtfo gd dgs cxi cyi gd.dt in - if result <> 4 && gd.players.(pid).nbomb_atonce > 0 then begin - action := 1 ; - raise (ReturnInt result) ; - end - else - raise (ReturnInt 4) + let bonusres = bfs_for_crate gd dgs cxi cyi gd.dt false true 0 false 7 in + if bonusres <> 4 then begin + if logg then Printf.fprintf stderr "bonus spotted\n" ; + raise (ReturnInt bonusres) ; end; - bfs_for_crate gd dgs cxi cyi gd.dt + if (is_a_crate_nearby gd dgs) && (is_empty_lst dgs.explosionTimes.(cxi).(cyi)) then begin + if gd.players.(pid).nbomb_atonce > 0 then begin + if logg then Printf.fprintf stderr "trying...\n" ; + let saved = simulate_bomb_deconstruct dgs cxi cyi gd.players.(pid).bomb_radius (gd.dt +. 5.5) in + let result = bfs_for_crate gd dgs cxi cyi gd.dt false false 1 false 80 in + if result <> 4 then begin + action := 1 ; + raise (ReturnInt result) ; + end; + reverse_simulate_bomb dgs saved ; + end + else begin + raise (ReturnInt 4) + end; + end; + if logg then Printf.fprintf stderr "searching...\n" ; + let rescr = bfs_for_crate gd dgs cxi cyi gd.dt true false 0 false 80 in + if rescr <> 4 then + rescr + else begin + if logg then Printf.fprintf stderr "searching 2...\n" ; + let rescr2 = bfs_for_crate gd dgs cxi cyi gd.dt false false 0 false 80 in + rescr2 + end with | ReturnInt k -> k ;; @@ -657,6 +630,9 @@ let game_map = parse_input "entrees.txt" ;; if debug_all then print_game_data game_map ;; let danger_data = build_danger_map game_map ;; +(*Printf.fprintf stderr "\n" ;; +print_dangers danger_data ;;*) + get_meta_info game_map.player_id ;; (*Printf.fprintf stderr "\n" ;; print_dangers danger_data ;;*) @@ -664,7 +640,7 @@ print_dangers danger_data ;;*) let direction = move_crate game_map danger_data ;; Printf.printf "%d %d" direction !action ; -Printf.fprintf stderr "[player %d] %d %d (at time %f)\n" game_map.player_id direction !action game_map.dt; +if true || logg then Printf.fprintf stderr "[player %d] %d %d (at time %f)\n" game_map.player_id direction !action game_map.dt; set_meta_info game_map.player_id ;; diff --git a/entrees.txt b/entrees.txt index 65ba8d9..c46c416 100644 --- a/entrees.txt +++ b/entrees.txt @@ -1,27 +1,24 @@ -135.09900000000007 +85.0 3 13 21 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 3 3 3 3 0 2 2 2 2 2 2 2 0 5 5 5 5 5 5 1 -1 3 1 3 1 0 1 2 1 0 1 2 1 2 1 5 1 5 1 5 1 -1 3 3 3 3 3 3 0 2 0 2 2 0 0 5 5 5 5 5 5 1 -1 3 1 3 1 0 1 2 1 2 1 2 1 0 1 5 1 5 1 5 1 -1 0 0 3 0 0 2 2 2 2 2 2 0 4 4 5 5 5 5 5 1 -1 0 1 3 1 3 1 6 1 0 1 2 1 4 1 4 1 5 1 0 1 -1 3 6 3 3 3 3 6 2 6 2 0 0 4 4 4 4 5 4 4 1 -1 6 1 3 1 3 1 6 1 6 1 2 1 5 1 4 1 4 1 4 1 -1 6 6 6 6 6 3 6 3 3 0 2 0 5 5 5 4 4 4 4 1 -1 6 1 6 1 0 1 6 1 6 1 2 1 5 1 5 1 4 1 4 1 -1 6 6 6 6 6 6 6 6 6 6 0 2 5 5 5 5 5 4 4 1 +1 3 3 3 6 6 6 0 2 2 2 2 0 5 5 5 5 5 5 5 1 +1 3 1 3 1 6 1 2 1 0 1 2 1 2 1 5 1 5 1 5 1 +1 3 3 3 6 6 0 2 2 2 2 2 0 2 0 5 5 5 5 4 1 +1 3 1 3 1 0 1 2 1 2 1 2 1 2 1 0 1 5 1 4 1 +1 3 3 3 3 0 2 2 2 2 0 0 2 2 2 0 5 5 5 4 1 +1 3 1 3 1 2 1 2 1 2 1 2 1 2 1 2 1 5 1 4 1 +1 6 3 3 0 2 2 0 0 2 2 2 2 2 2 0 5 5 5 5 1 +1 6 1 0 1 2 1 2 1 2 1 0 1 0 1 2 1 5 1 4 1 +1 6 6 0 0 2 0 2 2 2 2 0 2 2 2 0 4 5 4 4 1 +1 6 1 0 1 2 1 2 1 2 1 2 1 0 1 2 1 4 1 4 1 +1 6 6 6 0 2 2 2 2 2 2 2 2 2 0 4 4 4 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -4 -9 5 5 137.68300000000002 -5 12 2 138.5 -3 12 1 139.70000000000022 -4 13 2 140.5 -3 -3 13 1 1 2 1 2 2 -3 13 2 0 4 2 0 2 -7 3 3 3 3 5 0 2 1 -11 11 0 +5 16 2 87.5 +3 +7 4 0 0 5 1 2 1 +9 17 1 0 3 2 1 0 +4 5 3 0 3 1 2 2 +1 +3 6 4 diff --git a/iachallenge2024_bomberman_tkinter.py b/iachallenge2024_bomberman_tkinter.py index 851deb8..6f36173 100644 --- a/iachallenge2024_bomberman_tkinter.py +++ b/iachallenge2024_bomberman_tkinter.py @@ -318,7 +318,7 @@ def decision(programme, indiceJoueur, plateau, plateauCouleur, bombes, joueurs, print(len(joueurs)-joueurs.count(None), file=entrees) for j, joueur in enumerate(joueurs): if joueur!=None: - print(joueur[J_LIGNE], joueur[J_COLONNE], j, joueur[J_VITESSE], joueur[J_NOMBREBOMBES], joueur[J_LONGUEURFLAMMES], joueur[J_DASHSRESTANTS], joueur[J_PIEGESRESTANTS], file=entrees) + print(joueur[J_LIGNE], joueur[J_COLONNE], j, joueur[J_VITESSE], joueur[J_BOMBESRESTANTES], joueur[J_LONGUEURFLAMMES], joueur[J_DASHSRESTANTS], joueur[J_PIEGESRESTANTS], file=entrees) print(len(powerups), file=entrees) for pu in powerups: print(pu[PU_LIGNE], pu[PU_COLONNE], pu[PU_NATURE], file=entrees) @@ -340,7 +340,7 @@ def simulation(strategies): execute_evenement(evenements, evenement, plateau, plateauCouleur, bombes, joueurs, powerups, pieges) affiche_plateau(canvas, plateau, plateauCouleur, bombes, joueurs, powerups) affiche_infos(canvasInfosJoueurs, joueurs, plateauCouleur) - temps = int((evenements[0][0]-evenement[0])/3*100) + temps = int((evenements[0][0]-evenement[0])/3*200) if temps != 0: fenetre.after(temps, pas_de_jeu) else: