Как сделать сапера в блокноте

Добавил пользователь Morpheus
Обновлено: 05.10.2024

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

Для меня первой написанной игрушкой стал сапер – логика игры проста, серьезной графики не требует, реализовать можно с помощью стандартных элементов.

Прежде чем начинать кодировать, набросаем планчик.

Должна быть возможность задавать количество строк и столбцов поля

Установка количества мин.

Реализация логики игры:

- “Засев” поля минами

- Визуальная обработка касания ячейки – один тап – открываем ячейку, длинный тап – ставим/снимаем флажок

- Одиночный тап – проверка состояния – Есть мина – выдаем звук взрыва – открываем все поле, Ячейка пуста – проходим по полю – открываем пустые ячейки возле нажатой, ячейка с цифрой – просто открываем ячейку

- Долгий тап – ставим флажок, проверяем, помечены ли все мины, если да – победа.

В программе будет две activity – установки параметров поля и само игровое поле. Для реализации игрового поля напрашивается использование GridView.

Создаем проект Mines, делаем 2 xml фйла - main.xml, field.xml

В первом файле задаем поля ввода, поясняющие надписи и кнопочку

Все просто. Текст соответствующего файла MinesActivity.java:

Как видите – ничего заумного. Получили данные, проверили, если все в порядке – переходим к игровому полю.

Разработка игры "Сапер" с расположением мин на основе нескольких методов генерации случайных чисел. Проектирование интеллектуальных систем. Интерфейс компьютерной игры. Свойства компонента TLabel. Реализация игры посредством использования языка Delphi.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 06.06.2012
Размер файла 1,1 M

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

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

1. Проектирование интеллектуальных систем

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

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

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

Интерфейс программы был создан с помощью стандартной библиотеки SDL.

Для реализации интерфейса игры в данном пункте используются следующие компоненты:

Содержание

Шаблоны

Шаблон это — стандартная комбинация чисел, которая имеет только одно решение. Если шаблоны запомнить, это избавит от лишних затрат на обдумывание.



























Угадывание


Пример A: Не нужно зря заниматься угадыванием. Сначала достаточно открыть две внешние клетки. Кликая по третьей клетке, можно увидеть результат клика по первой.


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


Пример C: Не гадая, здесь не найти мин, но можно раскрыть безопасные синие клетки. Если за ними — единички, можно раскрыть оранжевые клетки и т.д., и, возможно, раскроется всё поле.


Следует помнить ещё об оной важной вещи — о полезности. Если два решения выглядят равными, выбирайте то, которое будет более полезным в случае, если оно окажется правильным. Иногда одно решение избавляет от дополнительных догадок или приводит к более простому расположению мин. Обычная ошибка — угадывать 33/66, а не 50/50, вместо того, чтобы решить его. Например, если известно, что за тремя клетками находится одна мина, не нужно открывать среднюю!

Следующий пример демонстрирует предыдущие утверждения. Тут, похоже, присутствуют три неизбежных угадывания 50/50 и два 66/33. Одной из стратегий может быть по-быстрому угадать и надеяться на лучшее. Если выживите, это увеличит ваш рейтинг.

Выбор стратегии угадывания это — выбор между количеством выигранных игр и рекордами по времени.




Первый клик

Наибольший шанс имеет поиск по углам, затем по краям, а после этого — посреди поля. Emmanuel Brunelliere (Франция) вычислил теоретические шансы:

Новичок Любитель Профессионал
Угол 59.54% 59.94% 49.94%
Край 42.14% 42.61% 31.42%
В поле 25.09% 25.54% 15.69%

Новичок Любитель Профессионал
Угол 50 - 60 % 50 - 60 % 40 - 50 %
Край 34 - 42 % 36 - 43 % 25 - 32 %
В поле 19 - 24 % 21 - 26 % 12 - 16 %

Новичок Любитель Профессионал
Угол 18 27 16
Край 20 - 24 31 - 42 19 - 26
В поле 23 - 32 35 - 66 23 - 41

В общем случае, лучшее место зависит от предпочтения по размеру или частоте. Бо́льшее количество открытий — проще, но приводит к бо́льшему количеству проигрышей.



Эффективность

Меньше кликов — раньше финиш. Учитесь быть эффективным.

Игра заканчивается, когда раскрыты все безопасные клетки, а не тогда, когда помечены все мины. Новички часто тратят время на пометку каждой. Единственная причина отмечать флажком — пометить рядом стоящие клетки аккордом. Перед тем как поставить флажок стоит подумать, насколько это полезно.




Здесь нет причины отмечать розовые клетки, потому что эта связка всё равно не пригодится для аккорда.

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

Вот несколько примеров эффективной расстановки флажков:


Можно выставить флаги на всех трёх минах и сделать аккорд на двойках, но эффективнее будет расставить флажки как показано и сделать аккорды на однёрках.


Можно отметить обе мины, но полезнее отметить внешнюю мину, как это показано, и сделать аккорд на однёрке.


Отметьте флажком как это показано и сделайте аккорд на однёрке выше. Здесь нет необходимости трогать остальные клетки.


А вот примеры эффективного использования техники NF:






