## Kapitel 19 – Textadventure – Abenteuer aus Text

# Seite 264 – Textadventure - Abenteuer aus Text
geschichte = [
    {
        "id": 0,
        "auswahlText": "Im Museum",
        "text": """*** Die Mumie des Schreckens ***
Ein Textadventure
Version 2.15 Pug-Software""",
        "ziele": [1]
    },
    {
        "id": 1,
        "auswahlText": "Du betrittst das Museum",
        "text": """Du bist viel zu spät in das alte Museum gekommen.
Dir bleibt nur noch wenig Zeit, bis das Museum schließt.
Der erste Gong ist ertönt, Zeit, sich zum Ausgang zu begeben.""",
        "ziele": [2, 3]
    },
    {
        "id": 2,
        "auswahlText": "Du schaust dir ganz schnell noch den Nebenraum an?",
        "text": """Du gehst noch schnell in den Gang, der von dem Hauptraum abzweigt.
Zahlreiche Artefakte einer vergangenen Epoche sind ausgestellt.
Du vergisst die Zeit und überhörst sogar den letzten Gong.
Plötzlich wird es dunkel, als alle Lichter ausgeschaltet werden.""",
        "ziele": [4]
    },
    {
        "id": 3,
        "auswahlText": "Du gehst zum Ausgang?",
        "text": """Du machst dich schnellen Schrittes auf den Weg zum Ausgang.
Du willst dich beeilen, doch durch deine große Hast rutschst du aus und stürzt.
Du schlägst mit dem Kopf auf und wirst bewusstlos.""",
        "ziele": [4]
    },
    {
        "id": 4,
        "auswahlText": "In die Dunkelheit?",
        "text": """Es ist vollkommen dunkel.
Für einen Moment bist du orientierungslos.
Du tastest nach deinem Handy, um Licht zu machen,
als du Geräusche hörst. Sie kommen offenbar aus einem Nebenraum.""",
        "ziele": [7]
    },
    {
        "id": 7,
        "auswahlText": "Du folgst den Geräuschen?",
        "text": """Das ist das Ende. Erst mal.""",
        "ziele": []
    }
]


# Finde den Text für eine Auswahl
def finde_auswahl(gesuchte_id):
    for s in geschichte:
        if s["id"] == gesuchte_id:
            return s["auswahlText"]
    return None


aktuelle_id = 0

while True:
    # aktuellen Abschnitt finden
    for abschnitt in geschichte:
        if abschnitt["id"] == aktuelle_id:
            aktueller_abschnitt = abschnitt
            break

    # Text anzeigen
    print("\n" + "-" * 50)
    print(aktueller_abschnitt["text"])
    print("-" * 50)

    # Wenn keine Ziele → Ende
    if not aktueller_abschnitt["ziele"]:
        print("\n*** ENDE ***")
        break

    # Auswahlmöglichkeiten anzeigen
    print("\nWas möchtest du tun?")
    for index, ziel_id in enumerate(aktueller_abschnitt["ziele"], start=1):
        print(f"{index}. {finde_auswahl(ziel_id)}")

    # Eingabe
    auswahl = input("\nDeine Wahl: ")

    # Eingabe prüfen
    if not auswahl.isdigit():
        print("Bitte eine Zahl eingeben.")
        continue

    auswahl = int(auswahl)
    if auswahl < 1 or auswahl > len(aktueller_abschnitt["ziele"]):
        print("Ungültige Auswahl.")
        continue

    # neuen Abschnitt setzen
    aktuelle_id = aktueller_abschnitt["ziele"][auswahl - 1]



# Seite 271 – Textadventure reloaded mit »pygame«

import pygame
pygame.init()

# Fenster
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Text-Adventure")

# Farben und Schrift
BROWN = (150, 111, 51)
SCREEN_BG = (34, 34, 34)
TEXT_COLOR = (251, 198, 36)
FONT = pygame.font.SysFont("courier", 18, bold=True)

