classDiagram class Клетка { +int x, y +bool стена, старт, выход +int вес +проходима() } class Лабиринт { +int ширина, высота +Клетка[][] клетки +Клетка стартоваяКлетка, выходнаяКлетка +получитьКлетку(x,y) +получитьСоседей(клетка) +установитьСтарт(x,y) +установитьВыход(x,y) } class СтроительЛабиринта { <<интерфейс>> +построитьИзФайла(имяФайла) } class СтроительИзТекстовогоФайла { +построитьИзФайла(имяФайла) } class СтратегияПоискаПути { <<интерфейс>> +найтиПуть(лабиринт, старт, выход) } class ПоискВШирину class ПоискВГлубину class Астар class Дейкстра class РешательЛабиринта { -Лабиринт лабиринт -СтратегияПоискаПути стратегия +установитьСтратегию(стратегия) +решить() СтатистикаПоиска } class СтатистикаПоиска { +int длинаПути +int посещеноКлеток +float времяМс } class Наблюдатель { <<интерфейс>> +обновить(событие, данные) } class КонсольноеПредставление { +обновить(событие, данные) -отобразить() } class Команда { <<интерфейс>> +выполнить() +отменить() } class КомандаПеремещения { -Игрок игрок -Лабиринт лабиринт -String направление +выполнить() +отменить() } class Игрок { +Клетка позиция +переместитьсяВ(клетка) } class КонтроллерИгры { -List наблюдатели -Stack команды +подписать(наблюдатель) +уведомить(событие, данные) +выполнитьКоманду(команда) +отменить() } СтроительЛабиринта <|-- СтроительИзТекстовогоФайла СтратегияПоискаПути <|-- ПоискВШирину СтратегияПоискаПути <|-- ПоискВГлубину СтратегияПоискаПути <|-- Астар СтратегияПоискаПути <|-- Дейкстра РешательЛабиринта --> СтратегияПоискаПути РешательЛабиринта --> Лабиринт Лабиринт --> Клетка КонтроллерИгры --> Игрок КонтроллерИгры --> Команда КонтроллерИгры --> Наблюдатель КомандаПеремещения --> Игрок КомандаПеремещения --> Лабиринт КонсольноеПредставление ..|> Наблюдатель