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