Ejemplo n.º 1
0
Archivo: ACar.cs Proyecto: znsoft/AiCup
        public ACar(Car original)
        {
            X = original.X;
            Y = original.Y;

            Speed                       = new Point(original.SpeedX, original.SpeedY);
            Angle                       = original.Angle;
            EnginePower                 = original.EnginePower;
            WheelTurn                   = original.WheelTurn;
            AngularSpeed                = original.AngularSpeed;
            Original                    = original;
            OutOfMap                    = false;
            RemainingNitroTicks         = original.RemainingNitroTicks;
            RemainingNitroCooldownTicks = original.RemainingNitroCooldownTicks;
            RemainingInactiveTicks      = DurabilityObserver.ReactivationTime(original) - MyStrategy.world.Tick;

            Width  = original.Width;
            Height = original.Height;

            if (original.Type == CarType.Buggy)
            {
                _carAccelerationUp   = Const.Game.BuggyEngineForwardPower / original.Mass;
                _carAccelerationDown = Const.Game.BuggyEngineRearPower / original.Mass;
            }
            else
            {
                _carAccelerationUp   = Const.Game.JeepEngineForwardPower / original.Mass;
                _carAccelerationDown = Const.Game.JeepEngineRearPower / original.Mass;
            }
        }
Ejemplo n.º 2
0
        public bool CheckUseProjectile()
        {
            if (world.Tick < Const.Game.InitialFreezeDurationTicks)
            {
                return(false);
            }
            if (self.ProjectileCount == 0)
            {
                return(false);
            }
            if (self.RemainingProjectileCooldownTicks > 0)
            {
                return(false);
            }

            var projectiles = AProjectile.GetProjectiles(new ACar(self));

            var shot      = new bool[projectiles.Length];
            var shotSpeed = 0.0;

            var checkTicks = MagicConst.OpponentsTicksPrediction * (self.Type == CarType.Buggy ? 0.5 : 0.4);

            for (var t = 1; t < checkTicks; t++)
            {
                for (var prId = 0; prId < projectiles.Length; prId++)
                {
                    var pr = projectiles[prId];
                    if (!pr.Exists)
                    {
                        continue;
                    }

                    pr.Move();

                    for (var i = 0; i < All.Length; i++)
                    {
                        if (t >= All[i].Length)
                        {
                            continue;
                        }

                        var car = All[i][t];

                        /*
                         * Чужие машинки считать меньшими по размеру
                         * Свои - большими
                         */
                        if (pr.Intersect(car, car.Original.IsTeammate ? 5 : -(pr.Type == ProjectileType.Tire ? 40 : 5)))
                        {
                            if (pr.Type == ProjectileType.Tire)
                            {
                                // если это я только что выпустил шину
                                if (car.Original.Id == self.Id && Math.Abs(pr.Speed.Length - Const.Game.TireInitialSpeed) < Eps)
                                {
                                    continue;
                                }
                            }
                            else
                            {
                                // если это я выпустил шайбу
                                if (car.Original.Id == self.Id)
                                {
                                    continue;
                                }
                            }

                            if (car.Original.IsTeammate) // попал в своего
                            {
                                return(false);
                            }

                            if (DurabilityObserver.ReactivationTime(car.Original) + 2 < world.Tick + t || DurabilityObserver.IsActive(car.Original))
                            {
                                // если он не мертв
                                shot[prId] = true;
                                if (pr.Type == ProjectileType.Tire)
                                {
                                    shotSpeed = pr.Speed.Length;
                                }
                            }
                            pr.Exists = false;
                        }
                    }
                }
            }
            var shotCount = shot.Count(val => val);

            if (self.Type == CarType.Buggy)
            {
                return(shotCount >= 3 || shotCount == 2 && self.ProjectileCount > 2);
            }
            return(shotCount == 1 &&
                   (shotSpeed >= Const.Game.TireInitialSpeed - Eps ||
                    shotSpeed >= Const.Game.TireInitialSpeed / 2.5 && self.ProjectileCount > 2));
        }