public MovementGrade GetTopGradedMovement(ColorCrazePlayerInfo playerInfo, Dictionary <int, Point> playersLocationMap) { var scores = new Dictionary <ITurnStrategy, MovementGrade>(); var maxGrade = 0; foreach (var strategy in strategies) { var gradedMovement = strategy.Grade(playerInfo, playersLocationMap); scores.Add(strategy, gradedMovement); maxGrade = maxGrade < gradedMovement.Grade ? gradedMovement.Grade : maxGrade; } var movement = scores.First(i => i.Value.Grade == maxGrade).Value; return(movement); }
public MovementGrade Grade(ColorCrazePlayerInfo playerInfo, Dictionary <int, Point> playersLocationMap) { var fromLocation = playerInfo.CurrentLocation; var occupiedLocations = playersLocationMap.Values.ToList(); var numberOfPlayers = occupiedLocations.Count; if (numberOfPlayers == 1) { return(new MovementGrade(fromLocation, 100)); } var turnSimulator = new TurnSimulator(this.board); var gradeStep = 100 / (numberOfPlayers - 1); //step in % var maxGradedMovement = new MovementGrade(fromLocation, 0); foreach (var direction in this.directions) { var grade = 0; var nextLocation = fromLocation; for (var i = 0; i < numberOfPlayers - 1; i++) { nextLocation = turnSimulator.Simulate(occupiedLocations, nextLocation, direction); var square = board.Squares[nextLocation.X, nextLocation.Y] as ColorCrazeGridSquare; var isOwned = square.Owner == playerInfo.ID; if (nextLocation != fromLocation && !isOwned) { grade += gradeStep; var nextMovement = new MovementGrade(nextLocation, grade, direction); maxGradedMovement = maxGradedMovement.Grade < grade ? nextMovement : maxGradedMovement; } } } return(maxGradedMovement); }
private Point PlayerToPoint(ColorCrazePlayerInfo player) { return(player.CurrentLocation); }