Geek & Imperius
Π― ΡΡΡ Π½ΠΎΠ²ΡΡ ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΡ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Ρ, ΡΡΠ°ΡΠΈΠ½Π½ΡΠ΅ ΠΊΠ°ΡΡΡ ΠΈΠ·ΡΡΠ°Ρ. ΠΡΠΆΠ΅Π½ ΡΠΎΡΠ½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π΄Π»Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π²ΠΎΠΉΡΠΊ ΠΈ Π»ΠΎΠ³ΠΈΡΡΠΈΠΊΠΈ. Π‘ΠΎΠ±ΡΠ°Π» Π±Ρ ΡΡ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ°ΠΊΠΎΠ΅, ΡΠΌΠΎΠΆΠ΅ΡΡ Π·Π°ΠΊΠΎΠ΄ΠΈΡΡ?
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ. Π‘Π΅ΠΉΡΠ°Ρ Π½Π°Π±ΡΠΎΡΠ°Ρ ΡΠ΅Π±Π΅ Π±ΡΡΡΡΡΡ ΠΎΡΠ½ΠΎΠ²Ρ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΡΡ ΡΠΌΠΎΠΆΠ΅ΡΡ ΠΏΠΎΠ΄ΠΏΡΠ°Π²ΠΈΡΡ. ΠΡΠ΅Π΄ΡΡΠ°Π²Ρ ΡΠ΅Π±Π΅ ΡΠ΅ΡΠΊΡ, Π½Π°Π»ΠΎΠΆΠ΅Π½Π½ΡΡ Π½Π° ΡΠ²ΠΎΡ ΡΡΠ°ΡΠΈΠ½Π½ΡΡ ΠΊΠ°ΡΡΡ, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΡΠ΅ΠΉΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΡΡΠ½ΠΎΡΡΠΈ, ΡΡΠ°ΡΡΡ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΎΠΉΡΠΊ. ΠΠΎΡ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΡΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ Π½Π° ΠΏΡΠΎΡΡΠΎΠΌ, ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄Π΅, ΠΏΠΎΡ
ΠΎΠΆΠ΅ΠΌ Π½Π° Python:
1. **ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠ°ΡΡΡ**
- ΠΠ°Π³ΡΡΠ·ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΡΡΡ ΠΈΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅ Π² Π΄Π²ΡΠΌΠ΅ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² `grid`.
- ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ΅ΠΉΠΊΠΈ ΡΠΎΡ
ΡΠ°Π½ΠΈ `terrain_cost` (ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΡΡΠ½ΠΎΡΡΠΈ), `is_supply_point` (ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΡΠΎ ΠΏΡΠ½ΠΊΡΠΎΠΌ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ) ΠΈ `troop_id` (ID Π²ΠΎΠΉΡΠΊ, 0 Π΅ΡΠ»ΠΈ ΠΏΡΡΡΠΎ).
2. **ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ½ΠΈΡΠΎΠ²**
- ΠΠ±ΡΠ΅ΠΊΡ `Unit`: `id` (ID), `strength` (ΡΠΈΠ»Π°), `morale` (ΠΌΠΎΡΠ°Π»ΡΠ½ΡΠΉ Π΄ΡΡ
), `current_pos` (ΡΠ΅ΠΊΡΡΠ°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ), `supply_status` (ΡΡΠ°ΡΡΡ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ), `movement_points` (ΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ).
- Π‘ΠΎΡ
ΡΠ°Π½ΠΈ Π²ΡΠ΅Ρ
ΡΠ½ΠΈΡΠΎΠ² Π² ΡΠΏΠΈΡΠΊΠ΅ `units`.
3. **Π€ΡΠ½ΠΊΡΠΈΡ ΡΡΠΎΠΈΠΌΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ**
```python
def movement_cost(cell):
return terrain_costs[cell.terrain] + (1 if cell.is_supply_point else 0)
```
4. **ΠΠΎΠΈΡΠΊ ΠΏΡΡΠΈ**
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ A* Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ°ΠΌΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΠΏΡΡΠΈ ΠΎΡ `current_pos` ΡΠ½ΠΈΡΠ° Π΄ΠΎ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ΅ΠΉΠΊΠΈ.
- ΠΠ²ΡΠΈΡΡΠΈΠΊΠ° = ΠΠ°Π½Ρ
ΡΡΡΠ΅Π½ΡΠΊΠΎΠ΅ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ * ΡΡΠ΅Π΄Π½ΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΡΡΠ½ΠΎΡΡΠΈ.
- Π Π°ΡΡΠΈΡΡΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΊΡΠΌΡΠ»ΡΡΠΈΠ²Π½Π°Ρ ΡΡΠΎΠΈΠΌΠΎΡΡΡ β€ `unit.movement_points`.
5. **ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π»ΠΈΠ½ΠΈΠΈ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ**
- ΠΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΡΡΠΊΠ°ΠΉ BFS ΠΎΡ Π½ΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΡΠ½ΠΈΡΠ° Π΄ΠΎ Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅Π³ΠΎ ΠΏΡΠ½ΠΊΡΠ° ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ.
- ΠΡΠ»ΠΈ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ > `max_supply_range`, ΡΡΡΠ°Π½ΠΎΠ²ΠΈ `unit.supply_status = False` ΠΈ ΡΠΌΠ΅Π½ΡΡΠ°ΠΉ ΠΌΠΎΡΠ°Π»ΡΠ½ΡΠΉ Π΄ΡΡ
ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΈΠΊ.
6. **Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±ΠΎΡ**
- ΠΠΎΠ³Π΄Π° Π΄Π²Π° ΠΏΡΠΎΡΠΈΠ²ΠΎΠ±ΠΎΡΡΡΠ²ΡΡΡΠΈΡ
ΡΠ½ΠΈΡΠ° Π·Π°Π½ΠΈΠΌΠ°ΡΡ ΡΠΎΡΠ΅Π΄Π½ΠΈΠ΅ ΡΡΠ΅ΠΉΠΊΠΈ, ΡΡΠ°Π²Π½ΠΈ `strength` + `morale`.
- ΠΠ°Π½ΠΎΡΠΈ ΡΡΠΎΠ½, ΠΎΠ±Π½ΠΎΠ²ΠΈ `strength`, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈ ΡΠ½ΠΈΡΠ° Π΅ΡΠ»ΠΈ `strength` β€ 0.
7. **Π¦ΠΈΠΊΠ» Ρ
ΠΎΠ΄Π°**
```python
for turn in range(max_turns):
for unit in units:
# 1. ΠΡΠ±Π΅ΡΠΈ ΡΠ΅Π»Ρ (ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΠ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΠ³ΡΠΎΠΊΠ°)
target = decide_target(unit)
# 2. ΠΠ°ΠΉΠ΄ΠΈ ΠΏΡΡΡ
path = find_path(unit.current_pos, target)
# 3. ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ ΠΏΠΎ ΠΏΡΡΠΈ Π΄ΠΎ `movement_points`
move_unit(unit, path)
# 4. ΠΡΠΎΠ²Π΅ΡΡ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΠ΅
check_supply(unit)
# 5. Π Π°Π·ΡΠ΅ΡΠΈ Π±ΠΎΠΉ Π΅ΡΠ»ΠΈ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡΡ ΡΡΠ΄ΠΎΠΌ Ρ Π²ΡΠ°Π³ΠΎΠΌ
resolve_combat(unit)
```
8. **ΠΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ / Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ**
- Π‘Π±ΡΠ°ΡΡΠ²Π°ΠΉ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ΅ΡΠΊΠΈ Π² CSV ΡΠ°ΠΉΠ» ΠΊΠ°ΠΆΠ΄ΡΠΉ Ρ
ΠΎΠ΄ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π³ΡΠ°ΡΠΈΠΊΠΎΠ².
- ΠΠ»ΠΈ, Π΅ΡΠ»ΠΈ ΡΠ΅Π±Π΅ ΠΏΠΎ Π΄ΡΡΠ΅ pygame, ΠΎΡΡΠΈΡΠΎΠ²ΡΠ²Π°ΠΉ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΡΠ΅ΠΉΠΊΡ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠ²Π΅ΡΠ°ΠΌΠΈ: Π·Π΅Π»Π΅Π½ΡΠΉ Π΄Π»Ρ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ, ΠΊΡΠ°ΡΠ½ΡΠΉ Π΄Π»Ρ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ ΠΌΠΎΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΡΡ
Π° ΠΈ Ρ.Π΄.
ΠΡΠΎ ΠΎΡΠ½ΠΎΠ²Π°. ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°ΠΉ `terrain_costs`, `supply_range` ΠΈ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΡΡ
Π°, ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±ΠΈΡΡΡΡ Π½ΡΠΆΠ½ΠΎΠΉ Π°ΡΠΌΠΎΡΡΠ΅ΡΡ Π΄Π»Ρ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΠ°ΡΠΈΠ½Π½ΠΎΠΉ ΠΊΠ°ΡΡΡ. Π£Π΄Π°ΡΠΈ Π² ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ β ΠΏΠΎΠΌΠ½ΠΈ, Π»ΡΠ±Π°Ρ Π΄Π΅ΡΠ°Π»Ρ ΠΊΠ°ΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ Π±Π΅Π·Π±Π°Π³-ΡΠΈΡΠ΅ΠΉ, Π΅ΡΠ»ΠΈ ΡΡ ΡΠ²Π»Π΅ΡΠ΅ΡΡΡΡ ΡΠΈΡΡΠ°ΠΌΠΈ!
ΠΡΠ»ΠΈΡΠ½Π°Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ, Π½ΠΎ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ
Π½Π΅Π΄ΠΎΡΡΡΡ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΡΡΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡ Π»ΡΠ±ΡΠ΅ ΠΌΠ°ΡΡΡΡΡΡ, Π²ΡΠ²ΠΎΠ΄ΡΡΠΈΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π° ΡΠ°Π΄ΠΈΡΡ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ β Π½Π΅Ρ ΡΠΌΡΡΠ»Π° Π΄Π²ΠΈΠ³Π°ΡΡΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΎΡΡΠ΅Π·Π°Π½Π½ΡΠΌ. ΠΠΎ-Π²ΡΠΎΡΡΡ
, ΠΏΠΎΠΈΡΠΊ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π·Π° Ρ
ΠΎΠ΄ ΠΎΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΎΡΠΊΠΈ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ, ΠΎΡΠΌΠ΅ΡΠ°Ρ Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΡΠ΅ ΡΡΠ°ΡΡΠΊΠΈ, Π° Π½Π΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ; ΡΡΠΎ Π±ΡΠ΄Π΅Ρ O(S+E) ΠΏΡΠΎΡΠΈΠ² O(UΒ·S). Π-ΡΡΠ΅ΡΡΠΈΡ
, ΠΌΠΎΡΠ°Π»Ρ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ½ΠΈΠΆΠ°ΡΡΡΡ ΠΏΡΠΎΠΏΠΎΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΡ ΠΎΡ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ, Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎ ΡΠ»Π°Π³Π°ΠΌ β ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΠ΅Π·ΠΊΠΈΡ
ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ. Π, Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π΄ΠΎΠ±Π°Π²Ρ ΡΠ»ΠΎΠΉ "ΡΠ΅Π·Π΅ΡΠ²Π°": Π΅ΡΠ»ΠΈ ΠΌΠΎΡΠ°Π»Ρ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°Π΄Π°Π΅Ρ Π½ΠΈΠΆΠ΅ ΠΏΠΎΡΠΎΠ³Π°, ΠΎΠ½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΡΡΡΠΏΠ°Π΅Ρ ΠΊ Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅ΠΉ ΡΠΎΡΠΊΠ΅ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ. ΠΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ ΡΠΎΡΠΌΠΎΠ·ΠΈΡΡ ΠΈ Π·Π°ΡΡΠ°Π²ΡΡ Π»ΠΈΠ½ΠΈΠΈ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ Π½Π°ΡΡΠΎΡΡΠ°Ρ Π»ΠΈΠ½ΠΈΡ ΡΡΠΎΠ½ΡΠ°.
ΠΠΎΠ½ΡΠ», Π΄Π°Π²Π°ΠΉ ΠΏΠΎΠ΄ΠΊΡΡΡΠΈΠΌ Π»ΠΎΠ³ΠΈΠΊΡ.
1. **ΠΠ±ΡΠ΅Π·ΠΊΠ° ΠΏΡΡΠ΅ΠΉ ΠΏΠΎ ΡΠ°Π΄ΠΈΡΡΡ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ**
- ΠΡΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΈ ΡΠ·Π»Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ A*, Π²ΡΡΠΈΡΠ»ΡΠΉ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠΎ ΠΏΡΡΠΌΠΎΠΉ ΠΎΡ ΡΡΠΎΠ³ΠΎ ΡΠ·Π»Π° Π΄ΠΎ Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅Π³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ.
- ΠΡΠ»ΠΈ ΡΡΠΎ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠ»ΡΡ ΠΎΡΡΠ°Π²ΡΠ°ΡΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π΄ΠΈΡΡ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ ΡΠ½ΠΈΡΠ°, ΠΎΡΠ±ΡΠΎΡΡ ΡΠ·Π΅Π».
2. **ΠΠ΄ΠΈΠ½ BFS Π·Π° Ρ
ΠΎΠ΄**
- ΠΠ°ΠΏΡΡΠΊΠ°ΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (flood-fill) ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π·Π° Ρ
ΠΎΠ΄.
- ΠΠΎΠΌΠ΅ΡΠ°ΠΉ ΠΊΠ°ΠΆΠ΄ΡΡ Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΡΡ ΠΊΠ»Π΅ΡΠΊΡ Ρ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΌ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ Π΄ΠΎ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ.
- Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ½ΠΈΡ ΡΠΌΠΎΠΆΠ΅Ρ Π·Π° O(1) ΡΠ·Π½Π°ΡΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π΄ΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠ»Π΅ΡΠΊΠΈ ΠΈ ΡΠ΅ΡΠΈΡΡ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π»ΠΈ Π΅ΠΌΡ.
3. **ΠΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎΠ΅ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΡΠ°Π»ΠΈ**
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΈ `unit.morale -= decay_rate * (distance_from_supply / max_supply_range)`.
- ΠΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΠΉ ΠΌΠΎΡΠ°Π»Ρ ΠΌΠ΅ΠΆΠ΄Ρ 0 ΠΈ 100.
4. **ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ²ΠΎΠ΄ ΡΠ΅Π·Π΅ΡΠ²Π°**
- ΠΡΠ»ΠΈ `unit.morale < reserve_threshold`, ΠΈΠ½ΠΈΡΠΈΠΈΡΡΠΉ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊ Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅ΠΉ ΠΎΡΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠΉ ΠΊΠ»Π΅ΡΠΊΠ΅ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΡ).
- ΠΠΎΠ±Π°Π²Ρ ΠΏΠ΅ΡΠ΅Π·Π°ΡΡΠ΄ΠΊΡ, ΡΡΠΎΠ±Ρ ΡΠ½ΠΈΡ Π½Π΅ ΠΌΠΎΠ³ ΡΡΠ°Π·Ρ Π²Π΅ΡΠ½ΡΡΡΡΡ Π² Π±ΠΎΠΉ.
Π‘ ΡΡΠΈΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΌΡΠ»ΡΡΠΈΡ ΠΎΡΡΠ°Π½Π΅ΡΡΡ ΠΎΡΠ·ΡΠ²ΡΠΈΠ²ΠΎΠΉ, Π»ΠΈΠ½ΠΈΠΈ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΠΎ, Π° ΡΠ½ΠΈΡΡ Π½Π΅ Π·Π°ΡΡΡΡΠ½ΡΡ Π² Π½ΠΈΠ³Π΄Π΅-ΡΡΡΠ°Π½Π΅. Π£Π΄Π°ΡΠΈ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅!
ΠΡΠ»ΠΈΡΠ½ΠΎ, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈΡΡ. Π’Π΅ΠΏΠ΅ΡΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ ΡΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΈ ΠΌΠΎΡΠ°Π»Ρ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠ»Π°Π²Π½ΠΎ. Π ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π· Π΄Π΅Π»Π°ΠΉ ΡΠ°ΠΊ: ΡΠ½Π°ΡΠ°Π»Π° ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ BFS, ΠΏΠΎΡΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²ΠΈ ΠΌΠΎΡΠ°Π»Ρ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ, Π·Π°ΡΠ΅ΠΌ β ΡΡΠ°Π·Ρ ΠΏΠ΅ΡΠ΅Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π±ΠΎΠ΅Π²ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ. ΠΠ΅Π΄ΠΈ Π»ΠΎΠ³ΠΈ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ, Π·Π°ΠΏΠΈΡΡΠ²Π°ΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π·Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Ρ
ΠΎΠ΄, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ°ΡΡ ΠΏΠ°ΠΌΡΡΡ. ΠΠΎΡ ΡΠ΅Π±Π΅ ΡΠΎΡΠΌΡΠ»Π° Π΄Π»Ρ ΡΡΡΠΊΠΎΠΉ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ.
ΠΡΠ»ΠΈΡΠ½ΠΎ, Π·Π°ΠΊΡΠ΅ΠΏΠ»ΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Ρ
ΠΎΠ΄ΠΎΠ², ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ³ΠΎΠ½Ρ BFS, ΠΎΠ±Π½ΠΎΠ²Π»Ρ ΠΌΠΎΡΠ°Π»Ρ, ΠΏΠΎΡΠΎΠΌ ΡΡΠ°Π·Ρ Π²ΡΠ΅ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΈ Π±ΠΎΠΉ β ΠΎΠ΄Π½ΠΈΠΌ ΠΌΠ°Ρ
ΠΎΠΌ. Π’ΠΎΠ»ΡΠΊΠΎ Π΄Π΅Π»ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π»ΠΎΠ³ Π·Π°ΠΏΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠ°ΠΌΡΡΡ Π½Π΅ ΡΠ°Π·Π΄ΡΠ²Π°Π»Π°ΡΡ. ΠΠΎΡΠΎΠ² Π·Π°ΠΏΡΡΠΊΠ°ΡΡ β ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΠ²ΠΎΠΈ Π»ΠΈΠ½ΠΈΠΈ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΡ Π²ΡΠ΄Π΅ΡΠΆΠ°Ρ!