Beispiel #1
0
        /// <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();
        }
Beispiel #2
0
        /// <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());
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
 /// <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));
 }