Web игрa Spy на Node.JS, Angular и Websockets (Часть 1)

Предыстория

Давно хотелось попробовать написать что-то простенькое на Node и на последней версии Angular. Так, в ознакомительных целях. Посмотреть какие проблемы возникнут и как они будут решаться. Но всё как-то не получалось, в основном потому что не было идеи для подходящего мини проекта. И тут случайно наткнулся на ролик в YT где ребята играли в шпиона. 

Для меня это было что-то новое, поэтому для тех кто не знает, вкратце опишу правила. Игра для четырех и более человек, можно меньше, но не будет интересно. В начале игры определяется ведущий, на первый раунд. Ведущий у себя в телефоне находит случайную картинку из интернета и показывает её каждому участнику в закрытую, всем кроме одного. Тот один и будем шпионом в этом раунде. Ему показывается карта шпиона. Шпиона выбирает ведущий и никто кроме ведущего и самого шпиона не знает кто из участников шпион. Выяснить это они должны задавая друг другу вопросы относительно картинки. Ведущий назначает игрока который начинает. Тот  выбирает, кого будет спрашивать и задаёт ему вопрос. Игрок отвечает на вопрос и в свою очередь задаёт вопрос другому игроку. Так продолжается пока большинство игроков не сойдётся во мнении, кто из них шпион. Всё это время игроки могут свободно общаться друг с другом. Раунд заканчивается и шпион становится ведущим, до следующего раунда.

И вот она идея для мини проекта! Кто-то из игроков создаёт игру (игровую комнату или game room) другие игроки к ней подключаются, сервер выбирает случайную картинку, случайного игрока - шпиона, и отправляет её всем игрокам кроме шпиона, а шпиону отдельную картинку.

Планирование

Как рекомендуют лучшие практики, перед самой разработкой надо сесть, хорошенько обдумать, проанализировать и выписать всё то, что представляется возможным сделать в системе. Определить сущности - модели с их свойствами (это подлежащие в предложениях) и действия - методы (сказуемые). Это так в теории, на практике же не всегда хватает терпения, поэтому многие детали меняются/добавляются в процессе разработки.

Сказано, сделано. В голове сразу же нарисовались интерфейсы. Но конечно же я отрыл блокнот и старательно начал всё выписывать. Основные сущности: игрок - Player, игровая комната - GameRoom. Методы: создать игру (CreateGame), подключиться к игре (JoinGame), выйти из игры (ExitGame). У GameRoom свойства: название, id, количество игроков, список игроков. Метод: NextRound (как для начала игры, так и для последующих ходов), который отвечает за выбор картинки, выбор шпиона и отправку изображения игрокам.

Создавая игру (GameRoom), будем указывать количество игроков. При этом автоматически ей будет назначен уникальный ID и Title (название), чтобы другие игроки по этому названию могли к ней присоединиться. Как только присоединяется последний игрок, игра автоматически начинается (NextRound). Каждый игрок на своём устройстве (телефоне) видит картинку. У шпиона помимо картинки шпиона должна быть кнопка для следующего хода, которую он нажимает, когда его вычислят.

Вот что у меня получилось в итоге (изначально писал на английском, поэтому оставляю как есть, уж не обессудьте):

Main Functionality

  • Create a game
  • Join the game
  • Exit game
  • Proceed to the next round

User Interface, Views

Initial screen controls

  • Create game button

  • Join game button

Create game screen

  • Auto generated one time title to distinguish between games - text
  • Number of players – input
  • Create – button

Join game screen

  • List of clickable available games to join
  • Back – button

Waiting (for others to join) screen

  • Text message: Waiting for others to join
  • Selected game title

Game screen

  • Random image or
  • Spy image
  • NEXT TURN button, available only for spy player

Game Flow

Actors: U(ser) S(ystem)

Create game scenario

o U: clicks Create game (from initial screen)

o S: view is changed to Create game screen

o S: game title field is automatically created from dictionary

o U: chooses number of players

o U: clicks Create button

o S: game room is created on the server (with the id, name and number of players) and has status open

o S: view changes to Waiting

o S: server generates image url and stores it for the current game room (array or map)

Join game scenario

o U: clicks Join game (from initial screen) 

o S: view is changed to Join game screen

o S: shows the list from the server of available open game rooms

o U: select the game to join from the list (or goes back)

o S: view is changed to Waiting


o S: server check whether to close the room or leave it open, depends on number of players

o S: if this is the last player, then 

- server changes the room status to closed

- starts the game for all players

Start game scenario (also applies to Next round)

o S: randomly chooses the spy player

o S: randomly chooses the image

o S: sends the image url to all players

o S: view is changed to Game

o All the players except spy one are shown the same image

o Spy player is shown a spy image with the NEXT TURN button

Продолжение следует ...

Leave a Reply

Your email address will not be published. Required fields are marked *