/// <summary> /// Загрузка формы /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { m_PaintClass = new PaintClass(); m_RowsCnt = PaintClass.BitmapWidth / PaintClass.CellSize; m_ColumnsCnt = PaintClass.BitmapHeight / PaintClass.CellSize; m_Field = new ObjectType[m_RowsCnt, m_ColumnsCnt]; PaintBitmap(); }
/// <summary> /// Сделать ход за компьютер /// </summary> /// <param name="field">Текущая позиция</param> /// <param name="rowsCnt">Количество строк</param> /// <param name="columnsCnt">Количество столбцов</param> /// <param name="whoStep">Кто делает ход</param> /// <param name="paintClass">Ссылка на класс для рисования</param> /// <returns></returns> private int[] DoStepNotStatic(ObjectType[,] field, int rowsCnt, int columnsCnt, ObjectType whoStep, PaintClass paintClass) { m_Field = field; m_RowsCnt = rowsCnt; m_ColumnsCnt = columnsCnt; m_WhoStep = whoStep; m_PaintClass = paintClass; //m_PaintClass.ClearCoefficients(m_RowsCnt, m_ColumnsCnt); // Проверить, если поле пустое - то вернуть ячейку по центру int[] stepCoordinates = GetFirstStep(); if (stepCoordinates.Length != 0) { MessageBox.Show("Первый ход"); return(stepCoordinates); } // Найти оптимальное место под новый символ для атаки stepCoordinates = InvestigateForseAttack(); if (stepCoordinates.Length != 0) { return(stepCoordinates); } // Если нету форсированных выигрышей или необходимости защищаться от форсированного // выигрыша - то поставить новый объект по какому-то алгоритму stepCoordinates = FindAttackStep(); if (stepCoordinates.Length != 0) { MessageBox.Show("Просто атакующий ход"); return(stepCoordinates); } // Если случился баг - то выбрать любое непустое место на поле случайным образом return(GetRandomStep()); }
public ObjectType FindLoser(ObjectType[,] field, int rowsCnt, int columnsCnt, PaintClass paintClass) { int emptyCnt = 0; // Поиск линии из 5 одинаковых объектов for (int i = 0; i < rowsCnt; i++) { for (int j = 0; j < columnsCnt; j++) { if (field[i, j] == ObjectType.Empty) { emptyCnt++; continue; } ObjectType curObj = field[i, j]; // Ищем, сколько подряд по горизонтали int len = 1; int ci1 = i - 1; int cj1 = j; while (ci1 >= 0 && field[ci1, cj1] == curObj) { ci1--; len++; } ci1++; int ci2 = i + 1; int cj2 = j; while (ci2 < rowsCnt && field[ci2, cj2] == curObj) { ci2++; len++; } ci2--; if (len > 4) { paintClass.DrawWinLine(curObj, ci1, cj1, ci2, cj2); return(GetLoser(curObj)); } // Ищем, сколько подряд по вертикали len = 1; ci1 = i; cj1 = j - 1; while (cj1 >= 0 && field[ci1, cj1] == curObj) { cj1--; len++; } cj1++; ci2 = i; cj2 = j + 1; while (cj2 < columnsCnt && field[ci2, cj2] == curObj) { cj2++; len++; } cj2--; if (len > 4) { paintClass.DrawWinLine(curObj, ci1, cj1, ci2, cj2); return(GetLoser(curObj)); } // Ищем, сколько подряд наискосок с левого верха до правого низа len = 1; ci1 = i - 1; cj1 = j - 1; while (ci1 >= 0 && cj1 >= 0 && field[ci1, cj1] == curObj) { ci1--; cj1--; len++; } ci1++; cj1++; ci2 = i + 1; cj2 = j + 1; while (ci2 < rowsCnt && cj2 < columnsCnt && field[ci2, cj2] == curObj) { ci2++; cj2++; len++; } ci2--; cj2--; if (len > 4) { paintClass.DrawWinLine(curObj, ci1, cj1, ci2, cj2); return(GetLoser(curObj)); } // Ищем, сколько подряд наискосок с левого низа до правого верха len = 1; ci1 = i - 1; cj1 = j + 1; while (ci1 >= 0 && cj1 < columnsCnt && field[ci1, cj1] == curObj) { ci1--; cj1++; len++; } ci1++; cj1--; ci2 = i + 1; cj2 = j - 1; while (ci2 < rowsCnt && cj2 >= 0 && field[ci2, cj2] == curObj) { ci2++; cj2--; len++; } ci2--; cj2++; if (len > 4) { paintClass.DrawWinLine(curObj, ci1, cj1, ci2, cj2); return(GetLoser(curObj)); } } } if (emptyCnt == 0) { throw new Exception("Клетки закончились."); } return(ObjectType.Empty); }
/// <summary> /// Сделать ход за компьютер /// </summary> /// <param name="field">Текущая позиция</param> /// <param name="rowsCnt">Количество строк</param> /// <param name="columnsCnt">Количество столбцов</param> /// <param name="whoStep">Кто делает ход</param> /// <param name="paintClass">Ссылка на класс для рисования</param> /// <returns></returns> public static int[] DoStep(ObjectType[,] field, int rowsCnt, int columnsCnt, ObjectType whoStep, PaintClass paintClass) { return(new ComputerClass().DoStepNotStatic(field, rowsCnt, columnsCnt, whoStep, paintClass)); }