Предыстория
Давно хотелось попробовать написать что-то простенькое на Node и на последней версии Angular. Так, в ознакомительных целях. Посмотреть какие проблемы возникнут и как они будут решаться. Но всё как-то не получалось, в основном потому что не было идеи для подходящего мини проекта. И тут случайно наткнулся на ролик в YT где ребята играли в шпиона.
Для меня это было что-то новое, поэтому для тех кто не знает, вкратце опишу правила. Игра для четырех и более человек, можно меньше, но не будет интересно. В начале игры определяется ведущий, на первый раунд. Ведущий у себя в телефоне находит случайную картинку из интернета и показывает её каждому участнику в закрытую, всем кроме одного. Тот один и будем шпионом в этом раунде. Ему показывается карта шпиона. Шпиона выбирает ведущий и никто кроме ведущего и самого шпиона не знает кто из участников шпион. Выяснить это они должны задавая друг другу вопросы относительно картинки. Ведущий назначает игрока который начинает. Тот выбирает, кого будет спрашивать и задаёт ему вопрос. Игрок отвечает на вопрос и в свою очередь задаёт вопрос другому игроку. Так продолжается пока большинство игроков не сойдётся во мнении, кто из них шпион. Всё это время игроки могут свободно общаться друг с другом. Раунд заканчивается и шпион становится ведущим, до следующего раунда.
И вот она идея для мини проекта! Кто-то из игроков создаёт игру (игровую комнату или game room) другие игроки к ней подключаются, сервер выбирает случайную картинку, случайного игрока - шпиона, и отправляет её всем игрокам кроме шпиона, а шпиону отдельную картинку.
Планирование
Как рекомендуют лучшие практики, перед самой разработкой надо сесть, хорошенько обдумать, проанализировать и выписать всё то, что представляется возможным сделать в системе. Определить сущности - модели с их свойствами (это подлежащие в предложениях) и действия - методы (сказуемые). Это так в теории, на практике же не всегда хватает терпения, поэтому многие детали меняются/добавляются в процессе разработки.
Сказано, сделано. В голове сразу же нарисовались интерфейсы. Но конечно же я отрыл блокнот и старательно начал всё выписывать. Основные сущности: игрок - Player, игровая комната - GameRoom. Методы: создать игру (CreateGame), подключиться к игре (JoinGame), выйти из игры (ExitGame). У GameRoom свойства: название, id, количество игроков, список игроков. Метод: NextRound (как для начала игры, так и для последующих ходов), который отвечает за выбор картинки, выбор шпиона и отправку изображения игрокам.
Создавая игру (GameRoom), будем указывать количество игроков. При этом автоматически ей будет назначен уникальный ID и Title (название), чтобы другие игроки по этому названию могли к ней присоединиться. Как только присоединяется последний игрок, игра автоматически начинается (NextRound). Каждый игрок на своём устройстве (телефоне) видит картинку. У шпиона помимо картинки шпиона должна быть кнопка для следующего хода, которую он нажимает, когда его вычислят.
Вот что у меня получилось в итоге (изначально писал на английском, поэтому оставляю как есть, уж не обессудьте):
Main Functionality
User Interface, Views
Initial screen controls
Create game screen
Join game screen
Waiting (for others to join) screen
Game screen
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
Продолжение следует ...
