private static void driveTo(FlagPlace place) { double driveAngle = AngleUtils.AngleDegree(tank.X, tank.Y, place.X, place.Y); if (tank.HitPoints == 0) { tank.Wait(); // wait to respawn } if (Math.Abs(driveAngle - tank.AngleDrive) > 5) { if (tank.Power > tank.Motor.ROTATE_IN && tank.WantedPower > tank.Motor.ROTATE_IN) { tank.Drive(driveAngle, tank.Motor.ROTATE_IN); tank.WantedPower = tank.Motor.ROTATE_IN; } else if (tank.Power <= tank.Motor.ROTATE_IN) { tank.Drive(driveAngle, 100); tank.WantedPower = 100; } } for (int angle = 0; angle < 360; angle += 30) { ScanAnswerCommand scanAnswer = tank.Scan(angle, 10); if (scanAnswer.ENEMY_ID != tank.ID) { tank.Shoot(angle, scanAnswer.RANGE); } } }
public ACommand scanProcess(ScanCommand command, Battlefield.RobotAndBattlefield robotAndBattlefield) { double minDistance = Battlefield.ARENA_MAX_SIZE * 10; BattlefieldRobot robot = robotAndBattlefield.ROBOT; Battlefield battlefield = robotAndBattlefield.BATTLEFIELD; BattlefieldRobot minTarget = robot; if (robot.HitPoints > 0) { foreach (BattlefieldRobot target in battlefield.robots) { if (robot.ID != target.ID && target.HitPoints > 0 && battlefield.obstacleManager.CanScan(battlefield.turn, robot.X, robot.Y, target.X, target.Y)) { double distance = EuclideanSpaceUtils.Distance(robot.X, robot.Y, target.X, target.Y); if (distance < minDistance) { double degree = AngleUtils.NormalizeDegree(AngleUtils.AngleDegree(robot.X, robot.Y, target.X, target.Y)); if (Math.Abs(degree - command.ANGLE) <= command.PRECISION) { minDistance = distance; minTarget = target; } } } } battlefield.battlefieldTurn.AddScan(new Scan(command.ANGLE, command.PRECISION, minDistance, robot.X, robot.Y)); } return(new ScanAnswerCommand(minDistance, minTarget.ID)); }
private static DriveAnswerCommand robotDriveToBase(ClientRobot robot) { double angle = AngleUtils.AngleDegree(robot.X, robot.Y, capturedBase.X, capturedBase.Y); if (robot.Power > robot.Motor.ROTATE_IN && Math.Abs(angle - robot.AngleDrive) > 1) { return(robot.Drive(robot.AngleDrive, robot.Motor.ROTATE_IN)); } else { return(robot.Drive(angle, 100)); } }
public static void Main(string[] args) { ClientRobot.Connect(args); while (true) { RepairmenState repairmenState = getRepairmenState(); MinerState minerState = getMinerState(); switch (minerState) { case MinerState.DETONATE: if (mineLayer.PutMinesList.Count > 0) { mineLayer.DetonateMine(mineLayer.PutMinesList[0].ID); } break; case MinerState.PUT_MINE: mineLayer.PutMine(); break; case MinerState.GO_TO_REPAIRMAN: mineLayer.Drive(AngleUtils.AngleDegree(mineLayer.X, mineLayer.Y, repairman.X, repairman.Y), mineLayer.Motor.ROTATE_IN); break; case MinerState.GO_TO_BASE: robotDriveToBase(mineLayer); break; case MinerState.GO_AROUND: if (EuclideanSpaceUtils.Distance(mineLayer.X, mineLayer.Y, capturedBase.X, capturedBase.Y) < BaseCapture.BASE_SIZE * 3.0 / 4.0) { scan1 = mineLayer.Scan(AngleUtils.AngleDegree(mineLayer.X, mineLayer.Y, capturedBase.X, capturedBase.Y), 10); } else { robotDriveAround(mineLayer); } break; } switch (repairmenState) { case RepairmenState.GO_AROUND: if (EuclideanSpaceUtils.Distance(mineLayer.X, mineLayer.Y, capturedBase.X, capturedBase.Y) < BaseCapture.BASE_SIZE * 3.0 / 4.0) { scan2 = repairman.Scan(AngleUtils.AngleDegree(mineLayer.X, mineLayer.Y, capturedBase.X, capturedBase.Y), 10); } else { robotDriveAround(repairman); } break; case RepairmenState.GO_TO_BASE: robotDriveToBase(repairman); break; case RepairmenState.REPAIR: repairman.Repair((int)EuclideanSpaceUtils.Distance(repairman.X, repairman.Y, mineLayer.X, mineLayer.Y) + 1); break; } if (repairmenState == RepairmenState.REPAIR) { mineLayer.previousHitpoints = mineLayer.HitPoints; } } }