Esempio n. 1
0
        /// <summary>
        /// Проверка нахождения камешка в цепочке одинаковых камешков
        /// В этом проекте приоритет отдается горизонтальным цепочкам.
        /// Иерархия появилась т.к. Т- и Х- образные цепочки не проверяются и не просчитываются.
        /// </summary>
        /// <returns>Цепочка камешков</returns>
        /// <param name="gemRow">Ряд</param>
        /// <param name="gemColumn">Колонка</param>
        private GemList GetChainAt(int gemRow, int gemColumn)
        {
            GemList possibleChain = new GemList();

            // Если камешка в данной позиции вообще нет - возвращаем пустой список
            if (GemArray[gemRow, gemColumn] == null)
            {
                return(possibleChain);
            }

            possibleChain.Add(GemArray[gemRow, gemColumn]);

            GemType gemTypeToCheck = GemArray[gemRow, gemColumn].GemType;

            // Флаг разпыва цепочки
            bool chainIsNotBroken = true;

            //Проверка влево
            for (int column = gemColumn - 1; column >= 0 && chainIsNotBroken; column--)
            {
                if (GemArray[gemRow, column] != null && gemTypeToCheck == GemArray[gemRow, column].GemType)
                {
                    possibleChain.Add(GemArray[gemRow, column]);
                }
                else
                {
                    chainIsNotBroken = false;
                }
            }

            chainIsNotBroken = true;

            // Проверка вправо
            for (int column = gemColumn + 1; column < ColumnsNumber && chainIsNotBroken; column++)
            {
                if (GemArray[gemRow, column] != null && gemTypeToCheck == GemArray[gemRow, column].GemType)
                {
                    possibleChain.Add(GemArray[gemRow, column]);
                }
                else
                {
                    chainIsNotBroken = false;
                }
            }

            // Если в цепочке три и более элементов - цепочка возвращается
            if (possibleChain.Count >= 3)
            {
                return(possibleChain);
            }

            // Сбрасываем цепочку, если не нашлось цепочки по горизонтали
            possibleChain.Clear();
            possibleChain.Add(GemArray[gemRow, gemColumn]);

            chainIsNotBroken = true;

            // Проверка вниз
            for (int row = gemRow - 1; row >= 0 && chainIsNotBroken; row--)
            {
                if (GemArray[row, gemColumn] != null && gemTypeToCheck == GemArray[row, gemColumn].GemType)
                {
                    possibleChain.Add(GemArray[row, gemColumn]);
                }
                else
                {
                    chainIsNotBroken = false;
                }
            }

            chainIsNotBroken = true;

            // Проверка вверх
            for (int row = gemRow + 1; row < RowsNumber && chainIsNotBroken; row++)
            {
                if (GemArray[row, gemColumn] != null && gemTypeToCheck == GemArray[row, gemColumn].GemType)
                {
                    possibleChain.Add(GemArray[row, gemColumn]);
                }
                else
                {
                    chainIsNotBroken = false;
                }
            }

            return(possibleChain);
        }