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); }
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); }
public void InvokeRobotStepCompleted(UpdateViewAfterRobotStepEventArgs e) { RobotStepCompletedEventHandler handler = RobotStepCompleted; if (handler != null) { handler(this, e); } }
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); }