コード例 #1
0
        public static void Action(NagibatorTank me, CustomEvent e)
        {
            Console.WriteLine($"{nameof(OnCustomEventModule)}: {e.Condition.Name}");

            //if (e.Condition.Name.Equals("too_close_to_walls"))
            //    me.MoveDirection *= -1;
        }
コード例 #2
0
 public static void Action(NagibatorTank me, RobotDeathEvent e)
 {
     Console.WriteLine($"{nameof(OnRobotDeathModule)}: {e.Name}");
     if (me.Target?.Equals(e.Name) == true)
     {
         me.Target = null;
         Console.WriteLine($"{nameof(OnRobotDeathModule)}: Set target to NULL");
     }
 }
コード例 #3
0
        public static void SendMessage(NagibatorTank me, Dictionary <string, string> message)
        {
            var strMessage = string.Join(Separator.ToString(), message.Select(m => $"{m.Key}{KvpSeparator}{m.Value}"));

            foreach (var teammate in me.Teammates)
            {
                me.SendMessage(teammate, strMessage);
            }
        }
コード例 #4
0
ファイル: ActionModule.cs プロジェクト: Triviy/tankmageddon
        public static void NewTargetAction(NagibatorTank me, Dictionary <string, string> message)
        {
            Console.WriteLine($"{nameof(ActionModule)}: Got new target {message[Name]}");
            me.Target      = message[Name];
            me.TargetPoint = new Point
            {
                X = double.Parse(message[X]),
                Y = double.Parse(message[Y])
            };
            me.TargetBearing  = double.Parse(message[Bearing]);
            me.TargetDistance = double.Parse(message[Distance]);

            Action(me);
        }
コード例 #5
0
        public static void Action(NagibatorTank me, MessageEvent e)
        {
            Console.WriteLine($"{nameof(OnMessageReceivedModule)}: {e.Message}");

            var message = MessageHelper.ReadMessage(e.Message.ToString());

            switch (message[MessageType])
            {
            case EnemyPositionMessage.Type:
                ActionModule.NewTargetAction(me, message);
                break;

            default:
                return;
            }
        }
コード例 #6
0
ファイル: FireHelper.cs プロジェクト: Triviy/tankmageddon
        public static double GetFirePower(NagibatorTank me, ScannedRobotEvent e, Point newTargetPosition)
        {
            double firePower = Math.Min(400 / e.Distance, 3);

            if (me.TargetPoint == null || newTargetPosition == null)
            {
                return(firePower);
            }

            if (IsTheSamePosition(me.TargetPoint, newTargetPosition) || e.Energy < 3)
            {
                return(3);
            }
            if (Math.Abs(Math.Abs(e.Heading) - Math.Abs(me.GunHeading)) < 3)
            {
                return(firePower * 1.5);
            }
            return(firePower);
        }
コード例 #7
0
ファイル: ActionModule.cs プロジェクト: Triviy/tankmageddon
        public static void Action(NagibatorTank me)
        {
            if (me.TargetPoint == null)
            {
                Console.WriteLine($"{nameof(ActionModule)}: no target!");
                return;
            }

            var angleToTarget = Math.Atan2(me.TargetPoint.X - me.X, me.TargetPoint.Y - me.Y);

            Console.WriteLine($"{nameof(ActionModule)}: angle to target {angleToTarget}");

            me.TurnGunRightRadians(Utils.NormalRelativeAngle(angleToTarget - me.GunHeadingRadians));

            if (me.IsMovingToEnemy)
            {
                me.IsMovingToEnemy = me.TargetDistance <= 300;
                Console.WriteLine($"{nameof(ActionModule)}: [{nameof(me.IsMovingToEnemy)}:{me.IsMovingToEnemy}]");
            }
            else
            {
                me.IsMovingToEnemy = me.TargetDistance >= 700;
                Console.WriteLine($"{nameof(ActionModule)}: [{nameof(me.IsMovingToEnemy)}:{me.IsMovingToEnemy}]");
            }

            if (me.IsMovingToEnemy)
            {
                var x       = me.TargetPoint.X - me.X;
                var y       = me.TargetPoint.Y - me.Y;
                var goAngle = Utils.NormalRelativeAngle(Math.Atan2(x, y) - me.HeadingRadians);
                me.SetTurnRightRadians(Math.Atan(Math.Tan(goAngle)));
                me.SetAhead(Math.Cos(goAngle) * Hypotenuse(x, y) - 500);
            }
            else
            {
                if (Random.Next(0, 100) > 98 || me.Velocity == 0)
                {
                    me.MoveDirection *= -1;
                }
                me.SetTurnRight(me.TargetBearing + 90);
                me.SetAhead(1000 * me.MoveDirection);
            }
        }
