コード例 #1
0
        public override UpdateViewAfterRobotStepEventArgs ChangeModel(IList <Robot> robots, int currentIndex, Map map)
        {
            var result  = new UpdateViewAfterRobotStepEventArgs();
            var myRobot = robots[currentIndex];
            var energyLossToCreateNewRobot = Variant.GetInstance().EnergyLossToCreateNewRobot;
            var energyLoss = energyLossToCreateNewRobot + NewRobotEnergy;

            if (robots.Count(r => r.Owner.Name == myRobot.Owner.Name) >= 100)
            {
                Description = $"FAILED: number of {myRobot.Owner.Name} robots reached 100.";
            }
            else if (myRobot.Energy > energyLoss)
            {
                var position = map.FindFreeCell(myRobot.Position, robots);
                var newRobot = new Robot()
                {
                    Position = position, Energy = NewRobotEnergy, Owner = myRobot.Owner
                };
                robots.Add(newRobot);
                myRobot.Energy -= energyLoss;

                result.NewRobotPosition  = position;
                result.TotalEnergyChange = -energyLossToCreateNewRobot;

                Description = $"New: {result.NewRobotPosition}";
            }
            else
            {
                Description = "FAILED: not enough energy to create new robot";
            }


            return(result);
        }
コード例 #2
0
        public override RobotStepCompletedEventArgs ChangeModel(IList <Robot> robots, int currentIndex, Map map)
        {
            var   result   = new RobotStepCompletedEventArgs();
            var   myRobot  = robots[currentIndex];
            Robot newRobot = null;

            if (myRobot.Energy > MinEnergyToCreateNewRobot)
            {
                var position = map.FindFreeCell(myRobot.Position, robots);
                newRobot = new Robot()
                {
                    Position = position, Energy = NewRoborEnergy, Owner = myRobot.Owner
                };
                robots.Add(newRobot);
                myRobot.Energy -= EnergyLossToCreateNewRobot;

                result.NewRobotPosition  = position;
                result.TotalEnergyChange = -EnergyLossToCreateNewRobot;

                Description = String.Format("New: {0}", result.NewRobotPosition);
            }
            else
            {
                Description = String.Format("FAILED: not enough energy to create new robot");
            }


            return(result);
        }
コード例 #3
0
        public static Position ResolveMovePosition(Position from, Position to, int stepsCount, Map map, IList <Robot> robots)
        {
            float x = from.X + (to.X - from.X) / stepsCount;
            float y = from.Y + (to.X - from.X) / stepsCount;

            Position position = new Position((int)Math.Round(x), (int)Math.Round(y));

            return(map.FindFreeCell(position, robots));
        }
コード例 #4
0
        public override UpdateViewAfterRobotStepEventArgs ChangeModel(IList <Robot> robots, int currentIndex, Map map)
        {
            var result = new UpdateViewAfterRobotStepEventArgs();

            //skip movement if not valid
            if (!map.IsValid(NewPosition))
            {
                Description = $"FAILED: {NewPosition} position not valid ";
                return(result);
            }


            var myRobot        = robots[currentIndex];
            var oldPosition    = robots[currentIndex].Position;
            var moveEnergyLoss = CalculateLoss(NewPosition, oldPosition);

            Robot movedRobot = null;

            foreach (var robot in robots)
            {
                if ((robot != myRobot) && (robot.Position == NewPosition))
                {
                    //moving
                    //var energyOfFightLoss =  Math.Min(robot.Energy, myRobot.Energy);
                    moveEnergyLoss += Variant.GetInstance().AttackEnergyLoss;
                    movedRobot      = robot;
                }
            }


            //if not enough energy than skip the movement
            if (myRobot.Energy < moveEnergyLoss)
            {
                Description = "FAILED: not enough energy to move";
                return(new UpdateViewAfterRobotStepEventArgs());
            }


            result.TotalEnergyChange = -moveEnergyLoss;
            result.MovedFrom         = new List <Position>()
            {
                oldPosition
            };
            result.MovedTo = new List <Position>()
            {
                NewPosition
            };

            myRobot.Energy  -= moveEnergyLoss;
            myRobot.Position = NewPosition;
            Description      = String.Format("MOVE: {0}-> {1}", oldPosition, NewPosition);

            if (movedRobot != null)
            {
                var newX      = 2 * NewPosition.X - oldPosition.X;
                var newY      = 2 * NewPosition.Y - oldPosition.Y;
                var movedFrom = movedRobot.Position;
                var movedTo   = map.FindFreeCell(new Position(newX, newY), robots);;
                movedRobot.Position = movedTo;

                //Stole energy
                var stoleRate = Variant.GetInstance().StoleRateEnergyAtAttack;
                myRobot.Energy    += (int)(movedRobot.Energy * stoleRate);
                movedRobot.Energy -= (int)(movedRobot.Energy * stoleRate);
                result.MovedFrom.Insert(0, movedFrom);
                result.MovedTo.Insert(0, movedRobot.Position);
                Description = $"Attacked {movedRobot.OwnerName} robot at ({NewPosition})";
            }

            return(result);
        }
コード例 #5
0
        public override RobotStepCompletedEventArgs ChangeModel(IList <Robot> robots, int currentIndex, Map map)
        {
            var result = new RobotStepCompletedEventArgs();

            //skip movement if not valid
            if (!map.IsValid(NewPosition))
            {
                Description = string.Format("FAILED: {0} position not valid ", NewPosition);
                return(result);
            }


            var myRobot        = robots[currentIndex];
            var oldPosition    = robots[currentIndex].Position;
            int moveEnergyLoss = (int)(Math.Pow(NewPosition.X - oldPosition.X, 2) + Math.Pow(NewPosition.Y - oldPosition.Y, 2));

            Robot movedRobot = null;


            foreach (var robot in robots)
            {
                if ((robot != myRobot) && (robot.Position == NewPosition))
                {
                    //moving
                    //var energyOfFightLoss =  Math.Min(robot.Energy, myRobot.Energy);
                    moveEnergyLoss += ShoveEnergyLoss;
                    movedRobot      = robot;
                }
            }


            //if not enough energy than skip the movement
            if (myRobot.Energy < moveEnergyLoss)
            {
                Description = "FAILED: not enough energy to move";
                return(new RobotStepCompletedEventArgs());
            }



            result.TotalEnergyChange = -moveEnergyLoss;
            result.MovedFrom         = new List <Position>()
            {
                oldPosition
            };
            result.MovedTo = new List <Position>()
            {
                NewPosition
            };

            myRobot.Energy  -= moveEnergyLoss;
            myRobot.Position = NewPosition;
            Description      = String.Format("MOVE: {0}-> {1}", oldPosition, NewPosition);

            if (movedRobot != null)
            {
                movedRobot.Position = map.FindFreeCell(NewPosition, robots);
                result.MovedFrom.Insert(0, NewPosition);
                result.MovedTo.Insert(0, movedRobot.Position);
                Description += string.Format(" . Shoved {0} robot", movedRobot.Owner.Name);
            }

            return(result);
        }