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