# --- DATENSTRUKTUR --------------------------------------------------------
geschichte = [
    {
        "id": 0,
        "auswahlText": "Im Museum",
        "text": """*** Die Mumie des Schreckens ***
Ein Textadventure
Version 2.15 Pug-Software""",
        "ziele": [1]
    },
    {
        "id": 1,
        "auswahlText": "Du betrittst das Museum",
        "text": """Du bist viel zu spät in das alte Museum gekommen.
Dir bleibt nur noch wenig Zeit, bis das Museum schließt.
Der erste Gong ist ertönt, Zeit, sich zum Ausgang zu begeben.""",
        "ziele": [2, 3]
    },
    {
        "id": 2,
        "auswahlText": "Du schaust dir ganz schnell noch den Nebenraum an?",
        "text": """Du gehst noch schnell in den Gang, der vom Hauptraum abzweigt.
Zahlreiche Artefakte einer vergangenen Epoche sind ausgestellt.
Du vergisst die Zeit und überhörst sogar den letzten Gong.
Plötzlich wird es dunkel, als alle Lichter ausgeschaltet werden.""",
        "ziele": [4]
    },
    {
        "id": 3,
        "auswahlText": "Du gehst zum Ausgang?",
        "text": """Du machst dich schnellen Schrittes auf den Weg zum Ausgang.
Du willst dich beeilen, doch durch deine große Hast rutschst du aus und stürzt.
Du schlägst mit dem Kopf auf und wirst bewusstlos.""",
        "ziele": [4]
    },
    {
        "id": 4,
        "auswahlText": "In die Dunkelheit?",
        "text": """Es ist vollkommen dunkel.
Für einen Moment bist du orientierungslos.
Du tastest nach deinem Handy, um Licht zu machen,
als du Geräusche hörst. Sie kommen offenbar aus einem Nebenraum.""",
        "ziele": [7]
    },
    {
        "id": 7,
        "auswahlText": "Du folgst den Geräuschen?",
        "text": """Das ist das Ende. Erst mal.""",
        "ziele": []
    }
]

# --- HILFSFUNKTIONEN ----------------------------------------------------
def finde_auswahl(gesuchte_id):
    """Gibt den Auswahltitel zu einer ID zurück."""
    for s in geschichte:
        if s["id"] == gesuchte_id:
            return s["auswahlText"]
    return None


def draw_text(surface, text, x, y, font):
    """Mehrzeiligen Text zeichnen."""
    lines = text.split("\n")
    for line in lines:
        rendered = font.render(line, True, TEXT_COLOR)
        surface.blit(rendered, (x, y))
        y += rendered.get_height() + 5


def draw_button(surface, text, x, y):
    """Klickbarer Button."""
    rendered = FONT.render("> " + text, True, TEXT_COLOR)

    w = rendered.get_width() + 20
    h = rendered.get_height() + 10
    rect = pygame.Rect(x, y, w, h)

    pygame.draw.rect(surface, SCREEN_BG, rect, border_radius=8)
    surface.blit(rendered, (rect.x + 10, rect.y + 5))

    return rect


# --- HAUPTSCHLEIFE ------------------------------------------------------
aktuelle_id = 0
running = True

while running:

    # Hintergrund
    screen.fill(BROWN)
    box = pygame.Rect(60, 60, 680, 400)
    pygame.draw.rect(screen, SCREEN_BG, box, border_radius=15)

    # aktuellen Abschnitt finden
    for abschnitt in geschichte:
        if abschnitt["id"] == aktuelle_id:
            situation = abschnitt
            break

    # Text zeichnen
    draw_text(screen, situation["text"], box.x + 20, box.y + 20, FONT)

    # Buttons zeichnen
    buttons = []
    start_y = box.y + 220

    for ziel in situation["ziele"]:
        text = finde_auswahl(ziel)
        rect = draw_button(screen, text, box.x + 20, start_y)
        buttons.append((rect, ziel))
        start_y += 60

    pygame.display.flip()

    # Events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            break

        if event.type == pygame.MOUSEBUTTONDOWN:
            mx, my = event.pos
            for rect, ziel in buttons:
                if rect.collidepoint(mx, my):
                    aktuelle_id = ziel

pygame.quit()
