Как собрать электронный конструктор как работает сапер

Обновлено: 02.05.2024

Для работы с графикой создадим отдельный класс — GUI. От него нам потребуется хранение всех графических элементов управления (т.е. полей клеток), определение элемента, по которому пришёлся клик и передача ему управления, вывод графических элементов на экран и управление основными функциями OpenGL.

Благо класс GUI будет взаимодействовать с графическими элементами, нам нужно создать интерфейс (писать классы сетки, клеток и прочую механику пока рано), который определит, что это такое. Логика подсказывает, что у графического элемента должны быть:

  • Внешний вид (текстура);
  • Координаты;
  • Размеры (ширина и высота);
  • Метод, который по переданным координатам клика определит, попал ли клик по элементу;
  • Метод, который обработает нажатие на элемент.

Таким образом, пишем:

В GUI должны храниться ячейки поля. Создадим для этих целей двумерный массив:

GUI должен передавать клики элементам, которые он содержит. Вычислить адрес клетки, по которой кликнули, нетрудно:

Теперь разберёмся с основными функциями OpenGL. Во-первых, нам нужна инициализация.

На этом мы подробно останавливаться не будем, т.к. изучение LWJGL не входит в наши сегодняшние планы. Во-вторых, нам нужно обновлять изображение на экране:

И, наконец, нам нужно это изображение вообще рисовать. Для этого пора закончить enum Sprite. Его элементы будут представлять из себя обёртку для текстуры с удобочитаемыми именами.

Теперь мы можем написать метод для GUI, который будет рисовать элементы:

Нам осталось только сделать единый метод для инициализации графики, и остальное мы будем писать в основном управляющем классе, возвращаясь сюда, только чтобы внести незначительные изменения.

Ячейки

Создадим класс Cell, реализующий интерфейс GUIElement. В методах getWidth() и getHeight() вернём константу, для координат придётся создать поля, которые будут инициализироваться конструктором. Так же конструктором будем передавать состояние клетки: «-1», если это мина, «-2», если это взорванная мина, число мин поблизости в остальных случаях. Для этой цели можно было бы использовать enum, но число мин удобнее передавать как integer, имхо. Итак, конструктор:

Ещё два поля — boolean isMarked и boolean isHidden будут отвечать за то, отметили ли клетку флажком, и открыли ли её. По умолчанию оба флага выставлены на false .

Разберёмся с методом getSprite() .

В случае, если на кнопку нажали, нам снова необходимо рассмотреть несколько простейших случаев:

Чтобы при поражении клетки можно было вскрыть, добавим метод:

Для более удобной реализации генератора добавьте ещё и этот метод:

Вернёмся к методу GUI.receiveClick() . Теперь мы не можем просто вернуть результат назад, т.к. если результат выполнения — единица, то нам нужно открыть соседние ячейки, а в главный управляющий класс вернуть уже ноль, в знак того, что всё прошло корректно.

Пишем генератор

Задачка эта не сложнее, чем создать массив случайных boolean-величин. Идея следующая — для каждой ячейки матрицы мы генерируем случайное число от 0 до 100. Если это число меньше 15, то в этом месте записываем в матрицу мину (таким образом, шанс встретить мину — 15%). Записав мину, мы вызываем у всех клеток вокруг метод incNearMines() , а для тех ячеек, где клетка ещё не создана храним значение в специальном массиве.

Главный управляющий класс и ввод

Создадим класс Main, в нём входной метод — public static void main(String[] args) . Этот метод должен будет делать всего две вещи: вызывать инициализацию GUI и циклически вызывать рабочие методы ( input() , GUI.draw() и GUI.update() ), пока не получит сигнал закрытия.

Здесь нам не хватает метода input() , займёмся им.

Метод GUI.gameover() будет просто вызывать метод show() у каждой клетки, показывая таким образом всё поле:

image

От переводчика: этот пост — перевод оригинальной статьи Маки Чиза, опытного кодера, который не только пишет классные программы, но и демонстрирует возможности различных языков своим коллегам, как новичкам, так и профессионалам.

«Сапер» — веселая игра, многие из нас в нее играют. Может быть, вы хотите сделать «Сапера» сами?

Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».

Уникальность игры в том, что она очень простая и при этом весьма увлекательная. В «Сапере» нет никакой хитрой геймплейной механики, вы просто нажимаете на квадратики, надеясь, что под ними нет мины.

Предлагаю попробовать написать «Сапера» на Processing. Это отличный инструмент, который позволяет создавать графические приложения на Java. Ссылка на него вот здесь.

Прежде чем начать, скажу, что этот туториал рассчитан на тех, кто уже знает Java. Опыт работы с Processing необязателен.

Итак, начинаем. Первый шаг — определение состояния игры. Я решил реализовать это вот так.


Здесь, кажется, имеет смысл все, кроме вот этого участка: int[][] mines. Почему сетка мин является целым числом, а не булевым? Дело в том, что это позволяет легко подсчитать, сколько мин находится рядом с определенной позицией.


Этот код определяет, сколько мин находится рядом с определенным участком. После того, как мы уберем исключения, мы получим что-то похожее на это:


