Как сделать сапера

Добавил пользователь Валентин П.
Обновлено: 28.08.2024

сапёр на JavaScript

В этой статьи вы прочитаете, как сделать игру сапёр на JavaScript, но нужно предупредить, что этот код сделал не я, а был взять с сайта codepen.io у пользователя creme, поэтому если нужен оригинал, заходите к нему.

Также что бы понимать написанный тут код, стоит знать стандарты языка JavaScript ECMAScript 6 и Buble.

Создаём сапёр на JS:

Перейдём к созданию, но для начала нужно создать HTML документ, в котором и будет рендерится игра.

В HTML нет не чего сложного, тут создаём элемент для рендеринга поля и подключаем скрипт с нашем кодом.

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

JavaScript:

Как говорилось выше я не буду особо сильно описывать код, так как, тут он очень сложный и если всё объяснять, то получится очень длинный текст.

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

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



Как будем ее программировать? Изначально перед нами пустой текстовый файл. И мы вначале пропишем функцию запуска игры в целом:

Далее, вызываем эту функцию:

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

для просмотра этой подсказки. Рекомендуется такие комментарии писать во всех ключевых функциях проектируемой программы.

Далее, программист решает: ага, нужна вспомогательная функция для отображения игрового поля и выше определяет ее:

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

Затем, на этом же уровне проектирования нам, очевидно, понадобится функция для ввода координат клетки игроком:

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

Все, мы определили необходимые вызываемые функции и теперь подумаем: как их вызывать в функции верхнего уровня startGame? Очевидно, должен быть цикл, в котором будет происходить последовательный их вызов. Допустим, мы это делаем самым простым образом, вот так:

Отлично, общий вид программы у нас определен:


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


Одно из них пусть называется PM, а второе – P. Далее, нужно решить где создать эти переменные: внутри функции startGame или глобальными в начале текста программы. Так как глобальных переменных в любой программе должно быть минимум, то объявим их внутри startGame:

Здесь у поля P значение -2 будет говорить о том, что клетка еще не открыта. Значение -1 у поля PM – стоит мина, а любое неотрицательное число у обоих списков – открытая клетка без мины и указанием мин вокруг нее.

А вот величину N – размер игрового поля и число мин M на игровом поле, сделаем для простоты глобальными:

Теперь у нас все готово для реализации первой функции createGame. Сначала мы произвольным образом расставим мины на поле PM. И договоримся так: если клетка имеет значение >= 0, то мины в ней нет и число показывает количество мин вокруг текущей клетки. А любое отрицательное значение – мина есть. Для генерации случайных значений подключим модуль random в начале программы:

и далее, запишем реализацию функции createGame. Ей понадобится доступ к переменной PM, добавим ее в качестве аргумента:

и, затем, в самой функции:

Далее, в этой же функции рассчитаем число мин вокруг каждой клетки без мин:

Здесь мы создадим вспомогательную функцию getTotalMines:

Все, наша функция createGame готова. Далее, реализуем функцию show и с ее помощью проверим: правильно ли работает createGame:

И вызовем ее в startGame:

Следующая функция goPlayer будет иметь такую реализацию:

Проверим работу этой функции:

  • 1 – игра продолжается;
  • -1 – игрок наступил на мину и игра проиграна;
  • -2 – игрок открыл все клетки без мин – игра выиграна.

Для реализации функции нам потребуются переменные P и PM:

И окончательно запишем тело функции startGame:

Если теперь запустить игру, то при ее завершении непонятно: выиграли мы или проиграли. Модифицируем немного функцию startGame:

И, далее, ее вызов:

Видео по теме


































































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


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

Коды для игры пасьянс

Во время игры в Пасьянс, мы можем одновременно нажать комбинацию клавиш Alt + Shift + 2 , и мы увидим каскад из карт завершающий игру:

Коды для игры Сапер

Кроме того, для того, чтобы в рекордно короткие сроки выиграть игру, нужно нажать комбинацию клавиш Win и D . Окно игры будет свернуто к минимуму, необходимо вернуться к нему – теперь время в игре будет остановлено.

Коды для игры Солитер

Содержание

Шаблоны

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



























Угадывание


Пример 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: красную клетку можно просто пометить как мину, потому что игрок думает на несколько ходов вперёд.

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

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