public void Test(string board, ClassicMovement bestMovement, int recursionDepth) { var state = TestHelper.CreateState(board, 50, 50, 0, 0, 0, 0); var Ai = new ClassicAI(state); Ai.maxRecursionDepth = recursionDepth; var movement = Ai.GetGoodMovement(Ai.maxRecursionDepth); Assert.That(bestMovement, Is.EqualTo(movement)); }
/// <summary> /// Добавляет в словарь ходов, все возможные ходы с обменом элементов /// </summary> /// <param name="dest"></param> /// <param name="state"></param> private void AddSwaps(Dictionary<Movement, ClassicGameState> dest, ClassicGameState state) { foreach (var movement in GetUncheckedSwaps(state.Board)) { var classicMovement = (ClassicMovement)movement; Point first = classicMovement.First; Point second = classicMovement.Second; if (IsSwapCorrect(first, second, state.Board)) { var newMovement = new ClassicMovement { First = first, Second = second }; dest.Add(movement, GetStateAfterSwap(first, second, state)); } } }
private void AddEmptyMovement(Dictionary<Movement, ClassicGameState> result, ClassicGameState source) { var movement = new ClassicMovement { Kind = ClassicMovementKind.Empty }; var state = source.Clone(); state.SwapPlayers(); result.Add(movement, state); }
/// <summary> /// Добавляет в словарь ходов, все возможные ходы с использованием взрывчатки /// </summary> private void AddExplosiveItemUsages(Dictionary<Movement, ClassicGameState> dest, ClassicGameState state, bool isBomb) { var current = isBomb ? ClassicMovementKind.Bomb : ClassicMovementKind.Dynamit; var explosiveItemGetShape = isBomb ? (Func<Point, Point[]>)GetBombShape : GetDynamitShape; for (int x = 1; x <= state.Board.Width; ++x) for (int y = 1; y <= state.Board.Height; ++y) { Point center = new Point(x, y); var shape = explosiveItemGetShape(center); ClassicMovement movement = new ClassicMovement { First = center, Kind = current }; dest.Add(movement, GetStateAfterExplosition(shape, state, current == ClassicMovementKind.Bomb)); } }
/// <summary> /// Возвращает все возможные обмены соседних по стороне элементов доски. /// Правила игры не учитываются. /// </summary> private static List<Movement> GetUncheckedSwaps(SimpleBoard board) { var result = new List<Movement>(); int width = board.Width; int height = board.Height; for (int x = 1; x <= width; ++x) for (int y = 1; y <= height; ++y) { var second = new Point(x, y); var first = new Point(x - 1, y); if (first.X >= 1) { ClassicMovement movement = new ClassicMovement { Kind = ClassicMovementKind.Swap, First = first, Second = second }; result.Add(movement); } first = new Point(x, y - 1); if (first.Y >= 1) { ClassicMovement movement = new ClassicMovement { Kind = ClassicMovementKind.Swap, First = first, Second = second }; result.Add(movement); } } return result; }