Пример a: Эффективный флаггер выставит один флажок и сделает аккорды по розовым клеткам. Затем сделает клик по жёлтой клетке. Всего — 4 клика. (Если отмечать флажком все мины, понадобится 8 кликов).


Пример b: NF-игрок может кликнуть жёлтую клетку в надежде, что откроются голубые. Затем кликнуть две пурпурные. Всего — три клика с открытием или шесть — без.


Пример c: NF-игроки кликнут жёлтую клетку. Если она пуста, то откроются, как минимум, голубые. Но они открываются не всегда. В этом случае приходится кликать все покрашенные клетки. Количество кликов варьируется от одного до шести.


Пример d: флаггеры поместят один флаг и сделают аккорд на однёрке. Если произойдёт открытие, откроются все голубые и зелёные клетки. Если этого не произойдёт, откроются голубые, а по зелёным придётся кликать. Всего кликов — от двух до пяти.

Самый важный приём для увеличения скорости решения — меньше перемещать мышь. На это требуется время. Начинающие вместо движения к цели следят за мышью. Следующая стадия в уменьшении перемещений — оценивать уже решённое поле. Часто это позволяет принять решение о месте, куда следует поместить мышь. Например, если мышь в примере b ниже находится рядом с двойкой, можно пометить красную клетку и сразу сделать аккорд. Это очевидно для профессиональных игроков, потому что у себя в голове они уже приняли решение о состоянии соседних клеток. Новичок же будет метаться туда–сюда. Красная клетка в примере b может быть решена похожим образом. Меньше перемещений — лучше результат.


Пример a: красную клетку можно просто пометить как мину, потому что игрок думает на несколько ходов вперёд.


Пример b: красную клетку можно просто пометить как мину, потому что игрок думает на несколько ходов вперёд.

Лучший способ улучшить эффективность — играть медленно. Нужно искать наиболее эффективное решение и способ перед тем, как нажимать какую-либо кнопку. Улучшения станут заметны позднее при игре на полной скорости.

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

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

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

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

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

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

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

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

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

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

Ячейки

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

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

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

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

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

UPD: исходники выложены на GitHub

Классический сапёр на html5 и LibCanvas

6242aa2da8b1002ad0891b027cc282ed

В этой статье я пошагово расскажу, как писать самый обычный, классический сапёр при помощи Html5 Canvas, AtomJS, и тайлового движка LibCanvas.

Отрисовка

Во время игры мы можем видеть такое:

1. Числа от 1 до 8.
2. Закрытая ячейка
3. Открытая, но пустая ячейка
4. Флажок

После её окончания — следующее:

1. Все мины
2. Если подорвались на одной из них — она выделена
3. Если где-то неверно поставили флаг

Итого, 8 + 3 + 3 = 14 разных состояний. Опишем их все:

Теперь по очереди добавляем методы отрисовки. Пустая клетка — просто красим:

Мина и флаг — это просто картинки на пустой клетке:

Мина, на которой мы подорвались отрисовывается с красным фоном:

Закрытая ячейка отрисовывается тоже достаточно просто — градиент от тёмного к светлому, с верхнего-левого угла в нижний-правый.

Наша реализация позволяет нам менять размер ячеек и они будут в любом случае отлично выглядеть:

b124ff1e91a22fad7c68c04a8e56e07f

Генератор мин

Как видим, отрисовка полностью готова. Теперь нам достаточно сделать простое действие и клетка поменяет свой внешний вид.

Удалим наш дебаг-код и создадим инстанс генератора:

Для начала научимся разбрасывать по полю мины. Конечно, было бы неплохо учитывать всякие сомнительные ситуации, но пока у нас для него одно требование — сгенерировать поле после первого клика пользователя, так, чтобы тот не попадался сразу же на мину.

4deeede8a775c77b53bbaf4561dd8163

Следующий шаг — это добавить api-метод, который будет вызываться для генерации этих мин и заносить их в индекс для быстрого доступа. Создадим двумерный хеш со значениями 1, где мина есть и 0, где мины нету. Нам важно использовать именно Integer, причину мы увидим ниже. Теперь у нас есть быстрый метод isMine для определения, есть ли мина по координате. Метод isReady будет использоваться, чтобы узнать внешним классам, сгенерировано ли уже минное поле.

Следующий шаг — сделать получение значения клетки, если там мины нет. Алгоритм очень прост — берём всех соседей, которые не выходят за рамки поля, считаем суму их значений. Именно в этом месте то, что мина есть Integer нам и пригодилось.

Взаимодействие с пользователем

Теперь опишем открытие клетки. Для начала, открываем только те клетки, которые закрыты. Нечего взаимодействовать с всякими статичными цифрами и флагами. Во-вторых, проверяем, готовы ли наши мины и, если нет — запускаем генератор.

Проигрышь отображаем так — проходим все клетки, где у нас было закрыто и на самом деле была мина — отрисовываем мину. Где у нас стоял флаг, а на самом деле мины нету — отображаем ошибку. Так же блокируем методы open и close после проигрыша.

56762b32c5c67733cb4c0879c1301fa3

Победа!

Играть в сапёр

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