Текстовая игра
300-400 строк.
3 недели с момента лекции, на которой была выдана домашка.
В рамках выполнения задачи вы научитесь писать базовый код, поработаете со структурами, методами, функциями, if-ами, map-ами. Никаких дополнительных специфичных знаний вам не потребуется.
Основная цель задания - поупражняться в моделировании объектов.
Когда-то давно, когда компьютеры были большими, интернет - медленным, а графических ускорителей не было вовсе, уже существовали многопользовательские игры. Они имели текстовый интерфейс и назывались MUD, Multi User Dungeon.
Мы пишем простую игру, которая реагирует на команды игрока.
В реализации комнат удобно использовать анонимные функции - смотрите 1/02_functions/2_firstclass.go Так же помните, что поле структуры может быть функцией.
Игровой мир обычно состоит из комнат, где может происходить какое-то действие. Так же у нас есть игрок. Как у игрока, так и у команды есть состояние. initGame делает нового игрока и задаёт ему начальное состояние. В данной версии можно обойтись глобальными переменными для игрока и мира ( комнат )
Команда в handleCommand парсится как
$команда $параметр1 $параметр2 $параметр3
https://golang.org/pkg/strings/#Split вам в помощь
В тестах представлены последовательности команд и получаемый ответ. Задача - пройти все тесты и сделать правильно. Под правильным понимается универсально, чтобы можно было без проблем что-то добавить или убрать. например добавить/убрать двери или еще предметы не меняя ничего в коде, кроме инита игры в initGame. Но это не значит что вам просто весь код надо затолкать в initGame и сделать для каждого помещения отдельную реализацию каждой из возможных команд. Т.е. бесконечный набор захардкоженных if'ов для всего мира не подойдёт. Конкретные условия могут быть только внутри конкретной комнаты. Надо думать в сторону объектов, вызова функций, структур, которые описывают состояние комнаты и игрока, функций которые описывают какой-то интерактив в комнате. Не забывайте что вы можете создать мапу из функций. Или можно реализовать триггер (действие, выполняемое при каком-то событии). Или у структуры поле может иметь тип "функция".
Хардкодом (набором if-ов без нормального моделирования структур) это задание пишется за 3 часа. Но хардкором нельзя! Нормально вдумчиво - чуть дольше.
Глобальная мапа с полной командой от юзера - это тоже считается за хардкод, так делать нельзя
В задании специально некоторые места сделаны нелогичными, не надо писать и просить упростить. Это сделано для того чтобы вы пописали побольше кода и наработали навык.
Тестовых кейсов много. Прочитайте их внимательно, там есть результаты работы всего что вам надо. Не стесняйтесь задавать вопросы. Однако прежде чем спрашивать - попробуйте что-то сделать и четко сформулируйте, что у вас не получается. Хитрой логики тут нет, алгоритмов тоже. Только вызов методов, сохранение состояния, условия.
В идеале ваша архитектура с комнатами должна без проблем пережить добавление дополнительных комнат.
Документация по стандартной библиотеке языка: https://golang.org/pkg/
Код надо писать в main.go, если требуется - можно создавать дополнительные файлы. main_test.go править НЕЛЬЗЯ
Запускать тесты через
go test -v
находясь в папке game
.
дополнительно перед сдачей надо прогнать линтеры(это программа которая проверит качество кода написанного вами). это можно сделать запуском скрипта run_lint, который проверит все папки с домашками, либо запуском по конкретной папке
# для всего
./run_lint.sh
# только для первой домашки
golangci-lint -c .golangci.yml run ./01_intro/99_hw/...
предварительно надо установить golangci-lint. это гуглится и делается в зависимости от платформы (windows/mac/linux/...)