[ Three players answered Richard Rognlie's appeal to write about their winning strategies in C++Robots. Right now Morten Piil's Crawl is #1, Chris Fordor's one_man_one_bot is #3, and James Reed's robot is #13 on the hill, behind my bot at #11 (bwhaha.) I hope that this information will prove useful to C++Robots players, and I look forward to better competition on the hill! -- Greg ]
ScanArg = 5730/d + 1;
where d is the distance of the enemy. This is derived from being
able to keep up with a robot traveling at full speed at 90 degrees
across my line of sight.
d = d1 + (d1-d2) * dt / (t1-t2);
v = v1 + (v1-v2) * dt / (t1-t2);
where d is the distance, v is the angle, t is the time, 1 refers to
last position, 2 to the one before, and dt is the time from the
last observation till impact of the shell (see 8). Polar
extrapolation is inaccurate at close distances, and I've noticed
that Chris Fodor uses the absolute coordinates for his
extrapolation, but the calculations are a bit more complicated and
use too much time to fit in a single cycle of the simulator (for me
at least).
dt = calctime + d/10 + time() - t1;
where calctime was the time it took to calculate the new position
(later), d/10 was the flight time (in clockcycles) for the
cannonshot, and time() - t1 was the time from now till my last
observation of the enemy.
Now Richard has a different point of view: Robots only move and
cannonshots only land between timeslices. This means that when you
see a robot with scan() the information is already one timeslice
old. When you fire a cannon shot it *MAY* travel up to 150 meters
in 0.01 seconds thats 15,000 m/s, not 100 m/s. After this I
changed my robot to calculate in whole timeslices, and used
Richards formula for finding the impact time of a cannon() shot:
dt=((d+500)/1000); if (!dt) dt=1; dt+=t++;
Thats when Chris Fodors "susan_unit" stopped being number one. So
check your world against Richard's you may be surprised.
c++robots challenge your_bot's_name bot_on_hill's_name
to run your robot against a bot on the hill. Observe the timing of
your calls to scan, cannon and drive. Check that they fit in your
timeslice, and use your timeslice. Don't waste CPU cycles (crawl
actually uses up to 98-99 % of the slice in the tight places.
Staying on the move by limiting turning makes you a harder target. (Actually, it makes it easier for "trackers". Zigzagging makes it harder for "trackers".)
The way my best bot has worked is to stay on the diagonal, and use actual geometry to predict the position of the enemy bot when the bullet reaches it and fire at that position.
My second best bot (daisy) worked by chasing the robot and assuming that it was behind the other robot when it fired. (i.e., both traveling at 100)
For example, pointnshoot emphasizes point 2 by changing direction every time it detects that it's been hit. That makes it a more challenging target to track, but it also makes it more difficult for pointnshoot to track its opponent.
hereicome emphasizes point 6 by driving straight toward the target as soon as it's located. That reduces the uncertainty by reducing the distance. It also emphasizes point 5 by keeping its calculations to a minimum so it can shoot more often.
I know that there are some robots that spend a lot of effort in locating the target and shooting accurately. A well implemented intelligent robot is more likely to place high up on the chart, but they can still get beat on occasion by a fast-but-stupid robot.
(Edited by Greg Lindahl) (lindahl@pbm.com)