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 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); }
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)); }
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); }
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); }