Код IT
← Каталог

Python — карточная стратегия — Этап 10 — процедурная карта узлов

Фрагмент из «Python — карточная стратегия»: Этап 10 — процедурная карта узлов.

python spinoffencyclopedia9-04-razrabotka-igr-praktikum-razrabotki-igr-7 embed URL статья в энциклопедии
Python main.py
import random
import settings


class MapNode:
    def __init__(self, node_type: str, floor: int, row: int):
        self.type = node_type
        self.floor = floor
        self.row = row
        self.connections: list["MapNode"] = []
        self.available = False
        self.completed = False

    @property
    def color(self):
        return settings.NODE_COLORS.get(self.type, (120, 120, 120))


class GameMap:
    FLOORS = 8  # в практикуме короче, в эталоне 15

    def __init__(self):
        self.floors: list[list[MapNode]] = []
        self.current_node: MapNode | None = None
        self._generate()

    def _generate(self):
        for f in range(self.FLOORS):
            row = random.randint(0, 2)
            ntype = settings.NODE_BOSS if f == self.FLOORS - 1 else settings.NODE_COMBAT
            if f > 0 and f % 4 == 0:
                ntype = settings.NODE_REST
            self.floors.append([MapNode(ntype, f, row)])
        for f in range(len(self.floors) - 1):
            for a in self.floors[f]:
                for b in self.floors[f + 1]:
                    if abs(a.row - b.row) <= 1:
                        a.connections.append(b)
        for node in self.floors[0]:
            node.available = True

    def select_node(self, node: MapNode) -> bool:
        if not node.available or node.completed:
            return False
        if self.current_node and node not in self.current_node.connections:
            if node.floor != 0:
                return False
        self.current_node = node
        node.completed = True
        for n in self._all_nodes():
            n.available = False
        for nxt in node.connections:
            nxt.available = True
        return True

    def _all_nodes(self):
        for floor in self.floors:
            for n in floor:
                yield n
import random
import settings


class MapNode:
    def __init__(self, node_type: str, floor: int, row: int):
        self.type = node_type
        self.floor = floor
        self.row = row
        self.connections: list["MapNode"] = []
        self.available = False
        self.completed = False

    @property
    def color(self):
        return settings.NODE_COLORS.get(self.type, (120, 120, 120))


class GameMap:
    FLOORS = 8  # в практикуме короче, в эталоне 15

    def __init__(self):
        self.floors: list[list[MapNode]] = []
        self.current_node: MapNode | None = None
        self._generate()

    def _generate(self):
        for f in range(self.FLOORS):
            row = random.randint(0, 2)
            ntype = settings.NODE_BOSS if f == self.FLOORS - 1 else settings.NODE_COMBAT
            if f > 0 and f % 4 == 0:
                ntype = settings.NODE_REST
            self.floors.append([MapNode(ntype, f, row)])
        for f in range(len(self.floors) - 1):
            for a in self.floors[f]:
                for b in self.floors[f + 1]:
                    if abs(a.row - b.row) <= 1:
                        a.connections.append(b)
        for node in self.floors[0]:
            node.available = True

    def select_node(self, node: MapNode) -> bool:
        if not node.available or node.completed:
            return False
        if self.current_node and node not in self.current_node.connections:
            if node.floor != 0:
                return False
        self.current_node = node
        node.completed = True
        for n in self._all_nodes():
            n.available = False
        for nxt in node.connections:
            nxt.available = True
        return True

    def _all_nodes(self):
        for floor in self.floors:
            for n in floor:
                yield n