вторник, 6 ноября 2012 г.

RAIC::CodeTanks - Быстрый старт на C#


Сегодня у нас день быстрых стартов. Продолжаем пробовать принять участие в 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;
        }
    }
}

Комментариев нет:

Отправить комментарий