image

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

Если верно помню, то впервые эта игра появилась на операционной системе Windows 3.1 ещё в далеком 1994-ом году. В то время эта игра позиционировалась как средство для обучения использованию компьютерной мыши и в целом графическому интерфейсу ОС. Выглядела она примерно так:

image

Принцип игры согласно Wikipedia
Плоское или объёмное игровое поле разделено на смежные ячейки (квадраты, шестиугольники, кубы и т. п.), некоторые из которых «заминированы»; количество «заминированных» ячеек известно. Целью игры является открытие всех ячеек, не содержащих мины.
Игрок открывает ячейки, стараясь не открыть ячейку с миной. Открыв ячейку с миной, он проигрывает. Мины расставляются после первого хода, поэтому проиграть на первом же ходу невозможно. Если под открытой ячейкой мины нет, то в ней появляется число, показывающее, сколько ячеек, соседствующих с только что открытой, «заминировано» (в каждом варианте игры соседство определяется по-своему); используя эти числа, игрок пытается рассчитать расположение мин, однако иногда даже в середине и в конце игры некоторые ячейки всё же приходится открывать наугад. Если под соседними ячейками тоже нет мин, то открывается некоторая «не заминированная» область до ячеек, в которых есть цифры. «Заминированные» ячейки игрок может пометить, чтобы случайно не открыть их. Открыв все «не заминированные» ячейки, игрок выигрывает.

Однако, время идет, популярность сапера падает, и хочется внести новую жизнь и краски в эту игру. Именно так и родилась мультиплеерная версия игры, именованная как "Russian Minesweeper", которая представляет собой браузерную онлайн игру. Заинтересовавшихся прошу под кат.

Характеристики игры


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

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

Основные правила игры следующие:

  1. Цель игры — первым пометить все мины флагами.
  2. У каждого игрока свои (локальные) флаги.
  3. У игроков одно и тоже (глобальное) поле с минами.
  4. Игроки ходят по очереди (однако, сейчас ведется разработка «параллельного» режима).
  5. Если игрок кликнет по мине, он проиграет, а его оппонент выиграет соответственно.
  6. Время на ход игрока ограничено (~25 сек.) — необходимо ходиться как можно быстрее.
  7. Если игрок пропустит ход три раза подряд, он проиграет, а его оппонент выиграет соответственно.
  8. Если игрок пропустит шесть ходов за все время игры, он проиграет, а его оппонент выиграет соответственно.
  9. Ничья невозможна. Один из игроков в любом случае выставит флаги корректным образом быстрее чем другой.
  10. Первый ход достается случайному игроку.
  11. Игрок может сдаться в любой момент игры.

Также был разработан ряд характеристик минного поля для игры:

  1. Подрыв при вскрытии первой клетки в начале игры невозможен.
  2. Мины равномерно распределены по игровому полю.
  3. Свойства «пустоты», открываемой при первом клике:
    1. Размер от A до B пустых клеток (0 мин вокруг).
    2. Пустота не должна представлять из себя линию открытых клеток только по одной из сторон ориентации.
  4. Процент минных клеток (тип регулятора — вещественный) и размер поля регулируются в настройках приложения.


Таким образом, при текущей конфигурации, при первом клике открывается «пустота» от 3 до 12 «нулевых» клеток, а поле размера 32x20.

Извиняюсь за огромное количество списков, однако, не могу не упомянуть, что игра помимо этого обладает следующим функционалом:

  • Аккорд — открытие более одной клетки за ход. Это возможно в случае клика (ЛКМ) по цифре в клетке на игровом поле, а кол-во флагов вокруг смежных клеток равно искомой цифре.
  • Помощь оппоненту — по средней кнопки мыши, либо [щелчок по нику оппонента сверху+клик по нужной клетке]. Отображается зеленым:
    image
  • Чат — между игроками в режиме реального времени.
    image
  • Nickname в игре.
  • Звуковое сопровождение в игре.

Технологии


