hedgewars/uAIAmmoTests.pas
changeset 7132 baf3351646f4
parent 7078 a3408d9ba5ad
child 7134 beb16926ae5c
equal deleted inserted replaced
7130:fcab1fd02bc6 7132:baf3351646f4
   362     // Try to overshoot slightly, seems to pay slightly better dividends in terms of hitting cluster
   362     // Try to overshoot slightly, seems to pay slightly better dividends in terms of hitting cluster
   363     if meX<Targ.X then
   363     if meX<Targ.X then
   364         Vx:= ((Targ.X+10) - meX) / (TestTime + tDelta)
   364         Vx:= ((Targ.X+10) - meX) / (TestTime + tDelta)
   365     else
   365     else
   366         Vx:= ((Targ.X-10) - meX) / (TestTime + tDelta);
   366         Vx:= ((Targ.X-10) - meX) / (TestTime + tDelta);
   367     Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-150) - meY) / (TestTime + tDelta);
   367     Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-50) - meY) / (TestTime + tDelta);
   368     r:= sqr(Vx)+sqr(Vy);
   368     r:= sqr(Vx)+sqr(Vy);
   369     if not (r > 1) then
   369     if not (r > 1) then
   370         begin
   370         begin
   371         x:= meX;
   371         x:= meX;
   372         y:= meY;
   372         y:= meY;
   386         Score:= BadTurn;
   386         Score:= BadTurn;
   387 
   387 
   388      if valueResult < Score then
   388      if valueResult < Score then
   389         begin
   389         begin
   390         ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level));
   390         ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level));
   391         ap.Power:= trunc(sqrt(r) * cMaxPower * 0.9) + AIrndSign(random(Level) * 15);
   391         ap.Power:= trunc(sqrt(r) * cMaxPower) + AIrndSign(random(Level) * 15);
   392         ap.Time:= TestTime;
   392         ap.Time:= TestTime;
   393         ap.ExplR:= 90;
   393         ap.ExplR:= 90;
   394         ap.ExplX:= EX;
   394         ap.ExplX:= EX;
   395         ap.ExplY:= EY;
   395         ap.ExplY:= EY;
   396         valueResult:= Score
   396         valueResult:= Score
   414 meX:= hwFloat2Float(Me^.X);
   414 meX:= hwFloat2Float(Me^.X);
   415 meY:= hwFloat2Float(Me^.Y);
   415 meY:= hwFloat2Float(Me^.Y);
   416 repeat
   416 repeat
   417     inc(TestTime, 1000);
   417     inc(TestTime, 1000);
   418     Vx:= (Targ.X - meX) / (TestTime + tDelta);
   418     Vx:= (Targ.X - meX) / (TestTime + tDelta);
   419     Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-200) - meY) / (TestTime + tDelta);
   419     Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-50) - meY) / (TestTime + tDelta);
   420     r:= sqr(Vx)+sqr(Vy);
   420     r:= sqr(Vx)+sqr(Vy);
   421     if not (r > 1) then
   421     if not (r > 1) then
   422         begin
   422         begin
   423         x:= meX;
   423         x:= meX;
   424         y:= meY;
   424         y:= meY;
   425         dY:= -Vy;
   425         dY:= -Vy;
   426         t:= TestTime;
   426         t:= TestTime;
   427     repeat
   427         repeat
   428         x:= x + Vx;
   428             x:= x + Vx;
   429         y:= y + dY;
   429             y:= y + dY;
   430         dY:= dY + cGravityf;
   430             dY:= dY + cGravityf;
   431         dec(t)
   431             dec(t)
   432     until TestCollExcludingMe(Me, trunc(x), trunc(y), 5) or (t = 0);
   432         until TestCollExcludingMe(Me, trunc(x), trunc(y), 7) or (t = 0);
   433     EX:= trunc(x);
       
   434     EY:= trunc(y);
       
   435     if t < 50 then 
       
   436         Score:= RateExplosion(Me, EX, EY, 381)
       
   437     else 
       
   438         Score:= BadTurn;
       
   439         
   433         
   440     if valueResult < Score then
   434         EX:= trunc(x);
   441         begin
   435         EY:= trunc(y);
   442         ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level));
   436         if t < 50 then 
   443         ap.Power:= trunc(sqrt(r) * cMaxPower * 0.9) + AIrndSign(random(Level) * 15);
   437             Score:= RateExplosion(Me, EX, EY, 200) + RateExplosion(Me, EX, EY + 120, 200)
   444         ap.Time:= TestTime;
   438         else 
   445         ap.ExplR:= 300;
   439             Score:= BadTurn;
   446         ap.ExplX:= EX;
   440             
   447         ap.ExplY:= EY;
   441         if valueResult < Score then
   448         valueResult:= Score
   442             begin
   449         end;
   443             ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level));
   450     end
   444             ap.Power:= trunc(sqrt(r) * cMaxPower) + AIrndSign(random(Level) * 15);
       
   445             ap.Time:= TestTime;
       
   446             ap.ExplR:= 300;
       
   447             ap.ExplX:= EX;
       
   448             ap.ExplY:= EY;
       
   449             valueResult:= Score
       
   450             end;
       
   451         end
   451 until (TestTime = 4000);
   452 until (TestTime = 4000);
   452 TestWatermelon:= valueResult
   453 TestWatermelon:= valueResult
   453 end;
   454 end;
   454 
   455 
   455 
   456 
   456     function Solve(TX, TY, MX, MY: LongInt): LongWord;
   457     function Solve(TX, TY, MX, MY: LongInt): LongWord;
   457     var A, B, D, T: real;
   458     var A, B, D, T: real;
   458         C: LongInt;
   459         C: LongInt;
   459     begin
   460     begin
   460         A:= sqr(cGravityf) * 0.25;
   461         A:= sqr(cGravityf);
   461         B:= - cGravityf * (TY - MY) - 1;
   462         B:= - cGravityf * (TY - MY) - 1;
   462         C:= sqr(TY - MY) + sqr(TX - MX);
   463         C:= sqr(TY - MY) + sqr(TX - MX);
   463         D:= sqr(B) - (A * C * 4);
   464         D:= sqr(B) - A * C;
   464         if D >= 0 then
   465         if D >= 0 then
   465             begin
   466             begin
   466             D:= ( - B + sqrt(D)) * 0.5 / A;
   467             D:= sqrt(D) - B;
   467             if D >= 0 then
   468             if D >= 0 then
   468                 T:= sqrt(D)
   469                 T:= sqrt(D * 2 / A)
   469             else
   470             else
   470                 T:= 0;
   471                 T:= 0;
   471             Solve:= trunc(T)
   472             Solve:= trunc(T)
   472             end
   473             end
   473             else
   474             else
   770 ap.ExplR:= 0;
   771 ap.ExplR:= 0;
   771 ap.Time:= 0;
   772 ap.Time:= 0;
   772 if (Level > 3) then
   773 if (Level > 3) then
   773     exit(BadTurn);
   774     exit(BadTurn);
   774 
   775 
       
   776 ap.Angle:= 0;
   775 ap.AttackPutX:= Targ.X;
   777 ap.AttackPutX:= Targ.X;
   776 ap.AttackPutY:= Targ.Y;
   778 ap.AttackPutY:= Targ.Y;
   777 
   779 
   778 bombsSpeed:= hwFloat2Float(cBombsSpeed);
   780 bombsSpeed:= hwFloat2Float(cBombsSpeed);
   779 X:= Targ.X - 135 - cShift; // hh center - cShift
   781 X:= Targ.X - 135 - cShift; // hh center - cShift