Мини-проекты¶
Финал Sprint 0 — два мини-проекта, в которых ты собираешь воедино всё: структуры, методы, слайсы, мапы, циклы, условия. Полных решений здесь нет по делу — это твоя проверка.
Что должен понять¶
- Как разбить задачу на структуры и методы.
- Как держать состояние игры в памяти.
- Как писать
main, который читает ввод и показывает результат. - Что код можно (и нужно) перечитать и упростить перед PR.
Проект 1. Бой роботов¶
Программа моделирует бой между двумя роботами. Каждый робот имеет здоровье, атаку и имя. Бой идёт по раундам, пока у одного из них HP не упадёт до нуля или ниже.
Что должна делать программа:
- Создать двух роботов с разными статами (например через конструктор).
- В цикле раундов: первый бьёт второго, второй бьёт первого.
- Печатать состояние HP после каждого раунда.
- В конце вывести имя победителя.
Что демонстрирует:
- Структуры с полями
Name,HP,Attack. - Метод
Hit(target *Robot)с pointer receiver — здоровье меняется. - Метод
IsAlive() boolс value receiver — только читает. - Цикл
forс условием выхода иbreak.
Скелет (без логики):
type Robot struct {
Name string
HP int
Attack int
}
func NewRobot(name string, hp, attack int) *Robot { /* ... */ }
func (r *Robot) Hit(target *Robot) { /* ... */ }
func (r Robot) IsAlive() bool { /* ... */ }
func main() {
a := NewRobot("R2", 50, 12)
b := NewRobot("C3", 60, 9)
// цикл боя
}
Проект 2. Морской бой (одно поле)¶
Программа держит игровое поле 10×10, на котором стоят корабли. Игрок вводит координаты выстрела, программа печатает «мимо», «попал» или «потоплен». Игра заканчивается, когда все корабли уничтожены.
Что должна делать программа:
- Хранить поле как
[10][10]runeилиmap[Coord]Cell. - Принимать координаты в формате «A5» или «3 7» (любой формат, лишь бы стабильный).
- Не пускать выстрел в одну и ту же клетку дважды.
- Считать оставшиеся корабли и заканчивать игру.
Что демонстрирует:
- Структуру
Coord{X, Y int}или enum-подобный набор констант. - Метод
Shoot(c Coord) Result— изменяет состояние поля. - Использование мапы для запоминания уже простреленных клеток.
- Чтение ввода через
fmt.Scanв цикле.
Расположение кораблей можно зашить руками в коде — генератор не требуется. Цель — не идеальный геймплей, а корректные структуры и методы.
Общие правила сдачи¶
- Каждый проект — в отдельной папке, например
lesson_12/battle/иlesson_13/seabattle/. - В каждой папке свой
main.go. Структуры и методы — в том же файле, пока не научимся раскладывать по пакетам. go fmt ./...перед коммитом.- Один PR на проект.
Критерии приёмки модуля¶
- «Бой роботов» компилируется и доводит бой до победы одного из них.
- «Морской бой» завершается, когда все корабли потоплены.
- В обоих проектах есть структуры и методы (хотя бы один pointer receiver).
- В обоих проектах нет панических выходов за границы слайса/массива.
Поздравляю. Дальше: Sprint 1 — Go basics.