Russian Minesweeper — мультиплеерная версия игры «Сапёр»

в 15:27, , рубрики: ASP.NET, C#, json, mineswiper, multiplayer, swiper, WebSocket, мультиплеер, сапёр, я пиарюсь, метки:

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.

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

  • Аккорд — открытие более одной клетки за ход. Это возможно в случае клика (ЛКМ) по цифре в клетке на игровом поле, а кол-во флагов вокруг смежных клеток равно искомой цифре.
  • Помощь оппоненту — по средней кнопки мыши, либо [щелчок по нику оппонента сверху+клик по нужной клетке].
  • Чат — между игроками в режиме реального времени.
  • 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, а также есть сообщество во «ВКонтакте».

Спасибо за внимание,
с Вами был Петр.

Автор: ParadoxFilm

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js