Главная задача самой игры — раскрывать квадраты, начиная с точки х, у.


В итоге мы имеем следующий алгоритм:

  • Если позиция за пределами поля, end;
  • Если позиция раскрыта, end;
  • Раскрываем текущую позицию;
  • Если у нас бомба рядом с текущей позицией, end;
  • Если мы дошли до этого пункта во время выполнения функции, текущая позиция в пределах игрового поля была обнаружена и рядом с ней нет бомб, открываем смежные квадраты.

Если вы хотите узнать о визуализации, читайте дальше.

Визуализация

Здесь все должно быть понятно, но я объясню сложные части.

Итак, у нас есть переменная cellSize, определяющая количество пикселей в каждом квадрате.


Таким образом мы создаем поле со сторонами gridW x gridH, где размеры каждого квадрата будут равняться значению cellSize.

Затем мы возвращаем переменные в изначальное состояние.


Для инициализации поля:

И далее включаем реакцию на клики мышью.


И функция отображения, вызываем ее один раз для каждого кадра.


И все, вот и наш «Сапер».

Игра выглядит просто, но в целом она полностью функциональна. И помните: «Сапер» вызывает привыкание!


Основа из плотного ламинированного картона. На лицевой стороне изображен красочный сюжет, а на обратной стороне происходит сборка электронной схемы.


Электронные компоненты

В набор входят различные компоненты. Это резисторы, транзисторы, конденсаторы, различные датчики, медный скотч и прочее.


Инструкция

Самая главная часть набора. Что такое электричество? Как работает конденсатор? Это и многое другое описано в книге. Также рекомендуем скачать приложение PinLab для Android.

Описание

Бомба — Совершенно безопасное устройство, по внешнему виду напоминающее бомбу. Красный мигающий светодиод сигнализирует о наличии электрического питания. При извлечении провода раздается звуковой сигнал. Изучается принцип действия транзистора, зуммера и мигающего светодиода.

Полицейская мигалка — мигает красным и синим светодиодами на крыше полицейской машины. Изучается транзистор, конденсатор, светодиод. Рассматривается работа классической схемы мультивибратора (генератор прямоугольных импульсов). Схема работает в автономном режиме.

Набор из серии «Электроника на бумаге» поможет юному исследователю узнать о том, что такое электрический ток. Познакомит с электронными компонентами, такими как резистор, транзистор, светодиод и другие.

Не предназначено для детей младше 3 лет! Содержит мелкие детали! Эксперименты необходимо проводить под присмотром взрослых. Хранить открытую коробку набора вне досягаемости для детей и домашних животных.

На упаковке изображена фантастическая иллюстрация. Хранить в сухом проветриваемом помещении. Внешний вид комплектующих может отличаться от изображения на упаковке

Мой проект игры «Сапер» представляет собой несколько упрощенную версию оригинальной игры. Имеется поле, на котором игроку предстоит найти все мины, которые расставил компьютер.

Игровой процесс

Рисунок 1 - Игровой процесс

Правила игры и алгоритм работы

Рассмотрим правила игры «Сапер». Классический «Сапер» - игра для одного игрока, в которой игрок пытается найти все мины. Если игрок ошибается, то он проигрывает. Цель игрока - найти все мины.

Поле для игры состоит из 5 строчек и 5 столбцов.

Работа приложения

Рассмотрим подробнее, как работает приложение «Сапер». Когда мы запускаем игру, перед нами появляется вот такое окно. Начало игры представлено на рисунке 2.

Начало игры

Рисунок 2 - Начало игры

Первый ход игрока

Рисунок 3 - Первый ход игрока

После чего игра повторно просит игрока сделать ход. Игра продолжится до того момента, пока игрок не допустит ошибку или пока не найдет все мины.

После того как игрок сделал ошибку появляется оповещение о том, что игра окончена. Это представлено на рисунке 4.

Игра завершилась проигрышем игрока, чтобы начать игру заново, нужно ввести «а»и нажать клавишу Enter. Процедура представлена на рисунке 5.

Начало новой игры

Рисунок 5 - Начало новой игры

В игре «Сапер» компьютер при каждой новой игре ставит мины в произвольные места.

За интеллект компьютера отвечает следующая функция:

Функция, записанная ниже создает поле из нулей:

Функция ниже это условие проигрыша игрока:

printf ("BbI npourpaLu! ");

Распечатка видимого поля: for(i=1;i<6;i++)

Функция считает сколько клеток уже прострелено: sh=sh+1;

Если все 20 клеток прострелены, то игрок выиграл: if(sh==20)

Функция ищет мины, которые расположены вокруг:

Функция позволяет увидеть, сколько мин вокруг: a[p+1][u+1]=w;

Для курсовой работы мною был разработан упрощенный вариант игры «Сапер». Игры бывают разные, и стратегии у них разные, у каждой игры она индивидуальная. Для игры «Сапер» главной задачей компьютера является расстановка мин в произвольном порядке

Созданная мной игра является одной из самых примитивных, но в процессе ее разработки, я смог больше узнать о базовых концепциях программирования приложений под операционную систему Windows.

