package dummy; import robocode.*; import java.awt.geom.Point2D; //import java.awt.Color; /** * St00pid - a robot by Kwok-Cheung Li, also known as "Dummy" * designed to participate in the Pez' SpinBotChallenge * http://robowiki.net/cgi-bin/robowiki?SpinBotChallenge */ public class St00pid extends Robot { long scantime=0; double bearing = 0; double heading=0; double spinbotTurnRate = rad(6.25); double spinbotVelocity = 5; double enemyX, enemyY; double enemyDist; double radarturn; double adjustradar=10; double timetohit=1; double direction=150; double tX, tY; boolean found = false; public double rad(double deg) { return Math.PI * deg/180; } public double deg(double rad) { return 180 * rad/Math.PI; } public double angle_180(double ang) { return (ang + 900)%360 - 180; } public void radar() { radarturn = angle_180(bearing - getRadarHeading()); if (radarturn>0) adjustradar = 10; else adjustradar = -10; turnRadarRight(angle_180(bearing - getRadarHeading()) + adjustradar); while(!found) { turnRadarRight(adjustradar); } } public void move() { if (getTime()>timetohit) { turnRight(angle_180(bearing - getHeading() + 90)); adjustForWall(); ahead(direction); direction = -direction; timetohit = getTime() + enemyDist/11 - 14; } else doNothing(); } public void adjustForWall() { double tX, tY, dX, dY; double newHeading; double sign; dX = direction * Math.sin(rad(getHeading())); dY = direction * Math.cos(rad(getHeading())); tX = getX() + dX; tY = getY() + dY; if (tX>=20 && tX<=getBattleFieldWidth()-20 && tY>=20 && tY<=getBattleFieldHeight()-20) return; if (tX < 20) { tX = 20; if (dY<0) sign = -1; else sign = 1; dX = 20-getX(); dY = sign * Math.sqrt(direction*direction - dX*dX); } if (tX > getBattleFieldWidth()-20) { tX = getBattleFieldWidth()-20; if (dY<0) sign = -1; else sign = 1; dX = getBattleFieldWidth()-20-getX(); dY = sign * Math.sqrt(direction*direction - dX*dX); } if (tY < 20) { tY = 20; if (dX<0) sign = -1; else sign = 1; dY = 20-getY(); dX = sign * Math.sqrt(direction*direction - dY*dY); } if (tY > getBattleFieldHeight()-20) { tY = getBattleFieldHeight()-20; if (dX<0) sign = -1; else sign = 1; dY = getBattleFieldHeight()-20-getY(); dX = sign * Math.sqrt(direction*direction - dY*dY); } double turn = deg(Math.atan2(dX, dY)) - getHeading(); if (direction<0) turn += 180; turnRight(angle_180(turn)); } public void gun() { if (Math.abs(bearing - getGunHeading()) < 20) turnGunRight(angle_180(bearing - getGunHeading())); // db is the distance the simulated bullet has travelled; db will probably // be initialized at a negative value, because we want to offset the fact // that the last scan may be some time ago (we're working with Robots, not // AdvancedRobots, remember?) and that the gun needs time (probably one tick // to turn before firing... if (!(getGunHeat()<1)) return; double db=(scantime-getTime() - 1)*11; double ww = rad(heading); double eX = enemyX - getX(); double eY = enemyY - getY(); do { db+=11; //11 is the velocity of a fire(3) bullet. double dx=spinbotVelocity*Math.sin(ww); double dy=spinbotVelocity*Math.cos(ww); ww+=spinbotTurnRate; // turn w radians for next step eX+=dx; eY+=dy; }while (db< Point2D.distance(0,0,eX,eY)); double ang = angle_180(deg(Math.atan2(eX, eY)) - getGunHeading()); turnGunRight(ang); fire(3); } public void run() { turnRadarRight(360); while (!(getGunHeat()<1)) { found = false; radar(); } timetohit = getTime() + enemyDist/11 - 20; while(true) { move(); found = false; radar(); gun(); } } public void onScannedRobot(ScannedRobotEvent e) { found = true; scantime = getTime(); bearing = e.getBearing() + getHeading(); heading = e.getHeading(); enemyDist = e.getDistance(); enemyX = getX() + enemyDist * Math.sin(rad(bearing)); enemyY = getY() + enemyDist * Math.cos(rad(bearing)); spinbotVelocity = e.getVelocity(); } }