diff --git a/Assets/Scripts/FieldModel.cs b/Assets/Scripts/FieldModel.cs index 4803c46..6443d69 100644 --- a/Assets/Scripts/FieldModel.cs +++ b/Assets/Scripts/FieldModel.cs @@ -1,15 +1,12 @@ using System; using UnityEngine; -//using static UnityEngine.Rendering.DebugUI.Table; -//кем занят/не занят слот public enum CellState { Empty, Player1, Player2 } public class FieldModel { - //двумерный массив для поля public CellState[,] fieldArr; public int height, width; @@ -31,13 +28,6 @@ public class FieldModel { fieldArr = new CellState[height, width]; Array.Clear(fieldArr, 0, fieldArr.Length); - //for (int row = 0; row < height; row++) - //{ - // for (int col = 0; col < width; col++) - // { - // fieldArr[row, col] = CellState.Empty; - // } - //} } //Основные проверки с развернутым результатом @@ -70,7 +60,7 @@ public class FieldModel int lineLength = 0; - for (int col = 0; col < 7; col++) + for (int col = 0; col < width; col++) { CellState cell = fieldArr[row, col]; if (cell != currentPlayer) @@ -101,7 +91,7 @@ public class FieldModel { CellState currentPlayer = GameManager.instance.currentPlayer; int lineLength = 0; - for (int row = 5; row >= 0; row--) + for (int row = height - 1; row >= 0; row--) { CellState cell = fieldArr[row, column]; if (cell != currentPlayer) @@ -113,12 +103,8 @@ public class FieldModel if (lineLength == 4)//нашли ряд из 4 фишек { - //int[] indexesRow = new int[4]; - //int[] indexesColumn = new int[4]; for (int i = 0; i < 4; i++) { - //indexesColumn[i] = column; - //indexesRow[i] = row + i; tempIndexesColumn[i] = column; tempIndexesRow[i] = row + i; } @@ -132,12 +118,14 @@ public class FieldModel { CellState currentPlayer = GameManager.instance.currentPlayer; int sum = row + col; - if (sum <= 2 || sum >=9) //при такой сумме индексов 4 фишки в диагональ не помещаются + + // Диагональ слишком короткая, если сумма меньше минимальной (3) или больше максимальной (height+width-4) + if (sum < 3 || sum > height + width - 4) return new CheckResult(false, false); - //считаем индекс начала диагонали (лево низ) - int startRow = Mathf.Clamp(sum, 0, 5); - int startCol = Mathf.Clamp(sum - 5, 0, 5); + // Вычисляем начальную точку диагонали + int startRow = Mathf.Clamp(sum, 0, height - 1); + int startCol = Mathf.Clamp(sum - (height - 1), 0, width - 1); int lineLength = 0; @@ -150,35 +138,30 @@ public class FieldModel continue; } lineLength++; - - if (lineLength == 4)//комбинация из 4 нашлась) + if (lineLength == 4) { - //int[] indexesRow = new int[4]; - //int[] indexesColumn = new int[4]; for (int i = 0; i < 4; i++) - {//идем назад и заполняем индексы - //indexesColumn[i] = col-i; - //indexesRow[i] = row + i; + { tempIndexesRow[i] = row + i; - tempIndexesColumn[i] = col-i; + tempIndexesColumn[i] = col - i; } return new CheckResult(true, false, tempIndexesRow, tempIndexesColumn); } } - return new CheckResult(false, false);//не нашли комбинацию + return new CheckResult(false, false); } public CheckResult checkDiagonalUpDown(int row, int col) { CellState currentPlayer = GameManager.instance.currentPlayer; int sub = row - col; - int startRow = Mathf.Clamp(sub, 0, 2); - int startCol = Mathf.Abs(Math.Clamp(sub, -3, 0)); - //CellState[] diagonalArray = getUpDownDiagonal(row, col); + // Начальная точка диагонали, проходящей через (row, col) + int startRow = sub >= 0 ? sub : 0; + int startCol = sub >= 0 ? 0 : -sub; int lineLength = 0; - for (row = startRow, col = startCol; row < 6 && col < 7; row++, col++) + for (row = startRow, col = startCol; row < height && col < width; row++, col++) { CellState cell = fieldArr[row, col]; if (cell != currentPlayer) @@ -187,28 +170,24 @@ public class FieldModel continue; } lineLength++; - if (lineLength == 4)//комбинация из 4 нашлась) + if (lineLength == 4) { - //int[] indexesRow = new int[4]; - //int[] indexesColumn = new int[4]; for (int i = 0; i < 4; i++) - {//идем назад и заполняем индексы + { tempIndexesColumn[i] = col - i; tempIndexesRow[i] = row - i; - //indexesColumn[i] = col - i; - //indexesRow[i] = row - i; } return new CheckResult(true, false, tempIndexesRow, tempIndexesColumn); } } - return new CheckResult(false, false);//не нашли комбинацию + return new CheckResult(false, false); } - + public int getHeight(int colIndex) { //перебираем ряды для выбранной колонки //ищем самый нижний слот в колонке, куда можем вставить фишку - for (int row = 5; row >= 0; row--) + for (int row = height-1; row >= 0; row--) { if (fieldArr[row, colIndex] == CellState.Empty) { @@ -217,98 +196,17 @@ public class FieldModel } return -1;//если не нашли, то больше добавить нельзя } - - //Оптимизированные проверки для бота - - /* public bool checkRow(int row, CellState currentPlayer, CellState[,] field) - { - //Debug.Log("Ряд"); - if (field[row, 3] != currentPlayer) - return false; - - int lineLength = 0; - for (int i = 0; i < 7; i++) - { - if (field[row, i] != currentPlayer) - { - lineLength = 0; - continue; - } - lineLength++; - - if (lineLength == 4)//нашли ряд из 4 фишек - return true; - } - return true; - }*/ - //проверка ничьей public bool checkDraw() { - for (int col = 0; col < 7; col++) + for (int col = 0; col < width; col++) { //если есть хоть одна непустая колонка то игра продолжается if (getHeight(col) != -1) return false; } return true; } - -/* //Геттеры для разных рядов. Возвращают одномерные массивы - CellState[] getRow(int rowIndex) - { - CellState[] row = new CellState[7]; - for (int col = 0; col<7; col++) - { - row[col] = fieldArr[rowIndex, col]; - } - return row; - } - CellState[] getColumn(int colIndex) - { - CellState[] col = new CellState[6]; - for (int row = 0; row < 6; row++) - { - col[row] = fieldArr[row, colIndex]; - } - return col; - } - CellState[] getUpDownDiagonal(int row, int col) - { - int sub = row - col; - if (sub <= -4 || sub >= 3) //при такой разнице индексов 4 фишки в диагональ не помещаются - return new CellState[0]; - - //считаем индекс начала диагонали (лево верх) - int startRow = Mathf.Clamp(sub, 0, 2); - int startCol = Mathf.Abs(Math.Clamp(sub, -3, 0)); - - List result = new List();//заранее сложно обсчитать сколько в диагонали элементов, поэтому лист - for (row = startRow, col = startCol; row < height && col < width; row++, col++) - { - result.Add(fieldArr[row, col]); - } - result.TrimExcess();//Убрать незаполненные позиции - return result.ToArray(); - } - CellState[] getDownUpDiagonal(int row, int col) - { - int sum = row + col; - if (sum <= 2 || sum >= 9) //при такой сумме индексов 4 фишки в диагональ не помещаются - return new CellState[0]; - - //считаем индекс начала диагонали (лево низ) - int startRow = Mathf.Clamp(sum, 0, 5); - int startCol = Mathf.Clamp(sum - 5, 0, 5); - - List result = new List();//заранее сложно обсчитать сколько в диагонали элементов, поэтому лист - for (row = startRow, col = startCol; row >=0 && col < width; row--, col++) - { - result.Add(fieldArr[row, col]); - } - result.TrimExcess();//Убрать незаполненные позиции - return result.ToArray(); - }*/ }