Здравствуйте, уважаемые читатели. Искренне надеюсь, что среди читателей Хабра найдутся любители такой замечательной игры как «Сапёр».
Если верно помню, то впервые эта игра появилась на операционной системе Windows 3.1 ещё в далеком 1994-ом году. В то время эта игра позиционировалась как средство для обучения использованию компьютерной мыши и в целом графическому интерфейсу ОС. Выглядела она примерно так:
Игрок открывает ячейки, стараясь не открыть ячейку с миной. Открыв ячейку с миной, он проигрывает. Мины расставляются после первого хода, поэтому проиграть на первом же ходу невозможно. Если под открытой ячейкой мины нет, то в ней появляется число, показывающее, сколько ячеек, соседствующих с только что открытой, «заминировано» (в каждом варианте игры соседство определяется по-своему); используя эти числа, игрок пытается рассчитать расположение мин, однако иногда даже в середине и в конце игры некоторые ячейки всё же приходится открывать наугад. Если под соседними ячейками тоже нет мин, то открывается некоторая «не заминированная» область до ячеек, в которых есть цифры. «Заминированные» ячейки игрок может пометить, чтобы случайно не открыть их. Открыв все «не заминированные» ячейки, игрок выигрывает.
Однако, время идет, популярность сапера падает, и хочется внести новую жизнь и краски в эту игру. Именно так и родилась мультиплеерная версия игры, именованная как "Russian Minesweeper", которая представляет собой браузерную онлайн игру. Заинтересовавшихся прошу под кат.
Характеристики игры
Разумеется, чтобы какое-то количество игроков смогли вместе играть в эту игру, правила придется каким-либо образом модернизировать и вообще видоизменять. Однако, главное правило — существенный принцип оставить как в оригинале.
Таким образом, собственно, и был разработан комплекс правил, чтобы позволить нескольким игрокам одновременно играть на одном и том же поле.
Основные правила игры следующие:
- Цель игры — первым пометить все мины флагами.
- У каждого игрока свои (локальные) флаги.
- У игроков одно и тоже (глобальное) поле с минами.
- Игроки ходят по очереди (однако, сейчас ведется разработка «параллельного» режима).
- Если игрок кликнет по мине, он проиграет, а его оппонент выиграет соответственно.
- Время на ход игрока ограничено (~25 сек.) — необходимо ходиться как можно быстрее.
- Если игрок пропустит ход три раза подряд, он проиграет, а его оппонент выиграет соответственно.
- Если игрок пропустит шесть ходов за все время игры, он проиграет, а его оппонент выиграет соответственно.
- Ничья невозможна. Один из игроков в любом случае выставит флаги корректным образом быстрее чем другой.
- Первый ход достается случайному игроку.
- Игрок может сдаться в любой момент игры.
Также был разработан ряд характеристик минного поля для игры:
- Подрыв при вскрытии первой клетки в начале игры невозможен.
- Мины равномерно распределены по игровому полю.
- Свойства «пустоты», открываемой при первом клике:
- Размер от A до B пустых клеток (0 мин вокруг).
- Пустота не должна представлять из себя линию открытых клеток только по одной из сторон ориентации.
- Процент минных клеток (тип регулятора — вещественный) и размер поля регулируются в настройках приложения.
Таким образом, при текущей конфигурации, при первом клике открывается «пустота» от 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
Самими проблемными местами в проекте было нижеследующее:
- Синхронизация игроков друг с другом^
- Проблема: как быстро оповещать игроков об изменениях на поле?
Варианты: long polling; websockets; cyclic polling; etc - Решение: использовать WebSocket
- Проблема: как быстро оповещать игроков об изменениях на поле?
- Отрисовка минного поля и прочих элементов игры:
- Проблема: какие инструменты будут наиболее оптимальны?
Варианты: HTML table/div; SVG; HTML5 Canvas; etc - Решение: HTML5 Canvas + JavaScript
- Проблема: какие инструменты будут наиболее оптимальны?
Интересные цифры
- 23 человека по меньшей мере принимали участие в тестировании.
- 183 298 клика сделано по полю во время тестирования.
- С 119-ой попытки минное поле было пройдено до конца.
- Поле размером 32x20 наиболее оптимально для игры (эмпирическое наблюдение).
- От 3 до 12 «нулевых» клеток лучше всего открывать при первом клике (эмпирическое наблюдение).
А также прикрепляю карту кликов от Яндекс.Метрики, по ней можно сделать ряд интересных умозаключений. Например очевидно, что основная область «битвы» это центр поля, а чат пользуется популярностью.
Планы на будущее
В будущем хочется доделать следующий функционал:
- Реализовать комнату на N игроков.
- Возможность создания «дружеской комнаты» и одиночного режима.
- Оптимизация приложения под мобильные устройства.
- Переход на более мощные сервера для реализации приложения в массы.
- Создание баг-трекера.
- Реализация удобной обратной связи с игроками.
- Более детальная статистика использования приложения.
Заключение
В заключение хочу сказать следующее — будьте, пожалуйста, аккуратнее с сервером игры :)
Он получен бесплатно по подписке от Microsoft Azure и его мощности крайне скромны.
Искренне уповаю на то, что после этой статьи мы с вами вместе сможем насладиться этой игрой.
Напоминаю, что она доступна по адресу https://rmsweeper.tk, а также есть сообщество во «ВКонтакте».
Спасибо за внимание,
с Вами был Петр.
Автор: ParadoxFilm