Пример #1
0
        private void MoveToBonus(Tank self, World world, Move move)
        {
            double distanceToBonus = double.MaxValue;
            Bonus selectedBonus = null;

            foreach (Bonus bonus in world.Bonuses)
            {
                double distance = self.GetDistanceTo(bonus);

                if (distance < distanceToBonus)
                {
                    distanceToBonus = distance;
                    selectedBonus = bonus;
                }
            }

            if (selectedBonus == null) return;

            double angle = self.GetAngleTo(selectedBonus);
            double absAngle = Math.Abs(angle);

            if (absAngle < Const.MIN_ANGLE) // move forward
            {
                move.LeftTrackPower = 1.0d;
                move.RightTrackPower = 1.0d;
            }
            else if (absAngle > Math.PI - Const.MIN_ANGLE) // move back
            {
                move.LeftTrackPower = -1.0d;
                move.RightTrackPower = -1.0d;
            }
            else if (absAngle > Const.HALF_PI - Const.MIN_ANGLE
                && absAngle < Const.HALF_PI + Const.MIN_ANGLE) // turn
            {
                move.LeftTrackPower = 1.0d;
                move.RightTrackPower = -1.0d;
            }
            else if (absAngle < Const.HALF_PI)
            {
                move.LeftTrackPower = 1.0d;
                move.RightTrackPower = 1.0d - absAngle * 2d;

                if (angle < 0.0d)
                {
                    var tmp = move.LeftTrackPower;
                    move.LeftTrackPower = move.RightTrackPower;
                    move.RightTrackPower = tmp;
                }
            }
            else // if (absAngle > HALF_PI)
            {
                move.LeftTrackPower = -1.0d;
                move.RightTrackPower = -1.0d - absAngle * 2d;

                if (angle < 0.0d)
                {
                    var tmp = move.LeftTrackPower;
                    move.LeftTrackPower = move.RightTrackPower;
                    move.RightTrackPower = tmp;
                }
            }
        }
Пример #2
0
        private void Go(Tank self, double x, double y)
        {
            double angle = self.GetAngleTo(x, y);

            // Если слишком близко к цели (то есть с точностью до размера танка уже на ней)
            if (self.GetDistanceTo(x, y) < self.Width * 0.7)
                return;

            bool reverse = false;
            if (Math.Abs(angle) > Angle[90])
            {
                reverse = true;
                angle = NewAngle(angle);
            }

            if (world.Tick < 200)
            {
                if (angle > Angle[30])
                {         // если угол сильно положительный,
                    SetMove(1, -1);
                }
                else if (angle < -Angle[30])
                {  // если угол сильно отрицательный,
                    SetMove(-1, 1);
                }
                else
                {
                    SetMove(1, 1);
                }
            }
            else
            {
                if (angle > 0)
                    SetMove(1, Math.Cos(angle));
                else
                    SetMove(Math.Cos(angle), 1);

                if (self.GetDistanceTo(x, y) < self.Width * 5)
                {
                    if (move.LeftTrackPower < 0.8)
                        move.LeftTrackPower = -1;
                    if (move.RightTrackPower < 0.8)
                        move.RightTrackPower = -1;
                }
            }

            if (reverse)
            {
                SetMove(-move.RightTrackPower, -move.LeftTrackPower);
            }
        }