Полный список технологий, используемых при разработке продукта, следующий:

  • C# .NET + ASP .NET – основа для веб-сервера.
  • HTML5 / CSS3 – для разработки интерфейса клиентской части.
  • JavaScript – для динамической работы клиентской части.
  • JSON – для сериализации/десераилизации пакетов клиент-сервер.
  • WebSocket – протокол используется как метод связи клиент-сервер.
  • HTML Canvas — технология для отрисовки минного поля.
  • jQuery – эффективное и быстрое взаимодействие между HTML и JS.
  • JSON Newton – библиотека для удобной работы с JSON.
  • Adobe Photoshop – для отрисовки графических элементов интерфейса.
  • GitHub – как удобная площадка для контроля версий проекта.
  • Microsoft Azure – для размещения веб-сервера в Интернете.
  • Яндекс.Метрика – статистика и анализ поведения игроков.
  • CloudFlare – в качестве CDN-прокси / SSL / Anti DDoS.
  • Microsoft Visual Studio – в качестве основной среды разработки.
  • Sublime Text – в качестве инструмента разработки под JavaScript.
  • Microsoft IIS – для разворачивания ASP. NET

image

Самими проблемными местами в проекте было нижеследующее:

  • Синхронизация игроков друг с другом

    • Проблема: как быстро оповещать игроков об изменениях на поле?
      Варианты: long polling; websockets; cyclic polling; etc
    • Решение: использовать WebSocket

  • Отрисовка минного поля и прочих элементов игры

    • Проблема: какие инструменты будут наиболее оптимальны?
      Варианты: HTML table/div; SVG; HTML5 Canvas; etc
    • Решение: HTML5 Canvas + JavaScript

Интересные цифры


  • 23 человека по меньшей мере принимали участие в тестировании.
  • 183 298 клика сделано по полю во время тестирования.
  • С 119-ой попытки минное поле было пройдено до конца.
  • Поле размером 32x20 наиболее оптимально для игры (эмпирическое наблюдение).
  • От 3 до 12 «нулевых» клеток лучше всего открывать при первом клике (эмпирическое наблюдение).

А также прикрепляю карту кликов от Яндекс.Метрики, по ней можно сделать ряд интересных умозаключений. Например очевидно, что основная область «битвы» это центр поля, а чат пользуется популярностью.

image

Планы на будущее


В будущем хочется доделать следующий функционал:

  • Реализовать комнату на N игроков.
  • Возможность создания «дружеской комнаты» (игра с другом по ссылке) и одиночного режима.
  • Регистрация игроков и таблица лидеров.
  • «Баланс по скиллу» (чтобы игроки играли с равными себе по опыту).
  • Оптимизация приложения под мобильные устройства.
  • Переход на более мощные сервера для реализации приложения в массы.
  • Создание баг-трекера.
  • Реализация удобной обратной связи с игроками.
  • Более детальная статистика использования приложения.


Заключение


image
В заключение хочу сказать следующее — будьте, пожалуйста, аккуратнее с сервером игры :)
Он получен бесплатно по подписке от Microsoft Azure и его мощности крайне скромны.
Искренне уповаю на то, что после этой статьи мы с вами вместе сможем насладиться этой игрой.
Напоминаю, что она доступна по адресу https://rmsweeper.tk, а также есть сообщество во «ВКонтакте».

Спасибо за внимание,
с Вами был Петр.
Умеете ли вы играть в классический сапер?

Проголосовало 355 человек. Воздержалось 27 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Поделиться с друзьями
-->

