Домашнее задание №12

Тема: текстовая игра в жанре MUD

Когда-то давно, когда компьютеры были большими, интернет - медленным, а графических ускорителей не было вовсе, уже существовали многопользовательские игры. Они имели текстовый интерфейс и назывались MUD, Multi User Dungeon.

Мы пишем простую игру, которая реагирует на команды игрока. В домашке будет асинхрон и работа с состояние сервиса. Это полезно, когда вы пишете не stateless веб сервисы. А, например, движок чата.

Игровой мир обычно состоит из комнат, где может происходить какое-то действие. В комнатах может быть несколько игроков (представляйте как аналогия групп в чатах, только тут 1 игрок одновременно в одной комнате, а не как в чате во многих).

В игре есть небольшое количество различных команд, они влияют на игровой мир, например:
* "сказать" - транслируется всем другим игрокам в этой комнате
* "сказать_игроку" - отправляет персональное сообщение другому игроку, остальные его не слышат
* "осмотреться" - выводит состояние комнат и можно увидеть другого игрока

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

Команда в handleCommand парсится как
$команда $параметр1 $параметр2 $параметр3
https://golang.org/pkg/strings/#Split вам в помощь

В тестах представлены последовательности команд и получаемый ответ.
Задача - пройти все тесты и сделать правильно.
Под правильным понимается универсально, чтобы можно было без проблем что-то добавить или убрать.
Т.е. бесконечный набор захардкоженных if'ов для всего мира не подойдёт. Да и будет тяжело его реализовать для случая со множество мигроков.
Конкретные условия могут быть только внутри конкретной комнаты.
Надо думать в сторону объектов, вызова функций, структур, которые описывают состояние комнаты и игрока, функций которые описывают какой-то интерактив в комнате. Не забывайте что вы можете создать мапу из функций. Или можно реализовать триггер (действие, выполняемое при каком-то событии). Или у структуры поле может иметь тип "функция":

```
type XXX struct {
    action func(param string) string
}
```

Тестовых кейсов много. Прочитайте их внимательно, там есть результаты работы всего что вам надо.
Хитрой логики тут нет, алгоритмов тоже. Только вызов методов, сохранение состояния, условия. Разве что с рейсами придется немного повозиться :)

Некоторые вещи в игре сознательно сделаны нелогичными. Это направлено на то чтобы пописать побольше кода.

В идеале ваша архитектура с комнатами должна без проблем прежить добавление дополнительных комнат.
Логика комнаты должна быть сосредоточена только в месте ее объявления. Это значит что в общих методах не должно быть никаких `if room.Name == "кухня"`. Для кастомной логики используйте поле-функцию.

Код надо писать в main.go, если требуется, main_test.go править не надо. На сервер в авто-грейдер надо грузить один файл `game.go`

Запускать тесты через `go test -v -race` находясь в папке c заданием.