embedded-systems-labs/wormz/README.md
2025-12-25 11:09:27 +03:00

73 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lab 3 — Wormz (мини-игра на OLED + FreeRTOS)
**Автор:** А. Карпов P3313
## 1. Цель работы
Реализовать простую игру на OLED 128×64:
- 2 игрока (червя)
- прицеливание, сила выстрела, полёт с гравитацией/ветром
- взрыв с кратером и уроном по радиусу
- завершение игры при 0 HP
## 2. Аппаратная часть
**МК:** STM32F407VGTx
**Периферия:**
- OLED по I2C
- Клавиатура (сканирование строк/столбцов через PCA9538 / kb.c)
- FreeRTOS
## 3. Управление
- `2` — угол вверх
- `8` — угол вниз
- `4` — влево
- `6` — вправо
- `5` — FIRE: 1-е нажатие заряд силы, 2-е нажатие выстрел
- `*` — следующее оружие (в режиме прицеливания)
- `#` — предыдущее оружие (в режиме прицеливания)
- `0` — рестарт
## 4. Архитектура и состояние игры
Основные состояния (`GameState`):
- `GS_AIM` — прицеливание/движение/выбор оружия
- `GS_CHARGE` — заряд силы
- `GS_FLIGHT` — полёт снаряда
- `GS_EXPLOSION` — анимация взрыва + кратер + урон
- `GS_GAMEOVER` — конец игры
```mermaid
stateDiagram-v2
[*] --> AIM
AIM --> CHARGE: FIRE (5)
CHARGE --> FLIGHT: FIRE (5)
FLIGHT --> EXPLOSION: collision/hit
EXPLOSION --> AIM: next player
EXPLOSION --> GAMEOVER: hp == 0
GAMEOVER --> AIM: restart (0)
AIM --> AIM: restart (0)
CHARGE --> AIM: restart (0)
FLIGHT --> AIM: restart (0)
EXPLOSION --> AIM: restart (0)
```
## 5. Модель мира
* Земля: массив `ground_y[x]` (высота поверхности по X).
* Кратер: “опускаем” `ground_y[x]` в радиусе взрыва.
* Урон: линейно убывает с расстоянием до эпицентра.
## 6. Демо (небольшое)
![видео](../assets/demo.mp4)
## 7. Выводы
* Сделан игровой цикл со стабильным FPS (фиксированный шаг).
* Реализованы физика полёта, взрыв, деформация ландшафта и урон.
* Игра управляется только клавиатурой и выводится на OLED.