/
Vibek
/
First_Game
Обзор
Документация
Войти
/
Vibek
/
First_Game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
utils/fsm.py
89 строк
3 KB
Vibek
Начало реализвации Wave_Manadger
04 июн 2026, 20:33
04 июн 2026, 20:33
f0f823b
Код
Авторство
О чём код?
""" Конечный автомат (Finite State Machine). Реализует паттерн State для управления состояниями игры и AI. """ from abc import ABC, abstractmethod from typing import Dict, Optional, Any, List import pygame class State(ABC): """ Абстрактный базовый класс состояния. Все состояния наследуются от этого класса. """ def __init__(self, name: str): self.name = name @abstractmethod def enter(self) -> None: """Вызывается при входе в состояние (один раз).""" pass @abstractmethod def update(self, dt: float) -> None: """ Вызывается каждый кадр пока состояние активно. :param dt: Delta time (время между кадрами в секундах) """ pass @abstractmethod def exit(self) -> None: """Вызывается при выходе из состояния (один раз).""" pass def render(self, surface: pygame.Surface) -> None: """Опционально: переопределяется в наследниках для отрисовки.""" pass def __str__(self) -> str: return self.name class StateMachine: """ Управляет переходами между состояниями. Гарантирует корректный вызов enter()/exit(). """ def __init__(self): self._states: Dict[str, State] = {} self._current_state: Optional[State] = None def add_state(self, state: State) -> None: """ Добавить состояние в автомат. :param state: Экземпляр класса, наследующего State """ self._states[state.name] = state def switch_state(self, state_name: str) -> None: """ Переключиться на другое состояние. :param state_name: Имя целевого состояния """ if state_name not in self._states: raise ValueError(f"State '{state_name}' not found. Available: {list(self._states.keys())}") if self._current_state is not None: # Выход из текущего состояния self._current_state.exit() new_state = self._states[state_name] # Вход в новое состояние self._current_state = new_state self._current_state.enter() def update(self, dt: float, events: List[pygame.event.Event]) -> None: # Добавили events """Обновить текущее состояние.""" if self._current_state is not None: self._current_state.update(dt, events) # Передаём events дальше def get_current_state(self) -> Optional[str]: """Вернуть имя текущего состояния.""" return self._current_state.name if self._current_state else None def render(self, screen: pygame.Surface) -> None: if self._current_state is not None: self._current_state.render(screen)