248 lines
12 KiB
Python
248 lines
12 KiB
Python
"""
|
||
U18 – Klick-Adventure "Einbruch im Octan-Tower" (The-Lego-Movie-Style)
|
||
=====================================================================
|
||
Legt die SQLite-Datenbank `adventure.db` an und befüllt sie mit einem
|
||
verzweigten Verlies:
|
||
|
||
- raeume : Räume/Gänge des Octan-Towers (mit Typ: start/gang/thema/
|
||
sackgasse/ziel)
|
||
- ausgaenge : welcher Weg (links/rechts/…) führt in welchen Raum – inkl.
|
||
Story-Hinweis für die Entscheidung
|
||
- fragen : Fragen pro Raum
|
||
• Themen-Räume → thematische Fragen (der RICHTIGE Weg)
|
||
• Sackgassen → themenfremde Trivia (der FALSCHE Weg)
|
||
• Ziel-Raum → die finale Lord-Business-Frage
|
||
|
||
Spielprinzip
|
||
------------
|
||
Jede Etage ist ein Gang, der sich gabelt. Nach den Text-Hinweisen entscheidet
|
||
man sich für links oder rechts:
|
||
• RICHTIGER Weg → wenige thematische Fragen → direkt eine Etage höher.
|
||
• FALSCHER Weg → viele themenfremde Trivia → "Haha, Sackgasse!" → zurück
|
||
zum Gang, dann den richtigen Weg nehmen.
|
||
Ganz oben wartet der Kragle-Tresor mit der finalen Lord-Business-Frage.
|
||
|
||
Leitprinzip (wie in U17):
|
||
LOKAL schreiben & pushen – auf dem SERVER einmalig ausführen:
|
||
python3 init_db.py
|
||
Danach entsteht adventure.db direkt neben diesem Skript.
|
||
"""
|
||
import os
|
||
import sqlite3
|
||
|
||
# adventure.db immer neben dieser Datei ablegen (unabhängig vom Arbeitsverzeichnis)
|
||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||
DB_PATH = os.path.join(BASE_DIR, "adventure.db")
|
||
|
||
db = sqlite3.connect(DB_PATH)
|
||
|
||
# Tabellen bei jedem Lauf sauber neu aufbauen (DROP statt DELETE, damit auch
|
||
# geänderte Spalten greifen).
|
||
db.executescript("""
|
||
DROP TABLE IF EXISTS raeume;
|
||
DROP TABLE IF EXISTS ausgaenge;
|
||
DROP TABLE IF EXISTS fragen;
|
||
|
||
CREATE TABLE raeume (
|
||
id INTEGER PRIMARY KEY,
|
||
name TEXT,
|
||
beschreibung TEXT,
|
||
typ TEXT, -- 'start' | 'gang' | 'thema' | 'sackgasse' | 'ziel'
|
||
etage INTEGER -- 0 = Lobby, 1..3 = Etagen, 4 = Dach
|
||
);
|
||
|
||
CREATE TABLE ausgaenge (
|
||
von_raum INTEGER,
|
||
richtung TEXT, -- kurzer Button-Text, z. B. "⬅️ Nach links"
|
||
nach_raum INTEGER,
|
||
hinweis TEXT -- Story-Hinweis unter dem Button
|
||
);
|
||
|
||
CREATE TABLE fragen (
|
||
id INTEGER PRIMARY KEY,
|
||
raum_id INTEGER,
|
||
frage TEXT,
|
||
antwort TEXT,
|
||
optionen TEXT -- Antwortmöglichkeiten, per | getrennt
|
||
);
|
||
""")
|
||
|
||
# ─── Räume ───────────────────────────────────────────────────────────────────
|
||
# IDs bewusst gruppiert: 1 = Lobby, 10er = Etage 1, 20er = Etage 2, 30er = Etage 3.
|
||
raeume = [
|
||
# ---- Start ----
|
||
(1, "Lobby des Octan-Towers",
|
||
"Die gläsernen Türen fallen hinter dir zu – kein Zurück. Über dir ragt der "
|
||
"Wolkenkratzer von Präsident Business auf. Ganz oben, im Kragle-Tresor, "
|
||
"wartet der gefährlichste Kleber der Welt. Ein einzelner Aufzug führt nach "
|
||
"oben. Zeit, ihn zu stoppen.",
|
||
"start", 0),
|
||
|
||
# ---- Etage 1: Haie (richtiger Weg = LINKS → 11, Sackgasse = RECHTS → 12) ----
|
||
(10, "1. Etage – Der Hai-Gang 🦈",
|
||
"Der Aufzug öffnet sich. Der Gang gabelt sich in zwei Richtungen. Von "
|
||
"LINKS weht feuchte, salzige Luft herüber – dort muss das riesige "
|
||
"Haibecken sein, das du überqueren musst. Von RECHTS blinkt in kaltem Rot "
|
||
"ein Schild: „Nur Personal – Abstellkammer“.",
|
||
"gang", 1),
|
||
(11, "Steg über dem Haibecken 🦈",
|
||
"Du folgst der salzigen Luft. Unter dem schmalen Steg schnappen hungrige "
|
||
"Haie. Das Sicherheitssystem summt: Beweise dein Hai-Wissen, sonst fährt "
|
||
"der Steg ein!",
|
||
"thema", 1),
|
||
(12, "Die Abstellkammer 🧹",
|
||
"Du drückst die Tür auf – Besen, Eimer, ein flackernder Wartungs-Bot. "
|
||
"„HALT! Sicherheits-Quiz!“, quäkt er und stellt dir eine Frage nach der "
|
||
"anderen …",
|
||
"sackgasse", 1),
|
||
|
||
# ---- Etage 2: Laser (richtiger Weg = RECHTS → 21, Sackgasse = LINKS → 22) ----
|
||
(20, "2. Etage – Der Laser-Gang 🔴",
|
||
"Rote Strahlen zerschneiden die Luft zu einem glühenden Gitter. LINKS "
|
||
"gähnt ein dunkler Wartungsschacht, aus dem es muffig nach Staub riecht. "
|
||
"RECHTS pulsiert Licht hinter einer Tür mit der Aufschrift "
|
||
"„Laser-Kontrollraum“.",
|
||
"gang", 2),
|
||
(21, "Der Laser-Kontrollraum 🔴",
|
||
"Im Kontrollraum flimmern hundert Regler. Wer die Laser abschalten will, "
|
||
"muss beweisen, dass er versteht, wie sie funktionieren.",
|
||
"thema", 2),
|
||
(22, "Der Wartungsschacht 🕳️",
|
||
"Eng, dunkel, staubig – und natürlich eine Sackgasse. Bevor du das merkst, "
|
||
"erwacht ein alter Prüf-Automat und feuert Trivia auf dich ab …",
|
||
"sackgasse", 2),
|
||
|
||
# ---- Etage 3: Laserhaie (richtiger Weg = LINKS → 31, Sackgasse = RECHTS → 32) ----
|
||
(30, "3. Etage – Der Laserhai-Gang 🦈⚡",
|
||
"Absurd, aber real: Haie. Mit Lasern. Auf dem Kopf. LINKS führt ein "
|
||
"schmaler Steg direkt über das Laserhai-Becken – da musst du durch. RECHTS "
|
||
"lockt ein gemütlicher Pausenraum, aus dem Kaffeeduft strömt.",
|
||
"gang", 3),
|
||
(31, "Steg über dem Laserhai-Becken 🦈⚡",
|
||
"Unter dir kreisen die Laserhaie und zwinkern gefährlich. Das letzte "
|
||
"Sicherheitssystem vor dem Dach will dich prüfen – bleib cool!",
|
||
"thema", 3),
|
||
(32, "Der Pausenraum ☕",
|
||
"Warm, gemütlich, verlockend … und eine glasklare Falle. Der Kaffeeautomat "
|
||
"entpuppt sich als Quiz-Maschine und lässt dich nicht mehr los …",
|
||
"sackgasse", 3),
|
||
|
||
# ---- Dach: Ziel ----
|
||
(40, "Das Dach – Der Kragle-Tresor 🏆",
|
||
"Ganz oben. Vor dir schwebt das Kragle im offenen Tresor. Nur noch eine "
|
||
"letzte Sicherung von Präsident Business steht zwischen dir und der Rettung "
|
||
"der Welt.",
|
||
"ziel", 4),
|
||
]
|
||
db.executemany(
|
||
"INSERT INTO raeume (id, name, beschreibung, typ, etage) VALUES (?,?,?,?,?)",
|
||
raeume,
|
||
)
|
||
|
||
# ─── Ausgänge (mit Story-Hinweis) ────────────────────────────────────────────
|
||
# Gänge haben ZWEI Wege (richtig/falsch). Themen-Räume führen eine Etage höher,
|
||
# Sackgassen zurück zum jeweiligen Gang.
|
||
ausgaenge = [
|
||
# Lobby → Etage 1
|
||
(1, "🛗 Aufzug nach oben", 10, "Der einzige Weg führt nach oben."),
|
||
|
||
# Etage 1 (richtig = LINKS → 11, falsch = RECHTS → 12)
|
||
(10, "⬅️ Nach links", 11, "🌊 Der salzigen Meeresluft zum Haibecken folgen."),
|
||
(10, "➡️ Nach rechts", 12, "🚪 Durch die Tür „Abstellkammer“."),
|
||
(11, "🪜 Treppe zur 2. Etage", 20, "Der Steg hält – schnell weiter nach oben!"),
|
||
(12, "↩️ Zurück in den Hai-Gang", 10, "Diese Kammer ist eine Sackgasse."),
|
||
|
||
# Etage 2 (richtig = RECHTS → 21, falsch = LINKS → 22)
|
||
(20, "⬅️ Nach links", 22, "🕳️ In den dunklen Wartungsschacht."),
|
||
(20, "➡️ Nach rechts", 21, "🔴 Zum „Laser-Kontrollraum“."),
|
||
(21, "🪜 Treppe zur 3. Etage", 30, "Die Laser erlöschen – der Weg ist frei!"),
|
||
(22, "↩️ Zurück in den Laser-Gang", 20, "Der Schacht endet im Nichts."),
|
||
|
||
# Etage 3 (richtig = LINKS → 31, falsch = RECHTS → 32)
|
||
(30, "⬅️ Nach links", 31, "🌉 Über den Steg am Laserhai-Becken."),
|
||
(30, "➡️ Nach rechts", 32, "☕ In den gemütlichen Pausenraum."),
|
||
(31, "🏢 Aufs Dach zum Kragle-Tresor", 40, "Die Laserhaie tauchen ab – nach oben!"),
|
||
(32, "↩️ Zurück in den Laserhai-Gang", 30, "Der Pausenraum war eine Falle."),
|
||
]
|
||
db.executemany(
|
||
"INSERT INTO ausgaenge (von_raum, richtung, nach_raum, hinweis) VALUES (?,?,?,?)",
|
||
ausgaenge,
|
||
)
|
||
|
||
# ─── Trivia-Fragen pro Etage ─────────────────────────────────────────────────
|
||
# Pro Etage 4 Fragen: 1–2 thematisch passend, danach Popkultur.
|
||
# "antwort" ist die korrekte Option, "optionen" alle Auswahlmöglichkeiten (|-getrennt).
|
||
fragen = [
|
||
# ── Etage 1 · RICHTIG: Hai-Fragen (Raum 11) ──────────────────
|
||
(11, "🦈 Welcher Hai ist der größte Fisch der Welt?",
|
||
"Walhai", "Weißer Hai|Walhai|Hammerhai"),
|
||
(11, "🦈 Wie heißt Steven Spielbergs berühmter Hai-Film von 1975?",
|
||
"Der weiße Hai", "Der weiße Hai|Free Willy|Findet Nemo"),
|
||
(11, "🦈 Womit atmen Haie unter Wasser?",
|
||
"Kiemen", "Lungen|Kiemen|Schwimmflossen"),
|
||
|
||
# ── Etage 1 · FALSCH: themenfremde Trivia (Raum 12) ──────────
|
||
(12, "🎮 Wie heißt Marios grün gekleideter Bruder?",
|
||
"Luigi", "Luigi|Wario|Yoshi"),
|
||
(12, "🎬 In welcher Weltraum-Saga kämpfen Jedi gegen Sith?",
|
||
"Star Wars", "Star Trek|Star Wars|Herr der Ringe"),
|
||
(12, "📱 Welches Unternehmen stellt das iPhone her?",
|
||
"Apple", "Microsoft|Apple|Samsung"),
|
||
(12, "⏰ Wie viele Minuten hat eine Stunde?",
|
||
"60", "24|60|100"),
|
||
|
||
# ── Etage 2 · RICHTIG: Laser-Fragen (Raum 21) ────────────────
|
||
(21, "🔴 Wofür steht das Akronym LASER?",
|
||
"Light Amplification by Stimulated Emission of Radiation",
|
||
"Light Amplification by Stimulated Emission of Radiation|"
|
||
"Large Automatic System for Energy Reflection|"
|
||
"Leuchtende Aktive Strahlen-Emissions-Röhre"),
|
||
(21, "⚔️ Welche leuchtende Laser-Waffe führt ein Jedi in Star Wars?",
|
||
"Lichtschwert", "Lichtschwert|Laserpistole|Zauberstab"),
|
||
(21, "🌈 Welche Farbe hat ein klassischer Laserpointer meistens?",
|
||
"Rot", "Rot|Lila|Schwarz"),
|
||
|
||
# ── Etage 2 · FALSCH: themenfremde Trivia (Raum 22) ──────────
|
||
(22, "🦸 Welcher Superheld trägt ein blaues Kostüm mit rotem Umhang und „S“?",
|
||
"Superman", "Batman|Superman|Spider-Man"),
|
||
(22, "🎮 In welchem Spiel fängt man Kreaturen in kleinen Bällen?",
|
||
"Pokémon", "Minecraft|Tetris|Pokémon"),
|
||
(22, "🗼 Wie heißt die Hauptstadt von Frankreich?",
|
||
"Paris", "Paris|Rom|Madrid"),
|
||
(22, "🐶 Welches Tier bellt?",
|
||
"Hund", "Katze|Hund|Kuh"),
|
||
|
||
# ── Etage 3 · RICHTIG: Laserhai-Fragen (Raum 31) ─────────────
|
||
(31, "🦈⚡ In welchem Film wünscht sich Dr. Evil „Haie mit Laserstrahlen auf dem Kopf“?",
|
||
"Austin Powers", "James Bond|Austin Powers|Men in Black"),
|
||
(31, "🧬 Woraus setzt sich ein „Laserhai“ zusammen?",
|
||
"Hai und Laser", "Hai und Laser|Katze und Hund|Auto und Boot"),
|
||
(31, "😉 Wenn ein Laserhai gefährlich zwinkert – was schießt aus seinen Augen?",
|
||
"Laserstrahlen", "Wasser|Laserstrahlen|Konfetti"),
|
||
|
||
# ── Etage 3 · FALSCH: themenfremde Trivia (Raum 32) ──────────
|
||
(32, "🦖 In welchem Film-Franchise werden Dinosaurier in einem Park geklont?",
|
||
"Jurassic Park", "Jurassic Park|King Kong|Godzilla"),
|
||
(32, "🕷️ Wie viele Beine hat eine Spinne?",
|
||
"8", "6|8|10"),
|
||
(32, "🎨 Welche Farbe entsteht aus Blau und Gelb?",
|
||
"Grün", "Grün|Lila|Orange"),
|
||
(32, "🎮 Aus welchem Land kommt der Spielehersteller Nintendo?",
|
||
"Japan", "USA|Japan|Deutschland"),
|
||
|
||
# ── Dach · ZIEL: finale Lord-Business-Frage (Raum 40) ────────
|
||
(40, "🧱 FINALE: Wie heißt der Bösewicht, in dessen Turm du gerade eingebrochen bist?",
|
||
"Lord Business", "Lord Business|Lord Vader|Lord Farquaad"),
|
||
]
|
||
db.executemany(
|
||
"INSERT INTO fragen (raum_id, frage, antwort, optionen) VALUES (?,?,?,?)",
|
||
fragen,
|
||
)
|
||
|
||
db.commit()
|
||
db.close()
|
||
|
||
print("Datenbank adventure.db angelegt:", DB_PATH)
|
||
print(" Räume:", len(raeume),
|
||
"| Ausgänge:", len(ausgaenge),
|
||
"| Fragen:", len(fragen))
|