null
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (1/16)
Давай напишем увлекательную игру "Сапер". Правила игры: 1. Игровое поле разделено на смежные ячейки (квадраты), некоторые из которых «заминированы». 2. Цель игры — разминировать поле, то есть открыть все ячейки без мин. 3. Если открыта ячейка с миной, игра считается проигранной. Мины расставляют
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (2/16)
Наше игровое поле какое-то маленькое, тебе не кажется? Нам нужно игровое поле размером 9х9 ячеек. Для указания размерности в движке существует метод setScreenSize(int, int), который принимает параметрами ширину и высоту (количество ячеек по ширине и высоте). Поскольку поле квадратное, размерность у
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (3/16)
Так как в нашей игре будут использоваться игровые объекты (ячейки), создадим для их описания отдельный класс GameObject. Давай подумаем, какие параметры должны быть у игрового объекта? Конечно же, это координаты его размещения на игровом поле, x и y. Ну и куда же без конструктора? После того, как в
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (4/16)
Состояние ячеек игрового поля нужно где-то хранить. Для этой задачи создадим матрицу (двумерный массив) с размерами игрового поля. Чтобы увидеть состояние игры на экране, нам нужно передать в отображение данные из матрицы. Отображение отвечает только за визуальную информацию и смысловой нагрузки не
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (5/16)
Игра "Сапер" не зря так называется. Игроку нужно будет иметь дело с минами, хотя лучше с ними дела не иметь :) Давай введем в игру эти самые мины. Для этого в класс GameObject внесем изменения, которые учитывают, что ячейка может быть миной — это флаг isMine. Новый конструктор создавать не нужно: д
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (6/16)
Теперь давай займемся подсчетом мин в соседних ячейках. Для этого каждой ячейке матрицы добавим параметр (поле класса), который отвечает за количество "заминированных" соседей. Для начала найдем всех соседей, а потом посчитаем, сколько из них "заминированы". Для этого создадим метод getNeighbors, в
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (7/16)
На данном этапе мы займемся открытием ячеек. Давай создадим метод, отвечающий за это, и переменную, которая будет хранить состояние ячейки (открыта или нет). При открытии ячейки метод будет: - рисовать в ячейке мину, если там мина; - отображать количество мин-соседей, если в ячейке нет мины; - отме
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (8/16)
Согласно правилам игры, в помощь игроку даются флаги. Они нужны, чтобы помечать потенциально "заминированные" ячейки. Поэтому количество флагов countFlags должно равняться количеству мин countMinesOnField. Флаг нужно как-то показывать на игровом поле. Для этого создадим переменную-константу, котора
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (9/16)
Согласно правилам игры, при открытии ячейки, количество "заминированных" соседей которой равно нулю, открывается некоторая "не заминированная" область до ячеек с "заминированными" соседями. Давай это реализуем... Предлагаю использовать рекурсию. Ее применяют тогда, когда алгоритм решения задачи сов
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (10/16)
Теперь давай займемся реализацией метода, который отвечает за маркировку ячейки флажком. Метод назовем markTile. Он должен: - отмечать ячейку на игровом поле флагом или снимать флаг; - следить за количеством флагов; - заниматься отрисовкой и стиранием флагов на игровом поле; - менять цвет ячейки по
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (11/16)
Практически в любой игре игрок либо выигрывает, либо проигрывает. Давай для начала реализуем проигрыш. Для этого нам пригодится метод gameOver(), который будет останавливать игру и сообщать игроку о проигрыше. Для вывода сообщения игроку в движке предусмотрен метод showMessageDialog(). Чтобы контро
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (12/16)
Ячейку можно открыть только раз. Если ячейка отмечена флагом, она не должна открываться. Ну и, конечно же, ячейки не должны открываться после того, как игра была остановлена. Давай учтем все эти моменты в методе openTile(int, int). Теперь нужно убедиться, что все работает корректно — запусти игру и
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (13/16)
Игра считается выигранной, когда количество оставшихся закрытых ячеек равно количеству мин. Для подсчета числа закрытых ячеек введем дополнительную переменную, значение которой изначально равно общему количеству ячеек на игровом поле. Значение этой переменной будет уменьшаться по мере открытия ячее
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (14/16)
Согласись, без счета играть не очень интересно. Давай добавим этот функционал в нашу игру. Нам понадобится переменная для учета очков. При открытии ячейки без мины счет увеличивается на 5 очков. Чтобы счет отображался на игровом поле, нам нужно воспользоваться специальным методом setScore() класса
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (15/16)
Как известно, настоящий сапер ошибается только один раз. Но, к счастью, у нас есть право на ошибку, и даже не одну. Давай реализуем механизм рестарта игры. Для этого создадим метод restart(), в котором будем запускать игру, сбрасывать в исходное состояние количество закрытых ячеек, мин на поле и
undefined
3
Задача
Games, 0 уровень, 0 лекция
Недоступна
Игра сапер (16/16)
Квест "Games", игра "Сапер": наши поздравления: игра написана! Предлагаем запустить ее и посмотреть, что получилось. Если есть время и вдохновение, можешь улучшить игру, добавив некоторые "фичи" от себя. Например: ограничить количество ходов, сделать так, чтобы первый ход никогда не попадал на мину...