public MoveChoice RouteToPoint(Point location, Point goal, char[,] board, int MaxLength) { MoveChoice bestChoice = new MoveChoice(int.MaxValue, new Point(int.MaxValue, int.MaxValue)); int result = 0; Point newMove = new Point(location.X, location.Y - 1); if (CheckPossible(newMove, board, new List <Point>())) { result = Traverse(newMove, goal, board); if (result != -1 && result < bestChoice.distance) { bestChoice.distance = result; bestChoice.move = newMove; } } newMove = new Point(location.X - 1, location.Y); if (CheckPossible(newMove, board, new List <Point>())) { result = Traverse(newMove, goal, board); if (result != -1 && result < bestChoice.distance) { bestChoice.distance = result; bestChoice.move = newMove; } } newMove = new Point(location.X + 1, location.Y); if (CheckPossible(newMove, board, new List <Point>())) { result = Traverse(newMove, goal, board); if (result != -1 && result < bestChoice.distance) { bestChoice.distance = result; bestChoice.move = newMove; } } newMove = new Point(location.X, location.Y + 1); if (CheckPossible(newMove, board, new List <Point>())) { result = Traverse(newMove, goal, board); if (result != -1 && result < bestChoice.distance) { bestChoice.distance = result; bestChoice.move = newMove; } } return(bestChoice); }
public Point FindMove(List <Player> players, char[,] board) { List <Point> attackPoints = new List <Point>(); Point bestAttackPoint = new Point(-1, -1); int bestLength = maxLength; foreach (Player p in players) { if (p._type != _type) { int y = p._location.Y; int x = p._location.X; if (p._hitpoints > 0) { if (board[y - 1, x] == '.') { attackPoints.Add(new Point(x, y - 1)); } if (board[y, x - 1] == '.') { attackPoints.Add(new Point(x - 1, y)); } if (board[y, x + 1] == '.') { attackPoints.Add(new Point(x + 1, y)); } if (board[y + 1, x] == '.') { attackPoints.Add(new Point(x, y + 1)); } } } } attackPoints = attackPoints.OrderBy(x => x.Y).ThenBy(x => x.X).ToList <Point>(); foreach (Point p in attackPoints) { MoveChoice m = RouteToPoint(_location, p, board, bestLength); if (m.distance < bestLength) { bestAttackPoint = m.move; bestLength = m.distance; } } return(bestAttackPoint); }