diff --git "a/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/README.md" "b/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/README.md" new file mode 100644 index 0000000..c87eb87 --- /dev/null +++ "b/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/README.md" @@ -0,0 +1,20 @@ +# Робот Техник + +## Используются +- Flask 2.3.3 +- PyQt5 5.15.11 + +### Установка +pip install Flask==2.3.3 PyQt5==5.15.11 + +## Десктопная версия +python desktop_app.py +c PyQt5 + +## Веб-версия +python web_app.py + +### Cайт +http://localhost:8596 +или +http://127.0.0.1:8596 diff --git "a/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/desktop_app.py" "b/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/desktop_app.py" new file mode 100644 index 0000000..144d38a --- /dev/null +++ "b/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/desktop_app.py" @@ -0,0 +1,375 @@ +import sys +import random +from PyQt5.QtWidgets import ( + QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, + QGridLayout, QPushButton, QLabel, QFrame, QMessageBox, QGroupBox +) +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPainter, QColor, QBrush, QPen, QFont +from main import ТипЯчеекРемесло, ТипНаправленийТехНапр, ЛабиринтРоботТехник, РоботТехник + + +class CellWidget(QFrame): + + def __init__(self, cell, cell_size = 45): + super().__init__() + self.cell = cell + self.cell_size = cell_size + self.setFixedSize(cell_size, cell_size) + self.setLineWidth(2) + + def paintEvent(self, event): + painter = QPainter(self) + painter.setRenderHint(QPainter.Antialiasing) + + # Цвета для типов ячеек + colors = { + ТипЯчеекРемесло.Пол: QColor(255, 255, 255), + ТипЯчеекРемесло.Оборуд: QColor(255, 255, 0), + ТипЯчеекРемесло.Починено: QColor(0, 255, 0), + ТипЯчеекРемесло.Запчасть: QColor(0, 0, 255), + ТипЯчеекРемесло.Барьер: QColor(255, 0, 0), + ТипЯчеекРемесло.Финиш: QColor(128, 0, 128), + ТипЯчеекРемесло.Склад: QColor(128, 128, 128) + } + + # Рисуем фон + color = colors.get(self.cell.тип_ячейки, QColor(255, 255, 255)) + painter.fillRect(0, 0, self.cell_size, self.cell_size, QBrush(color)) + + # Рисуем рамку + painter.setPen(QPen(QColor(0, 0, 0), 3)) + painter.drawRect(0, 0, self.cell_size, self.cell_size) + + # Рисуем робота + if self.cell.ячейка_робота: + painter.setBrush(QBrush(QColor(0, 0, 0))) + painter.setPen(QPen(QColor(255, 255, 255), 2)) + center_x = self.cell_size // 2 + center_y = self.cell_size // 2 + radius = self.cell_size // 3 + painter.drawEllipse(center_x - radius, center_y - radius, + radius * 2, radius * 2) + + # Глаза + painter.setBrush(QBrush(QColor(255, 255, 255))) + painter.drawEllipse(center_x - radius // 2, center_y - radius // 2, + radius // 3, radius // 3) + painter.drawEllipse(center_x + radius // 4, center_y - radius // 2, + radius // 3, radius // 3) + + +class RobotDesktopApp(QMainWindow): + + def __init__(self): + super().__init__() + self.labyrinth = None + self.robot = None + self.cell_size = 45 + self.move_count = 0 + self.max_moves = 50 # Лимит ходов + self.init_ui() + self.create_random_labyrinth() + QMessageBox.information(self, "Начало игры", + "По лабиринту движется Робот Техник!\n\n" + "Цель игры:\n" + "1. Починить всё оборудование (жёлтые клетки)\n" + "2. Забрать все запчасти (синие клетки)\n" + "3. Добраться до финиша (фиолетовая клетка)\n\n" + "Управление:\n" + "Используйте кнопки для движения\n" + "Нажмите 'Оборудовать' на клетке с оборудованием\n" + "Нажмите 'Взять запчасть' на синей клетке\n\n" + "Удачи!") + + def init_ui(self): + self.setWindowTitle("Робот Техник") + self.setGeometry(50, 50, 800, 700) + # Центральный виджет + central_widget = QWidget() + self.setCentralWidget(central_widget) + + # Основной layout + main_layout = QHBoxLayout(central_widget) + + # Левая панель - управление + control_panel = self.create_control_panel() + main_layout.addWidget(control_panel, 1) + + # Центральная панель - лабиринт + labyrinth_panel = self.create_labyrinth_panel() + main_layout.addWidget(labyrinth_panel, 2) + + # Правая панель - информация и легенда + info_panel = self.create_info_panel() + main_layout.addWidget(info_panel, 1) + + def create_control_panel(self): + panel = QGroupBox("Управление") + layout = QVBoxLayout() + + # Кнопки движения + movement_group = QGroupBox("Движение") + movement_layout = QGridLayout() + + # Располагаем кнопки в виде креста + self.btn_forward = QPushButton("Вперед") + self.btn_backward = QPushButton("Назад") + self.btn_left = QPushButton("Влево") + self.btn_right = QPushButton("Вправо") + self.btn_upleft = QPushButton("Подняться") + self.btn_downright = QPushButton("Спуститься") + + for btn in [self.btn_forward, self.btn_backward, self.btn_left, + self.btn_right, self.btn_upleft, self.btn_downright]: + btn.setFixedSize(70, 60) + + movement_layout.addWidget(self.btn_forward, 0, 1) + movement_layout.addWidget(self.btn_backward, 1, 1) + movement_layout.addWidget(self.btn_left, 0, 0) + movement_layout.addWidget(self.btn_right, 0, 2) + movement_layout.addWidget(self.btn_upleft, 1, 0) + movement_layout.addWidget(self.btn_downright, 1, 2) + + movement_group.setLayout(movement_layout) + + # Подключаем события + self.btn_forward.clicked.connect(lambda: self.move_robot(ТипНаправленийТехНапр.ТехВперед)) + self.btn_backward.clicked.connect(lambda: self.move_robot(ТипНаправленийТехНапр.ТехНазад)) + self.btn_left.clicked.connect(lambda: self.move_robot(ТипНаправленийТехНапр.ТехЛево)) + self.btn_right.clicked.connect(lambda: self.move_robot(ТипНаправленийТехНапр.ТехПраво)) + self.btn_upleft.clicked.connect(lambda: self.move_robot(ТипНаправленийТехНапр.ДиагТВ)) + self.btn_downright.clicked.connect(lambda: self.move_robot(ТипНаправленийТехНапр.ДиагТН)) + + layout.addWidget(movement_group) + + # Действия робота + actions_group = QGroupBox("Действия") + actions_layout = QVBoxLayout() + + self.btn_equip = QPushButton("Оборудовать") + self.btn_part = QPushButton("Взять запчасть") + + self.btn_equip.clicked.connect(self.repair_equipment) + self.btn_part.clicked.connect(self.take_part) + + actions_layout.addWidget(self.btn_equip) + actions_layout.addWidget(self.btn_part) + actions_group.setLayout(actions_layout) + + layout.addWidget(actions_group) + + # Управление лабиринтом + manage_group = QGroupBox("Управление лабиринтом") + manage_layout = QVBoxLayout() + + self.btn_new = QPushButton("Создать новый лабиринт") + self.btn_finish = QPushButton("Завершить работу") + + self.btn_new.clicked.connect(self.create_random_labyrinth) + self.btn_finish.clicked.connect(self.finish_work) + + manage_layout.addWidget(self.btn_new) + manage_layout.addWidget(self.btn_finish) + + manage_group.setLayout(manage_layout) + + layout.addWidget(manage_group) + layout.addStretch() + + panel.setLayout(layout) + return panel + + def create_labyrinth_panel(self): + panel = QGroupBox("Лабиринт") + self.labyrinth_layout = QGridLayout() + self.labyrinth_layout.setSpacing(0) + panel.setLayout(self.labyrinth_layout) + return panel + + def create_info_panel(self): + panel = QGroupBox("Информация") + layout = QVBoxLayout() + + # Текущая информация + info_group = QGroupBox("Текущее состояние") + info_layout = QVBoxLayout() + + self.lbl_position = QLabel("Позиция: (0, 0)") + self.lbl_cell_type = QLabel("Тип ячейки: Неизвестно") + self.lbl_moves = QLabel("Ходов: 0/50") + self.lbl_status = QLabel("Статус: Не инициализирован") + + # Устанавливаем стили + self.lbl_position.setStyleSheet("font-size: 12pt; padding: 5px;") + self.lbl_cell_type.setStyleSheet("font-size: 12pt; padding: 5px;") + self.lbl_moves.setStyleSheet("font-size: 12pt; padding: 5px; color: #333;") + self.lbl_status.setStyleSheet("font-size: 12pt; padding: 5px; font-weight: bold;") + + info_layout.addWidget(self.lbl_position) + info_layout.addWidget(self.lbl_cell_type) + info_layout.addWidget(self.lbl_moves) + info_layout.addWidget(self.lbl_status) + info_group.setLayout(info_layout) + + layout.addWidget(info_group) + + # Обозначения + legend_group = QGroupBox("Обозначения") + legend_layout = QVBoxLayout() + + colors = { + "Пол": QColor(255, 255, 255), + "Оборуд": QColor(255, 255, 0), + "Починено": QColor(0, 255, 0), + "Запчасть": QColor(0, 0, 255), + "Барьер": QColor(255, 0, 0), + "Финиш": QColor(128, 0, 128), + "Склад": QColor(128, 128, 128), + "Робот": QColor(0, 0, 0) + } + + for name, color in colors.items(): + legend_item = QWidget() + item_layout = QHBoxLayout(legend_item) + item_layout.setContentsMargins(5, 5, 5, 5) + + color_label = QLabel() + color_label.setFixedSize(20, 20) + color_label.setStyleSheet( + f"background-color: rgb({color.red()}, {color.green()}, {color.blue()}); border: 1px solid black;") + if name == "Робот": + color_label.setStyleSheet(f"background-color: black; border: 1px solid black; border-radius: 10px;") + + text_label = QLabel(name) + text_label.setStyleSheet("font-size: 10pt;") + item_layout.addWidget(color_label) + item_layout.addWidget(text_label) + item_layout.addStretch() + + legend_layout.addWidget(legend_item) + + legend_group.setLayout(legend_layout) + layout.addWidget(legend_group) + layout.addStretch() + + panel.setLayout(layout) + return panel + + def create_random_labyrinth(self): + width = 8 + height = 8 + + self.labyrinth = ЛабиринтРоботТехник() + self.labyrinth.ИнициализироватьЛабиринт(ТипЯчеекРемесло.Пол, width, height) + self.move_count = 0 + + # Добавляем случайные объекты + types = [ + ТипЯчеекРемесло.Оборуд, + ТипЯчеекРемесло.Запчасть, + ТипЯчеекРемесло.Барьер, + ТипЯчеекРемесло.Склад + ] + + for _ in range(10): + x = random.randint(0, width - 1) + y = random.randint(0, height - 1) + if x != 0 or y != 0: # Не ставим на стартовую позицию + self.labyrinth.ячейки[y][x].тип_ячейки = random.choice(types) + + # Ставим финиш + finish_x = width - 1 + finish_y = height - 1 + self.labyrinth.ячейки[finish_y][finish_x].тип_ячейки = ТипЯчеекРемесло.Финиш + + # Ставим робота в левый нижний угол + start_x, start_y = 0, 0 + self.labyrinth.ячейки[start_y][start_x].ячейка_робота = True + self.labyrinth.ячейки[start_y][start_x].тип_ячейки = ТипЯчеекРемесло.Пол + + self.robot = РоботТехник(self.labyrinth) + + self.update_display() + + def reset_labyrinth(self): + self.create_random_labyrinth() + + def update_display(self): + # Очищаем старые ячейки + while self.labyrinth_layout.count(): + item = self.labyrinth_layout.takeAt(0) + if item.widget(): + item.widget().deleteLater() + + # Добавляем новые ячейки + if self.labyrinth and self.labyrinth.ячейки: + for robot_y in range(self.labyrinth.длина): + for x in range(self.labyrinth.ширина): + cell = self.labyrinth.ячейки[robot_y][x] + cell_widget = CellWidget(cell, self.cell_size) + + display_y = self.labyrinth.длина - 1 - robot_y + self.labyrinth_layout.addWidget(cell_widget, display_y, x) + self.labyrinth_layout.setSizeConstraint(QGridLayout.SetFixedSize) + + # Обновляем информацию + if self.robot and self.robot.текущая_ячейка: + current = self.robot.текущая_ячейка + self.lbl_position.setText(f"Позиция: ({current.x}, {current.y})") + cell_type = current.тип_ячейки.value if current.тип_ячейки else "Неизвестно" + self.lbl_cell_type.setText(f"Тип ячейки: {cell_type}") + + moves_left = self.max_moves - self.move_count + move_text = f"Ходов: {self.move_count}/{self.max_moves}" + self.lbl_moves.setText(move_text) + + if self.robot.ЗавершитьРаботу(): + self.lbl_status.setText("Победа!") + self.lbl_status.setStyleSheet("color: green; font-size: 12pt; font-weight: bold; padding: 5px;") + QMessageBox.information(self, "Поздравляем!", + "Работа успешно завершена!\nВсе оборудование починено.") + self.reset_labyrinth() + else: + self.lbl_status.setText("Статус: В работе") + self.lbl_status.setStyleSheet("color: blue; font-size: 12pt; padding: 5px;") + + def move_robot(self, direction): + if not self.robot: + QMessageBox.warning(self, "Ошибка", "Робот не инициализирован!") + return + if self.move_count >= self.max_moves: + QMessageBox.warning(self, "Лимит ходов исчерпан!", + f"Вы использовали все {self.max_moves} ходов!\n" + "Создайте новый лабиринт или завершите игру.") + return + + result = self.robot.Перейти(direction) + if result: + self.move_count+=1 + self.update_display() + else: + QMessageBox.warning(self, "Ошибка", "Невозможно переместиться в этом направлении!") + + def repair_equipment(self): + if self.robot: + self.robot.Оборуд() + self.update_display() + + def take_part(self): + if self.robot: + self.robot.Запчасть() + self.update_display() + + def finish_work(self): + self.close() + +def run_desktop_app(): + app = QApplication(sys.argv) + app.setStyle("Fusion") + window = RobotDesktopApp() + window.show() + sys.exit(app.exec_()) + +if __name__ == "__main__": + run_desktop_app() \ No newline at end of file diff --git "a/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/main.py" "b/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/main.py" new file mode 100644 index 0000000..a19ab48 --- /dev/null +++ "b/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/main.py" @@ -0,0 +1,262 @@ +from __future__ import annotations + +from enum import Enum +from typing import List, Iterator, Optional + + +class ТипЯчеекРемесло(Enum): + Пол = "Пол" + Оборуд = "Оборуд" + Починено = "Починено" + Запчасть = "Запчасть" + Барьер = "Барьер" + Финиш = "Финиш" + Склад = "Склад" + + +class ТипНаправленийТехНапр(Enum): + ТехВперед = "ТехВперед" + ТехНазад = "ТехНазад" + ТехЛево = "ТехЛево" + ТехПраво = "ТехПраво" + ДиагТВ = "ДиагТВ" + ДиагТН = "ДиагТН" + + +class БазовыеТипыНаправления(Enum): + C = "C" + Ю = "Ю" + З = "З" + В = "В" + СЗ = "СЗ" + ЮВ = "ЮВ" + +СТОРОНА_В_НАПРАВЛЕНИЕ = { + БазовыеТипыНаправления.C: ТипНаправленийТехНапр.ТехВперед, + БазовыеТипыНаправления.Ю: ТипНаправленийТехНапр.ТехНазад, + БазовыеТипыНаправления.З: ТипНаправленийТехНапр.ТехЛево, + БазовыеТипыНаправления.В: ТипНаправленийТехНапр.ТехПраво, + БазовыеТипыНаправления.СЗ: ТипНаправленийТехНапр.ДиагТВ, + БазовыеТипыНаправления.ЮВ: ТипНаправленийТехНапр.ДиагТН, +} + + +class ЯчейкаРоботТехник: + + def __init__( + self, + тип_ячейки: Optional[ТипЯчеекРемесло] = None, + ячейка_робота: bool = False, + x: int = 0, + y: int = 0, + ) -> None: + self.ячейка_робота: bool = ячейка_робота + self.тип_ячейки: Optional[ТипЯчеекРемесло] = тип_ячейки + self.x: int = x + self.y: int = y + + def __repr__(self) -> str: + return ( + f"ЯчейкаРоботТехник(" + f"type={self.тип_ячейки}, robot={self.ячейка_робота}, " + f"x={self.x}, y={self.y})" + ) + + +class ЛабиринтРоботТехник: + def __init__( + self, + ширина: int = 0, + длина: int = 0, + ячейки: Optional[List[List[ЯчейкаРоботТехник]]] = None, + ) -> None: + self.ширина: int = ширина + self.длина: int = длина + self.ячейки: List[List[ЯчейкаРоботТехник]] = ячейки or [] + + def УстановитьКоординаты(self) -> None: + for y, row in enumerate(self.ячейки): + for x, cell in enumerate(row): + cell.x = x + cell.y = y + + def ПолучитьСоседнююЯчейку( + self, + текущая_ячейка: ЯчейкаРоботТехник, + направление_поиска: ТипНаправленийТехНапр, + ) -> Optional[ЯчейкаРоботТехник]: + if текущая_ячейка is None: + return None + + if not self.ячейки: + return None + + if направление_поиска == ТипНаправленийТехНапр.ТехВперед: + dx, dy = (0, 1) + elif направление_поиска == ТипНаправленийТехНапр.ТехНазад: + dx, dy = (0, -1) + elif направление_поиска == ТипНаправленийТехНапр.ТехЛево: + dx, dy = (-1, 0) + elif направление_поиска == ТипНаправленийТехНапр.ТехПраво: + dx, dy = (1, 0) + elif направление_поиска == ТипНаправленийТехНапр.ДиагТВ: + dx, dy = (-1, 1) + elif направление_поиска == ТипНаправленийТехНапр.ДиагТН: + dx, dy = (1, -1) + else: + return None + + nx = текущая_ячейка.x + dx + ny = текущая_ячейка.y + dy + + if not (0 <= nx < self.ширина and 0 <= ny < self.длина): + return None + + соседняя = self.ячейки[ny][nx] + # на барьер и склад нельзя заходить + if соседняя.тип_ячейки in ( + ТипЯчеекРемесло.Барьер, + ТипЯчеекРемесло.Склад, + ): + return None + + return соседняя + + def ПолучитьИтератор(self) -> Iterator[ЯчейкаРоботТехник]: + if not self.ячейки: + return iter(()) + + self.УстановитьКоординаты() + + width = self.ширина + height = self.длина + + x = 0 + y = 0 + direction = 1 + + while True: + yield self.ячейки[y][x] + + if direction == 1: # движемся вправо + if x == width - 1: + if y == height - 1: + break # достигнут верхний ряд + y += 1 + direction = -1 + else: + x += 1 + else: # движемся влево + if x == 0: + if y == height - 1: + break + y += 1 + direction = 1 + else: + x -= 1 + + def ИнициализироватьЛабиринт( + self, + тип_ячейки: ТипЯчеекРемесло, + ширина: Optional[int] = None, + длина: Optional[int] = None, + ) -> None: + if ширина is not None: + self.ширина = ширина + if длина is not None: + self.длина = длина + + if self.ширина <= 0 or self.длина <= 0: + self.ячейки = [] + return + + self.ячейки = [] + for y in range(self.длина): + row: List[ЯчейкаРоботТехник] = [] + for x in range(self.ширина): + row.append(ЯчейкаРоботТехник(тип_ячейки=тип_ячейки, x=x, y=y)) + self.ячейки.append(row) + + +class РоботТехник: + def __init__(self, лабиринт: Optional[ЛабиринтРоботТехник] = None) -> None: + self.лабиринт: Optional[ЛабиринтРоботТехник] = лабиринт + self.текущая_ячейка: Optional[ЯчейкаРоботТехник] = None + + if лабиринт is not None and лабиринт.ячейки: + for row in лабиринт.ячейки: + for cell in row: + if cell.ячейка_робота: + self.текущая_ячейка = cell + break + + + + def УстановитьТекущуюЯчейку( + self, новая_ячейка: Optional[ЯчейкаРоботТехник] + ) -> Optional[ЯчейкаРоботТехник]: + if новая_ячейка is None: + return None + if self.текущая_ячейка is not None: + self.текущая_ячейка.ячейка_робота = False + self.текущая_ячейка = новая_ячейка + self.текущая_ячейка.ячейка_робота = True + return self.текущая_ячейка + + def Перейти(self, направление: ТипНаправленийТехНапр) -> Optional[ЯчейкаРоботТехник]: + if self.лабиринт is None or self.текущая_ячейка is None: + return None + соседняя = self.лабиринт.ПолучитьСоседнююЯчейку( + self.текущая_ячейка, направление + ) + if соседняя is None: + return None + return self.УстановитьТекущуюЯчейку(соседняя) + + def ДвигТехВп(self) -> Optional[ЯчейкаРоботТехник]: + return self.Перейти(ТипНаправленийТехНапр.ТехВперед) + + def ОтойтиТех(self) -> Optional[ЯчейкаРоботТехник]: + return self.Перейти(ТипНаправленийТехНапр.ТехНазад) + + def СместитьсяЛево(self) -> Optional[ЯчейкаРоботТехник]: + return self.Перейти(ТипНаправленийТехНапр.ТехЛево) + + def СместитьсяПраво(self) -> Optional[ЯчейкаРоботТехник]: + return self.Перейти(ТипНаправленийТехНапр.ТехПраво) + + def Подняться(self) -> Optional[ЯчейкаРоботТехник]: + return self.Перейти(ТипНаправленийТехНапр.ДиагТВ) + + def Спуститься(self) -> Optional[ЯчейкаРоботТехник]: + return self.Перейти(ТипНаправленийТехНапр.ДиагТН) + + # Методы специализации: + + def Оборуд(self) -> None: + if self.текущая_ячейка is None: + return + if self.текущая_ячейка.тип_ячейки == ТипЯчеекРемесло.Оборуд: + self.текущая_ячейка.тип_ячейки = ТипЯчеекРемесло.Починено + + def Запчасть(self) -> None: + if self.текущая_ячейка is None: + return + if self.текущая_ячейка.тип_ячейки == ТипЯчеекРемесло.Запчасть: + self.текущая_ячейка.тип_ячейки = ТипЯчеекРемесло.Оборуд + + def ЗавершитьРаботу(self) -> bool: + if self.текущая_ячейка is None: + return False + if self.текущая_ячейка.тип_ячейки != ТипЯчеекРемесло.Финиш: + return False + + if self.лабиринт is None: + return False + + for row in self.лабиринт.ячейки: + for cell in row: + if cell.тип_ячейки in (ТипЯчеекРемесло.Оборуд, ТипЯчеекРемесло.Запчасть): + return False + + return True diff --git "a/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/mapping.yaml" "b/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/mapping.yaml" new file mode 100644 index 0000000..5960e5f --- /dev/null +++ "b/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/mapping.yaml" @@ -0,0 +1,52 @@ +классы: + - РоботТехник: РоботТехник + свойства: + - лабиринт: лабиринт + методы: + - ДвигТехВп: ДвигТехВп + - ОтойтиТех: ОтойтиТех + - СместитьсяЛево: СместитьсяЛево + - СместитьсяПраво: СместитьсяПраво + - Подняться: Подняться + - Спуститься: Спуститься + - Оборуд: Оборуд + - Запчасть: Запчасть + - ЛабиринтРоботТехник: ЛабиринтРоботТехник + свойства: + - ширина: ширина + - длина: длина + - ячейки: ячейки + методы: + - ПолучитьСоседнююЯчейку: ПолучитьСоседнююЯчейку + - ПолучитьИтератор: ПолучитьИтератор + - ИнициализироватьЛабиринт: ИнициализироватьЛабиринт + - ЯчейкаРоботТехник: ЯчейкаРоботТехник + свойства: + - ячейка_робота: ячейка_робота + - тип_ячейки: тип_ячейки +перечисления: + - ТипНаправленийТехНапр: ТипНаправленийТехНапр + опции: + - ТехВперед: ТехВперед + - ТехНазад: ТехНазад + - ТехЛево: ТехЛево + - ТехПраво: ТехПраво + - ДиагТВ: ДиагТВ + - ДиагТН: ДиагТН + - ТипЯчеекРемесло: ТипЯчеекРемесло + опции: + - Пол: Пол + - Оборуд: Оборуд + - Починено: Починено + - Запчасть: Запчасть + - Барьер: Барьер + - Финиш: Финиш + - Склад: Склад + - БазовыеТипыНаправления: БазовыеТипыНаправления + опции: + - C: C + - Ю: Ю + - З: З + - В: В + - СЗ: СЗ + - ЮВ: ЮВ \ No newline at end of file diff --git "a/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/templates/index.html" "b/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/templates/index.html" new file mode 100644 index 0000000..df5959e --- /dev/null +++ "b/5030102_30202/\320\247\320\265\321\200\320\275\320\276\321\200\320\270\321\206\320\272\320\260\321\217\320\220\320\275\320\260\321\201\321\202\320\260\321\201\320\270\321\217/templates/index.html" @@ -0,0 +1,709 @@ + + +
+ + +