Сегодня у нас день быстрых стартов. Продолжаем пробовать принять участие в Russian AI Cup CodeTanks. Привожу пример базовой стратегии на "додиез". Как всегда, по традиции, сообщаю, что стратегия не приведет Вас к успеху, а всего лишь даст Вам базовые понятия, поможет быстро, на примерах, понять что надо писать и в каком направлении думать. В общем, это усложненный "Hello World".
Пишем стратегию для Russian AI Cup - CodeTanks на C#
using System; using Com.CodeGame.CodeTanks2012.DevKit.CSharpCgdk.Model; namespace Com.CodeGame.CodeTanks2012.DevKit.CSharpCgdk { public sealed class MyStrategy : IStrategy { public void Move(Tank self, World world, Move move) { Tank targetTank = null; double d = double.MaxValue; double ttd = double.MaxValue; for (int i = 0; i < world.Tanks.Length; i++) { double d1 = self.GetDistanceTo(world.Tanks[i].X, world.Tanks[i].Y); if (d1 < d && world.Tanks[i].PlayerName != self.PlayerName && world.Tanks[i].HullDurability > 0 && world.Tanks[i].CrewHealth > 0) { targetTank = world.Tanks[i]; ttd = d = d1; } } if (targetTank != null) { double a = move.TurretTurn = self.GetTurretAngleTo(targetTank.X + targetTank.SpeedX, targetTank.Y + targetTank.SpeedY); if (a < 10) move.FireType = FireType.PremiumPreferred; else move.FireType = FireType.None; } Bonus targetBonus = null; d = double.MaxValue; for (int i = 0; i < world.Bonuses.Length; i++) { double d1 = self.GetDistanceTo(world.Bonuses[i].X, world.Bonuses[i].Y); if (d1 < d && d1 < 250 && !(world.Bonuses[i].Type == BonusType.RepairKit &&self.HullDurability > self.HullMaxDurability * 0.75) && !(world.Bonuses[i].Type == BonusType.Medikit && self.CrewHealth > self.CrewMaxHealth * 0.75)) { targetBonus = world.Bonuses[i]; d = d1; } } if (targetBonus != null) { double a = self.GetAngleTo(targetBonus.X, targetBonus.Y); if (a < Math.PI / 8 && a > -Math.PI / 2) { move.LeftTrackPower = -0.2; move.RightTrackPower = 1; } else if (a > Math.PI / 8 && a < Math.PI / 2) { move.LeftTrackPower = 1; move.RightTrackPower = -0.2; } else { move.LeftTrackPower = 1; move.RightTrackPower = 1; } } else { double a = self.GetAngleTo(targetTank.X, targetTank.Y) + Math.PI / 4; if (a < Math.PI / 16) { move.LeftTrackPower = -1; move.RightTrackPower = 0.4; } else if (a > Math.PI / 16) { move.LeftTrackPower = 0.4; move.RightTrackPower = -1; } } if (ttd < 100) { move.LeftTrackPower = -1; move.RightTrackPower = -1; } } public TankType SelectTank(int tankIndex, int teamSize) { return TankType.Heavy; } } }
Комментариев нет:
Отправить комментарий