コード例 #8
0
        public static void Action(NagibatorTank me, ScannedRobotEvent e)
        {
            try
            {
                if (me.IsTeammate(e.Name))
                {
                    return;
                }
                Console.WriteLine($"{nameof(OnScannedRobotModule)}: spotted [{e.Name}]. My target is [{me.Target}]");

                var enemyPosition = CoordHelper.GetEnemyCoordinate(me.Heading, me.Status, e);
                if (string.IsNullOrWhiteSpace(me.Target))
                {
                    Console.WriteLine($"{nameof(OnScannedRobotModule)}: Setting team target {e.Name}");
                    me.Target = e.Name;
                }

                if (me.Target.Equals(e.Name))
                {
                    //me.SetTurnRadarRight(2.0 * Utils.NormalRelativeAngleDegrees(me.Heading + e.Bearing - me.RadarHeading));
                    ActionModule.Action(me);
                    Console.WriteLine($"{nameof(OnScannedRobotModule)}: Fire to {e.Name}");
                    me.Fire(FireHelper.GetFirePower(me, e, enemyPosition));
                    MessageHelper.SendMessage(me, new Dictionary <string, string>
                    {
                        [Constants.MessageType] = Constants.EnemyPositionMessage.Type,
                        [Name]     = e.Name,
                        [X]        = enemyPosition.X.ToString(CultureInfo.InvariantCulture),
                        [Y]        = enemyPosition.Y.ToString(CultureInfo.InvariantCulture),
                        [Bearing]  = e.Bearing.ToString(CultureInfo.InvariantCulture),
                        [Distance] = e.Distance.ToString(CultureInfo.InvariantCulture)
                    });

                    me.TargetPoint = enemyPosition;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{nameof(OnScannedRobotModule)}: {ex}");
            }
        }
コード例 #9
0
        public static void Action(NagibatorTank me)
        {
            Console.WriteLine("Loop started");

            me.SetTurnRadarRight(double.PositiveInfinity);

            if (me.CurrentEnemiesAlive != me.Others)
            {
                me.Target = null;
                me.CurrentEnemiesAlive = me.Others;
            }

            if (!string.IsNullOrWhiteSpace(me.Target))
            {
                ActionModule.Action(me);
            }
            else
            {
                me.Ahead(5000);
                me.TurnRight(90);
            }
        }
コード例 #10
0
        public static void Action(NagibatorTank me)
        {
            Console.WriteLine("I'm started");
            me.IsAdjustGunForRobotTurn = true;
            foreach (var gameEvent in me.GetAllEvents())
            {
                switch (gameEvent)
                {
                case DeathEvent deathEvent:
                    deathEvent.Priority = 0;
                    break;

                case StatusEvent statusEvent:
                    statusEvent.Priority = 1;
                    break;

                case ScannedRobotEvent scannedRobotEvent:
                    scannedRobotEvent.Priority = 2;
                    break;

                case MessageEvent messageEvent:
                    messageEvent.Priority = 3;
                    break;
                }
            }

            var triggerHitCondition = new Condition("too_close_to_walls", c =>
            {
                const int wallMargin = 300;
                return(
                    (me.X <= wallMargin ||
                     me.X >= me.BattleFieldWidth - wallMargin ||
                     me.Y <= wallMargin ||
                     me.Y >= me.BattleFieldHeight - wallMargin)
                    );
            });

            me.AddCustomEvent(triggerHitCondition);
        }
コード例 #11
0
ファイル: OnStatusModule.cs プロジェクト: Triviy/tankmageddon
 public static void Action(NagibatorTank me, StatusEvent e)
 {
     me.Status = e.Status;
 }