Комментарии (44)


  1. Pro-invader
    14.06.2017 19:18
    +1

    Цель игры — первым пометить все мины флагами и открыть пустые клетки.

    В оригинальном сапере цель открыть все клетки, не содержащие бомбы. Флаги ставить не обязательно. У супер профи одна из быстрейших техник не всегда ставить флаги.
    Эх, сайт не грузится.


    1. ParadoxFilm
      14.06.2017 19:20
      +1

      Алексей, добрый вечер!
      Microsoft Azure, к сожалению, отказался принимать такой поток посетителей. Сейчас переключил игру на платный сервер, должно быть ОК.
      По поводу правил — интересное наблюдение, подумаю над тем, чтобы реализовать выигрыш только по открытию всех клеток. На текущий момент сделал чтобы выигрыш был в тот момент, когда все флажки выставлены корректно (не обязательно открывать все клетки).


      1. fi11er
        14.06.2017 21:19

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

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

        А так все очень круто.


        1. ParadoxFilm
          14.06.2017 21:21

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


      1. bormotov
        14.06.2017 23:12

        не-не-не, когда играют двое, из расстановки флагов можно получать более точную оценку кто лучше играет.

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

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


        1. bormotov
          14.06.2017 23:13
          +1

          и да, конечно общее затраченное на раздумья время тоже как-то можно учитывать в рейтингах


        1. ParadoxFilm
          14.06.2017 23:15

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

          P.S. По поводу общего затраченного времени «на раздумья» тоже мысль уже приходила, наверняка будет реализовано :)


          1. bormotov
            15.06.2017 00:32
            +1

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

            Думаю, по ходу дела, еще может всякое напридумываться, по каким критериям ранжировать.
            Поэтому общая идея такая — все метрики по ходу игры куда-то складывать.

            еще навскидку
            — количество таймаутов
            — сколько раз сдавался
            — сколько ходов сделал до выигрыша
            — сколько ходов «продержался», максимум, минимум, среднее

            в общем, казалось бы, такая простая игра, но перевод её в многопользовательскую открывает бездны :)

            Одна беда со всем этим — достаточно просто пишутся боты, да и математика для бота не сильно сложная. По ходу игру совсем примитивная-локальная, в «сложных» — посчитать вероятности…

            В любом случае — спасибо, вспомнил юность, залип на час

            — а если сделать командную… :))))


            1. ParadoxFilm
              15.06.2017 00:46

              У вас отличные предложения по поводу метрик, все из них действительно стоит учитывать :)
              По поводу ботов — они пишутся достаточно просто, но не считаю это бедой. Разве что с целью выйти в топ, но там уже можно будет блокировать если будет угодно в ручном порядке. На текущий момент всякого рода помощники никак не запрещены.
              Командные игры тоже интересная штука, но это когда в глобальном будущем.
              Спасибо!


              1. bormotov
                15.06.2017 00:49
                +1

                Боты, увы, это самый очевидный «ответный шаг», как только будет рейтинг, и этот ответ обесценит сам рейтинг.

                А сейчас еще модно нейронки тренировать, не удивлюсь если кто-то решит сделать бота на модных технологиях :)


  1. John_SC
    14.06.2017 19:21

    Подрыв при вскрытии первой клетки в начале игры невозможен.
    Так и в оригинальной версии также


    1. ParadoxFilm
      14.06.2017 19:21
      +1

      В версиях до Windows Vista (навскидку) можно было подорваться уже на первой мине.


      1. Pro-invader
        14.06.2017 19:45

        Нельзя было. Мина переставлялась в любом случае.


        1. ParadoxFilm
          14.06.2017 20:37

          image


          1. Light_Metal
            14.06.2017 20:51

            Старый фейк же…


      1. dead_man_2000
        14.06.2017 22:12

        нельзя было ни в одной версии на винде. https://habrahabr.ru/post/131117/


  1. oleshko
    14.06.2017 20:28

    На githab выложишь?


    1. ParadoxFilm
      14.06.2017 20:35
      +3

      Алексей, добрый вечер.
      На GitHub проект есть, но репозиторий на текущий момент закрыт.
      Совершенно не исключено, что в ближайшее время он будет открытым.


  1. jaguard
    14.06.2017 20:29

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

    В десятке тестовых игр исход определялся за 5 ходов. Иногда за 2.


    1. ParadoxFilm
      14.06.2017 20:44

      Павел, здравствуйте!
      Есть бета-режим с параллельной игрой, но среди тестеров он не сыскал особой популярности, решили откатиться на пошаговую версию.
      Таким образом, и три ошибки делать тоже не стоит. Ведь игра идет на «выбывание».
      Даже название игры «Russian Minesweeper» является отсылкой к «Русской рулетке».

      P.S. Однако, в будущем, вполне вероятно что будут доступны оба режима для игроков.
      P.P.S. Не понял, по какому принципу вы определяли «исход» игры. Это невозможно по той причине, что вы просто можете пропустить свой ход (если не знаете куда ходить), а другой игрок «авось» сходится и взорвется.
      В любом случае большое спасибо за грамотный комментарий.


      1. jaguard
        14.06.2017 20:58

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


        1. ParadoxFilm
          14.06.2017 21:19

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


  1. jaiprakash
    14.06.2017 23:03

    «Баланс по скиллу» есть?


    1. ParadoxFilm
      14.06.2017 23:05

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


  1. RealSaniok
    15.06.2017 03:06

    В MSN messenger'е был встроенный сапёр на двоих под названием «Minesweeper Flags»

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

    В своё время реализовывал его подобие в виде плагина к клиенту джаббера


    1. ParadoxFilm
      15.06.2017 03:13

      Александр,
      Очень интересная информация, смог найти в Play Market игру с одноименным названием.


      1. RealSaniok
        15.06.2017 18:46

        Оно.
        Только раньше «бомбы» бесплатные были… и трава зеленее


        1. ParadoxFilm
          15.06.2017 19:00

          Могу добавить лишь следующее: проект Russian Minesweeper не предполагает коммерческую реализацию в виде платных "бомб" и тому подобное.


  1. Lerk
    15.06.2017 13:46

    Было бы здорово, если б было ранжирование по силе игрока. Все таки играть против людей, которые сливаются на пятом шаге надоедает. И еще неплохо иметь «хардкор» режим — прошляпил 25 секунд — стата(она же будет?) аккаунта в ноль. Классная штука, но опасная — залип на 15 минут, а надо работать :)


    1. ParadoxFilm
      15.06.2017 17:19

      Ранжирование добавится вместе с регистрацией.
      На счет хардкор-режима нужно будет подумать.
      Спасибо за отзыв!


  1. bambruysk
    15.06.2017 17:20

    https://play.google.com/store/apps/details?id=com.jimmyinteractive.minesweeper

    http://armorgames.com/minefield-online-game/18125

    Мультиплеерная, со многими игроками, и в реальном времени версия сапера.


    1. ParadoxFilm
      15.06.2017 17:21

      Minesweeper.io рассматривалась как аналог при начале разработки приложения.
      Однако, концепция там совершенно иная — нельзя взорваться окончательно, поле гигантское и игроков тоже море в режиме параллельной игры. Добавлены странные не родные элементы игры, а выигрыш рассчитывается по очкам. Это лишь малый список отличий.


      1. DmOsinkin
        16.06.2017 15:22
        +1

        Согласен, приверженность классике играет вам на руку. Советую и дальше придерживаться канона, людей больше подтянется из чувства ностальгии. Может и io-шникам утрёте нос)


  1. eisaev
    16.06.2017 15:21

    Меня с ходу назвали читером :)


    1. ParadoxFilm
      16.06.2017 15:26

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


      1. eisaev
        16.06.2017 17:51

        Спасибо за игру. Жду регистрации и статистики.


        1. ParadoxFilm
          16.06.2017 19:18

          В ближайшее время!
          Следите за новостями в группе во «ВКонтакте» — vk.com/rmsweeper


          1. eisaev
            16.06.2017 23:01

            «Server Error in '/' Application.»


            1. ParadoxFilm
              16.06.2017 23:48

              Временный сбой при обновлении ресурсов приложения. Повторюсь, за оперативной информацией следите в группе.


  1. Strav7
    16.06.2017 23:49

    Уважаемый автор! Вы дали ссылку на Windows NT 3.1, а не Windows 3.1 что совершенно разные системы хотя и с одинаковым интерфейсом. Windows 3.1 вышла не в 1994-м а в 1992-м что можно узнать из той же Википедии. И касательно сапера в составе Windows: https://en.wikipedia.org/wiki/Microsoft_Minesweeper


    1. ParadoxFilm
      16.06.2017 23:49

      Спасибо, исправил.


  1. YellowRaven
    18.06.2017 22:51
    +1

    Очень интересен был клон Сапёра с тремя типами мин, которые имели разные веса. Это очень сильно увеличивало количество комбинаций и сложность игры. К примеру, если в клетке стоит число три, то это может означать, что данную клетку может окружать три одинарных мины, одна одинарная и одна двойная или одна тройная. Не помню названия… MegaMiner или что-то в этом роде.


    1. Light_Metal
      19.06.2017 15:41

      Сурово… Я как-то нашел 3D сапёра. Что-то вот такое


      1. YellowRaven
        19.06.2017 18:02

        Я вот про это говорил:

        Mega Miner
        image