Перейти к содержанию

Мини-проекты

Финал 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.