// void draw(int sizeWidth, int sizeHeight) //рисуем игровое поле: { field = new OverrButton[sizeHeight, sizeWidth]; //создаём двумерный массив наших новых кнопок с доп. полями int x = 0, y = 0; //начальные координаты кнопок for (int i = 0; i < sizeHeight; i++) { x = 0; //обнуление координаты икс для перевода на новую строку последующие кнопки for (int j = 0; j < sizeWidth; j++) { field[i, j] = new OverrButton { //определяем наш массив кнопок в зависимости от того, какую сложность мы выбрали в главном меню Width = sizeButtonsPx, //ширина кнопочки, которая берется из константы Height = sizeButtonsPx, //высота кнопочки, которая берется из константы BackColor = Color.LightBlue, //определяем цвет кнопочки xButton = i, yButton = j }; //задаём кнопке координаты x и y в поле для успешного манипулирования над ней в будущем panelField.Controls.Add(field[i, j]); //добавляем кнопочку в элементы контрола Panel, чтобы они отображались внутри field[i, j].Location = new Point(x, y); //определяем координаты для визуального отображения кнопки x += sizeButtonsPx; //прибавляем к иксу константу, чтобы следующая кнопочка отображалась следом после предыдущей field[i, j].MouseDown += new MouseEventHandler(field_Click); //добавляем к кнопочке событие, которое срабатывает при нажатии на любую кнопку на мыше if (rnd.Next(101) < 10) //рандомная генерация бомбочек на поле { bombCount += 1; field[i, j].thisIsBomb = true; } } y += sizeButtonsPx; //смещение по оси y после прохода по первому циклу } Size += new Size(field[0, sizeWidth - 1].Location.X + sizeButtonsPx, y + sizeButtonsPx); //определяем размер формы в зависимости от количества элементов на форме }
// int checkAround(OverrButton btn)//проверяет количество бомбочек вокруг выбранной кнопки { int k = 0; for (int i = btn.xButton - 1; i <= btn.xButton + 1; i += 1) { for (int j = btn.yButton - 1; j <= btn.yButton + 1; j += 1) { try { k = field[i, j].thisIsBomb ? k += 1 : k; } catch { } } } return(k); }
// void field_Click(object sander, MouseEventArgs e) //событие при нажатии на кнопку в поле { OverrButton button = (OverrButton)sander; //обещаем, что наш объект - это кнопка, и записываем результат в переменную, для дальнейших манипуляций if (MouseButtons.Left == e.Button) //если нажата левая кнопка мыши, то: { if (button.thisIsBomb) //если нажали на бомбу, то конец игры { gameLose(); } else//если нажали не на бомбу, то: { for (int i = button.xButton - rnd.Next(3); i <= button.xButton + rnd.Next(3); i++) { for (int j = button.yButton - rnd.Next(3); j <= button.yButton + rnd.Next(3); j++) //рандомно проходимся вокруг нажатой кнопки { try //нужен для того, чтобы приложение не вылетало с исключением о выходе индекса за пределы массива { if (!field[i, j].thisIsBomb) //если вокруг нажатой клавиши нет бомбы, то пишем сколько находится вокруг бомб и отключаем пустые кнопки { field[i, j].Text = "" + checkAround(field[i, j]); //на пустой кнопке пишем сколько вокруг бомб field[i, j].Enabled = false; //отключаем пустую кнопку field[i, j].BackColor = Color.White; //красим в белый цвет пустую кнопку, для лучшего восприятия для игрока } } catch (Exception) { }//действия при вылете приложения с исключением(в нашем случае ничего делать не надо) } } } } else if (MouseButtons.Right == e.Button) //происходит при нажатии на правую кнопку мыши { if (button.thisIsBomb & button.BackColor == Color.LightBlue) //если нажатя кнопка имеет цвет голубой и это бомба, тогда мы считаем правильно засчитанный выбор { button.BackColor = Color.Gray; markCount += 1; } else if (button.thisIsBomb & button.BackColor == Color.Gray) //если нажатая кнопка это бомба и цвет её серый, тогда мы убираем правильный ответ и красим кнопку в голубой { button.BackColor = Color.LightBlue; markCount -= 1; } else //если выбранная кнопка не бомба, то мы просто меняем её цвет на серый или голубой { button.BackColor = button.BackColor == Color.LightBlue ? Color.Gray : Color.LightBlue; } } if (markCount == bombCount) //определяем условие выигрыша - если отмеченных марок столько же, сколько бомб, то: { activeButtons = 0; for (int i = 0; i < sizeHeight; i++) { for (int j = 0; j < sizeWidth; j += 1) { if (field[i, j].Enabled) // считаем количество активных кнопок { activeButtons += 1; } } } if (activeButtons == markCount)//если количество активных кнопок = отмеченных кнопок, то уведомляем игрока о выигрыше { MessageBox.Show("Вы выиграли!\nПоздравляем!"); for (int i = 0; i < sizeHeight; i++) { for (int j = 0; j < sizeWidth; j++) { field[i, j].Enabled = false; //отключаем все поля } } timerWinGame.Enabled = true; //разукрашиваем поле timerGameMinDuration.Enabled = false; //отключаем таймер подсчета времени } } }