コード例 #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 UpdateViewAfterRobotStepEventArgs ChangeModel(IList <Robot> robots, int currentIndex, Map map)
        {
            var result = new UpdateViewAfterRobotStepEventArgs();

            var myRobot   = robots[currentIndex];
            var resources = map.GetNearbyResources(myRobot.Position, Variant.GetInstance().CollectingDistance);

            if (resources.Count == 0)
            {
                Description = "FAILED: no resource to collect energy";
            }

            int totalCollectedEnergy = 0;

            foreach (var energyStation in resources)
            {
                if (energyStation != null)
                {
                    var energy = Math.Min(energyStation.Energy, Variant.GetInstance().MaxEnergyCanCollect);
                    myRobot.Energy          += energy;
                    energyStation.Energy    -= energy;
                    result.TotalEnergyChange = energy;
                    totalCollectedEnergy    += energy;
                }
                else
                {
                    //Description = "ERROR: station is null";
                }
            }

            Description = String.Format("COLLECT: {0}", totalCollectedEnergy);

            return(result);
        }
コード例 #3
0
        public void InvokeRobotStepCompleted(UpdateViewAfterRobotStepEventArgs e)
        {
            RobotStepCompletedEventHandler handler = RobotStepCompleted;

            if (handler != null)
            {
                handler(this, e);
            }
        }
コード例 #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);
        }