Программирование игр - довольно сложный процесс, и самая большая сложность заключается в том, чтобы запрограммировать компьютер на различные ответные реакции на действия со стороны пользователя. Тем не менее, это довольно увлекательный процесс. Для начала надо на бумаге попытаться написать некий алгоритм действий, который будет выполняться в игре, а затем уже пробовать этот алгоритм изобразить в виде кода.

Разработка программы велась с учетом концепции объектно-ориентированного программирования, поэтому четко определенной последовательности действий в ней нет.

Для успешной работы автоматизированной системы применялись стандартные визуальные компоненты среды программирования Visual Basic for Applications следующих классов:

1) ListBox - предоставлял пользователю выбрать значения;

2) Label - использовался для обозначения некоторых данных;

3) CommandButton - использовался для выполнения команд;

При реализации системы учитывались быстродействие выполнения команд, возможность ее использование на версиях Microsoft Office 2003 и выше.

Работа над приложением начиналась с создания формы «Saper», на которой будет располагаться минное.

Основная форма

Рис. 1 Основная форма

Для начала работы с программным приложением необходимо запустить файл «Сапер. Saper.xls».

После запуска программы перед пользователем появляется основная форма (рис. 1). Для того, чтобы начать игру, необходимо выбрать в предложенном списке количество мин, от которых зависит уровень сложности игры. (рис. 2).

Выбор уровня сложности

Рис. 2 Выбор уровня сложности

При выборе команды «Новичок» появляется минное поле размером с 40 минами, «Средний» - с 50 минами, «Профи» - с 60 минами. Чтобы начать новую игру можно воспользоваться командой «Новая игра».

Цель игры: найти пустые ячейки, но не трогать ячейки, содержащие мины.

Правила игры «Сапер» очень просты:

- Если открыта ячейка с миной, игра проиграна.

- Если открыта пустая ячейка, игра продолжается.

- Если в ячейке указано число, оно показывает, сколько мин скрыто в восьми ячейках вокруг данной. Это число помогает понять, где находятся безопасные ячейки.

Советы и подсказки:

- отмечайте ячейки с минами;

- изучите возможные сочетания;

- старайтесь открывать закрытые области.

При проигрыше появляется форма о поражении, нажав кнопку «ОК» пользователю предоставляется возможность начать новую игру (рис. 3).

Форма при поражении

Рис. 3 Форма при поражении

Таким образом, логическая игра «Сапер» разработана в соответствии с техническим заданием и соблюдает все его требования.

Руководство пользователя

В настоящее время часто используют эксплуатационный документ, в который отчасти входит руководство системного программиста, программиста и оператора. Этот документ называют руководством пользователя. Появление такого документа явилось следствием широкого распространения персональных компьютеров, работая на которых пользователи совмещают в своем лице трех указанных специалистов. Составление документации для пользователей имеет свои особенности, связанные с тем, что пользователь, как правило, не является профессионалом в области разработки программного обеспечения.

Руководство пользователя - документ, назначение которого - предоставить людям помощь в использовании некоторой системы. Используется стиль и язык, доступный предполагаемой аудитории, использование жаргона сокращается до минимума либо подробно объясняется.

В соответствии с ГОСТом 19.701-90 руководство пользователя должно содержать следующие разделы:

- общие сведения о программном продукте;

- описание логической структуры;

- используемые технические средства;

- описание запуска [3].

Общие сведения о программном продукте. Данная логическая игра «Сапер» может быть предназначена для пользователей разных возрастов. Также приложение может быть использовано учителями во внеурочной деятельности, в целях развития памяти и быстрого мышления детей.

Описание логической структуры. Логическая игра состоит из одной логически самостоятельной части, которая разработана в соответствии с требованиями и условиями, удовлетворяющими запросам каждого из видов работ.

После запуска программы перед пользователем появляется основная форма с минным полем ранга «Новичок» по умолчанию, или минное поле размером последнего использованного пользователем.

Пользователь может сам устанавливать уровень сложности игры, выбрав нужную команду («Новичок», «Средний», «Профи»). При выборе команды «Новичок» появляется минное поле размером с 40 минами, «Средний» - с 50 минами, «Профи» - с 60 минами.

Чтобы начать новую игру можно воспользоваться командой «Новая игра».

Используемые технические средства:

- тип процессора - Intel Pentium и выше;

- видеокарта - 64 Мб;

- оперативная память - не менее 256 Мб;

- место на жестком диске - 256 Мб;

- наличие установленного приложения Microsoft Office Excel;

- устройство чтения дисков - дисковод для компакт-дисков;

- тип манипулятор - мышь.

Описание запуска. Первым этапом любой деятельности является ее начало, в данном случае - это открытие и вход в игру. Для запуска программы необходимо скопировать папку «Сапер» на жесткий диск, затем запустить файл «Saper» с расширением xls.

При возникновении ошибок, сбоев, неполадок в работе с программным продуктом, необходимо обратиться к разработчику. Самим пользователям при обнаружении неполадок ничего изменять не рекомендуется, так как программисту будет сложнее обнаружить причину возникновения ошибки.

Читайте также: