Задачей было спроектировать и реализовать консольное приложение-бот для игры в морской бой с интерфейсом взаимодействия через стандартные потоки ввода\вывода
Правила идентичны классическому морскому бою, за исключением того, что размер поля и количество кораблей может быть произвольным (размеры кораблей соответствуют размерам в классической игре)
Для игры нужны два игрока: master и slave. Master дополнительно устанавливает параметры игры: размер поля и количество кораблей, и сообщает их slave. Далее, оба игрока расставляют свои корабли согласно этим параметрам, и, после начала игры, поочерёдно стреляют друг в друга, по правилам классического морского боя
В приведённой далее таблице указаны команды, их параметры и варианты ответа. Ответ всегда заканчивается символом конца строки. Все команды и ответы печатаются в нижнем регистре.
| Команда | Ответ | Описание |
|---|---|---|
| ping | pong | тестовая команда |
| exit | ok | программа завершается |
| create [master,slave] | ok | создать игру в режиме master или slave соответственно |
| start | ok | старт игры |
| stop | ok | остановка текущей партии |
| set width N | ok/failed | установить ширину поля (N положительное, влезает в uint64_t) |
| get width | N | получить длину поля (N положительное, влезает в uint64_t) |
| set height N | ok/failed | установить высоту поля (N положительное, влезает в uint64_t) |
| get height | N | получить высоту поля (N положительное, влезает в uint64_t) |
| set count [1,2,3,4] N | ok/failed | установить количество кораблей определенного типа (N положительное, влезает в uint64_t) |
| get count [1,2,3,4] | N | получить количество кораблей определенного типа (N положительное, влезает в uint64_t) |
| set strategy [ordered,custom] | ok | выбрать стратегию для игры |
| shot X Y | miss/hit/kill | выстрел по вашим короаблям в координатах (X,Y) (X,Y положительные, влезают в uint64_t) |
| shot | X Y | вернуть координаты вашего следующего выстрела, в ответе два числа через пробел (X,Y положительные, влезают в uint64_t) |
| set result [miss,hit,kill] | ok | установить результат последнего выстрела программы |
| finished | yes/no | окончена ли текущая партия |
| win | yes/no | являетесь ли вы победителем |
| lose | yes/no | являетесь ли вы проигравшим |
| dump PATH | ok | сохранить размер поля и вашу текущую расстановку кораблей в файл |
| load PATH | ok | загрузить размер поля и расстановку кораблей из файла |
- При генерации игры размер карты и количество кораблей должны быть непротиворечивы (размер поля не может быть нулевым, все корабли можно разместить на поле)
- Координаты (0,0) - левый верхний угол
- В игре всегда один игрок master, другой - slave
- Игра не может начаться пока не будут заданы размеры поля и количество кораблей (количество кораблей хотя бы одного типа должно быть больше 0)
- После старта игры размеры поля и количество кораблей не может быть изменено
- Тип стратегии может быть изменен в процессе игры
- Ответы команд win\finished\lose должны быть не противоречивы (например нельзя выиграть или проиграть, если игра не закончена)
- После выстрела программа должна узнать результат строго до своего следующего выстрела (после каждой команды get shot следует передавать команду set result)
- Команда load может быть вызвана до старта игры, тогда она переопределяет правила сгенерированные create (может быть использована для тестов)
