U18: Verzweigtes Verlies mit Richtungslogik – Gänge (links/rechts), richtiger Weg = Themenfragen -> nächste Etage, falscher Weg = Trivia -> Sackgasse -> zurück, Finale = Lord-Business-Frage

This commit is contained in:
David Kertzscher 2026-07-01 13:39:55 +00:00
parent f9f532b7b0
commit ef336090db
2 changed files with 290 additions and 114 deletions

188
app.py
View file

@ -157,6 +157,12 @@ def adventure_seite(inhalt, akzent="#f59e0b"):
border:1px solid #334155; border-radius:10px; padding:12px 18px;
margin:6px 8px 0 0; }
.ghost-link:hover { background:#0f172a; }
.pfade { display:flex; flex-direction:column; gap:14px; margin-top:8px; }
.pfad { background:#0f172a; border:1px solid #334155; border-radius:12px;
padding:14px 16px; transition:.15s; }
.pfad:hover { border-color:ACCENT; transform:translateY(-1px); }
.pfad .exit-link { margin:0 0 6px 0; }
.pfad-hinweis { display:block; color:#94a3b8; font-size:14px; }
.feedback-bad { background:#7f1d1d; border:1px solid #b91c1c; color:#fecaca;
border-radius:10px; padding:12px 14px; margin-bottom:16px; font-weight:600; }
.win-emoji { font-size:54px; text-align:center; margin-bottom:8px; }
@ -190,8 +196,12 @@ def start():
das <strong>Kragle</strong> und will damit die ganze Welt für immer festkleben.
Nur du kannst ihn stoppen! Kämpf dich Etage für Etage nach oben: vorbei an
<strong>Haien</strong> 🦈, <strong>Lasern</strong> 🔴 und natürlich
<strong>Laserhaien</strong> 🦈. Auf jeder Etage prüfen dich die Sicherheits­systeme
mit Trivia-Fragen. Nur wer alle knackt, kommt weiter.</p>
<strong>Laserhaien</strong> 🦈.</p>
<p class="adv-desc">Jede Etage ist ein Gang, der sich gabelt. <strong>Lies die
Hinweise genau!</strong> Der <strong>richtige Weg</strong> stellt dir ein paar
thematische Fragen und führt direkt eine Etage höher. Der <strong>falsche Weg</strong>
endet nach einem Haufen wirrer Trivia in einer <strong>Sackgasse</strong> dann
heißt es: umkehren! Ganz oben wartet die letzte Frage zu Präsident Business.</p>
<a href="/app/raum/1" class="exit-link">Abenteuer starten </a>
<p class="muted">Lieber quatschen statt einbrechen?
<a href="/app/pinnwand">Zu den Kommentaren </a></p>
@ -216,85 +226,147 @@ def raum(id):
'<p class="adv-desc">Da hat sich wohl ein Bauplan verheddert.</p>'
'<a href="/app/" class="exit-link">Zurück zum Start</a></div>')
fragen = db.execute(
"SELECT * FROM fragen WHERE raum_id=? ORDER BY id", (id,)
).fetchall()
typ = r["typ"]
prog_key = "raum_%d_idx" % id
idx = session.get(prog_key, 0)
# ═══ Räume mit Fragen: thema (richtig) · sackgasse (falsch) · ziel (Finale) ═══
if typ in ("thema", "sackgasse", "ziel"):
fragen = db.execute(
"SELECT * FROM fragen WHERE raum_id=? ORDER BY id", (id,)
).fetchall()
prog_key = "raum_%d_idx" % id
idx = session.get(prog_key, 0)
# ── Es sind noch Sicherheitsfragen offen ──
if fragen and idx < len(fragen):
aktuelle = fragen[idx]
feedback = ""
if request.method == "POST":
gewaehlt = request.form.get("antwort", "").strip()
if gewaehlt.lower() == aktuelle["antwort"].strip().lower():
session[prog_key] = idx + 1
session.modified = True
db.close()
return redirect("/app/raum/%d" % id)
feedback = ('<div class="feedback-bad">🚨 Alarm! Falsche Antwort '
'die Wächter wurden fast auf dich aufmerksam. Versuch es nochmal.</div>')
optionen = aktuelle["optionen"].split("|")
db.close()
# ── Noch offene Fragen → nächste Frage zeigen ──
if fragen and idx < len(fragen):
aktuelle = fragen[idx]
feedback = ""
if request.method == "POST":
gewaehlt = request.form.get("antwort", "").strip()
if gewaehlt.lower() == aktuelle["antwort"].strip().lower():
session[prog_key] = idx + 1
session.modified = True
db.close()
return redirect("/app/raum/%d" % id)
if typ == "sackgasse":
feedback = ('<div class="feedback-bad">❌ Falsch und der '
'Prüf-Automat fragt einfach stur weiter. Nochmal!</div>')
else:
feedback = ('<div class="feedback-bad">🚨 Alarm! Falsche Antwort '
'die Wächter werden fast auf dich aufmerksam. Nochmal!</div>')
optionen = aktuelle["optionen"].split("|")
db.close()
buttons = ""
for opt in optionen:
buttons += ('<button class="opt-btn" name="antwort" value="%s">%s</button>'
% (esc(opt), esc(opt)))
inhalt = ("""
buttons = ""
for opt in optionen:
buttons += ('<button class="opt-btn" name="antwort" value="%s">%s</button>'
% (esc(opt), esc(opt)))
if typ == "sackgasse":
label = "🚧 Falscher Weg · %s" % esc(r["name"])
elif typ == "ziel":
label = "🧱 FINALE · %s" % esc(r["name"])
else:
label = "🔐 Sicherheitsprüfung · %s" % esc(r["name"])
inhalt = ("""
<div class="adv-card">
<div class="adv-floor">🔐 Sicherheitsprüfung · %s</div>
<div class="adv-floor">%s</div>
<h1>%s</h1>
<p class="adv-desc">%s</p>
<p class="adv-progress">Frage %d von %d</p>
%s
<p class="adv-frage">%s</p>
<form method="post" class="opt-form">%s</form>
</div>""" % (esc(r["name"]), esc(r["name"]), idx + 1, len(fragen),
feedback, esc(aktuelle["frage"]), buttons))
return adventure_seite(inhalt)
</div>""" % (label, esc(r["name"]), esc(r["beschreibung"]),
idx + 1, len(fragen), feedback,
esc(aktuelle["frage"]), buttons))
return adventure_seite(inhalt)
# ── Alle Fragen gelöst (oder keine) → Beschreibung + Ausgänge / Sieg ──
ausgaenge = db.execute(
"SELECT richtung, nach_raum FROM ausgaenge WHERE von_raum=? ORDER BY rowid", (id,)
).fetchall()
db.close()
# ── Alle Fragen dieses Raums beantwortet ──
ausgaenge = db.execute(
"SELECT richtung, nach_raum, hinweis FROM ausgaenge "
"WHERE von_raum=? ORDER BY rowid", (id,)
).fetchall()
db.close()
if r["ist_ziel"]:
inhalt = ("""
# ZIEL erreicht → Sieg
if typ == "ziel":
inhalt = ("""
<div class="adv-card" style="text-align:center">
<div class="win-emoji">🎉🧱🎉</div>
<div class="adv-floor">Mission erfüllt</div>
<h1>%s</h1>
<h1>Befreit!</h1>
<p class="adv-desc">%s</p>
<p class="adv-frage" style="color:#f59e0b">Everything is awesome! 🎵</p>
<a href="/app/" class="exit-link">Nochmal spielen 🔁</a>
<a href="/app/pinnwand" class="ghost-link">Sieg in den Kommentaren feiern 💬</a>
</div>""" % (esc(r["name"]), esc(r["beschreibung"])))
return adventure_seite(inhalt)
</div>""" % esc(r["beschreibung"]))
return adventure_seite(inhalt)
exits_html = ""
for a in ausgaenge:
exits_html += ('<a class="exit-link" href="/app/raum/%d">%s</a>'
% (a["nach_raum"], esc(a["richtung"])))
if not ausgaenge:
exits_html = '<a class="exit-link" href="/app/">Zurück zum Start</a>'
geschafft = ""
if fragen: # Etage hatte Fragen und alle wurden gelöst
geschafft = ('<p class="adv-progress">✅ Alle Sicherheitsfragen geknackt '
'der Weg ist frei!</p>')
inhalt = ("""
# SACKGASSE → "Haha, Sackgasse!" + zurück zum Gang
if typ == "sackgasse":
zurueck = ausgaenge[0] if ausgaenge else None
back_btn = (
'<a class="exit-link" href="/app/raum/%d">%s</a>'
% (zurueck["nach_raum"], esc(zurueck["richtung"]))
if zurueck else
'<a class="exit-link" href="/app/">Zurück zum Start</a>')
inhalt = ("""
<div class="adv-card">
<div class="adv-floor">🏢 %s</div>
<div class="adv-floor">🚧 Sackgasse</div>
<h1>Haha Sackgasse!</h1>
<p class="adv-desc">Du hast dich durch einen ganzen Haufen Trivia gequält
und stehst jetzt vor einer kahlen Wand. <strong>Das war der falsche Weg!</strong>
Geh zurück in den Gang und nimm die andere Richtung.</p>
%s
</div>""" % back_btn)
return adventure_seite(inhalt)
# THEMA gelöst → Erfolg + Ausgang zur nächsten Etage
weiter = ausgaenge[0] if ausgaenge else None
weiter_btn = (
'<a class="exit-link" href="/app/raum/%d">%s</a>'
% (weiter["nach_raum"], esc(weiter["richtung"]))
if weiter else
'<a class="exit-link" href="/app/">Zurück zum Start</a>')
inhalt = ("""
<div class="adv-card">
<div class="adv-floor"> Richtiger Weg</div>
<h1>%s</h1>
<p class="adv-desc">%s</p>
<p class="adv-progress"> Alle Fragen geknackt der Weg nach oben ist frei!</p>
%s
<div>%s</div>
</div>""" % (esc(r["name"]), esc(r["name"]), esc(r["beschreibung"]),
geschafft, exits_html))
</div>""" % (esc(r["name"]), esc(r["beschreibung"]), weiter_btn))
return adventure_seite(inhalt)
# ═══ Gang / Start: Beschreibung + Wege (Navigations-Entscheidung) ═══
ausgaenge = db.execute(
"SELECT richtung, nach_raum, hinweis FROM ausgaenge "
"WHERE von_raum=? ORDER BY rowid", (id,)
).fetchall()
db.close()
wege_html = ""
for a in ausgaenge:
wege_html += ("""
<div class="pfad">
<a class="exit-link" href="/app/raum/%d">%s</a>
<span class="pfad-hinweis">%s</span>
</div>""" % (a["nach_raum"], esc(a["richtung"]), esc(a["hinweis"] or "")))
if not ausgaenge:
wege_html = '<a class="exit-link" href="/app/">Zurück zum Start</a>'
if r["etage"] and r["etage"] > 0:
etage_label = "🏢 Etage %d" % r["etage"]
else:
etage_label = "🚪 Eingang"
inhalt = ("""
<div class="adv-card">
<div class="adv-floor">%s</div>
<h1>%s</h1>
<p class="adv-desc">%s</p>
<div class="pfade">%s</div>
</div>""" % (etage_label, esc(r["name"]), esc(r["beschreibung"]), wege_html))
return adventure_seite(inhalt)

View file

@ -1,10 +1,26 @@
"""
U18 Klick-Adventure "Einbruch im Octan-Tower" (The-Lego-Movie-Style)
=====================================================================
Legt die SQLite-Datenbank `adventure.db` an und befüllt sie mit:
- raeume : die Etagen des Octan-Towers
- ausgaenge : welcher Ausgang führt in welche Etage
- fragen : Trivia-Fragen pro Etage (Multiple-Choice)
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:
@ -31,13 +47,15 @@ CREATE TABLE raeume (
id INTEGER PRIMARY KEY,
name TEXT,
beschreibung TEXT,
ist_ziel INTEGER DEFAULT 0
typ TEXT, -- 'start' | 'gang' | 'thema' | 'sackgasse' | 'ziel'
etage INTEGER -- 0 = Lobby, 1..3 = Etagen, 4 = Dach
);
CREATE TABLE ausgaenge (
von_raum INTEGER,
richtung TEXT,
nach_raum INTEGER
richtung TEXT, -- kurzer Button-Text, z. B. "⬅️ Nach links"
nach_raum INTEGER,
hinweis TEXT -- Story-Hinweis unter dem Button
);
CREATE TABLE fragen (
@ -49,47 +67,105 @@ CREATE TABLE fragen (
);
""")
# ─── Räume: der Aufstieg durch den Octan-Tower ───────────────────────────────
# ─── Räume ───────────────────────────────────────────────────────────────────
# IDs bewusst gruppiert: 1 = Lobby, 10er = Etage 1, 20er = Etage 2, 30er = Etage 3.
raeume = [
# ---- Start ----
(1, "Lobby des Octan-Towers",
"Die Türen fallen hinter dir zu. Präsident Business' Wolkenkratzer ragt "
"über dir auf. Ein gläserner Aufzug führt nach oben ganz oben wartet das "
"Kragle. Everything is ... noch nicht awesome.", 0),
"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),
(2, "1. Etage Die Hai-Etage 🦈",
"Ein tiefer Wassergraben voller hungriger Haie trennt dich vom nächsten "
"Aufzug. Der Sicherheits-Wächter lässt dich nur weiter, wenn du seine "
"Fragen richtig beantwortest.", 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),
(3, "2. Etage Die Laser-Etage 🔴",
"Rote Laserstrahlen zerschneiden den Raum zu einem glühenden Gitter. Ein "
"Terminal blinkt: Beantworte die Fragen korrekt, sonst bleibt das "
"Laser-Gitter für immer aktiv.", 0),
# ---- 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),
(4, "3. Etage Die Laserhai-Etage 🦈⚡",
"Und dann ... Haie. Mit Laserstrahlen. Auf dem Kopf. Präsident Business "
"meint es wirklich ernst. Nur wer clever genug ist, kommt am "
"Laserhai-Becken vorbei.", 0),
# ---- 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),
(5, "Das Dach Der Kragle-Tresor 🏆",
"Du stehst vor dem Kragle ein einziger Klecks Kleber, der die ganze "
"Welt für immer einfrieren könnte. Doch du hast es rechtzeitig geschafft "
"und Präsident Business gestoppt!", 1),
# ---- 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, ist_ziel) VALUES (?,?,?,?)",
"INSERT INTO raeume (id, name, beschreibung, typ, etage) VALUES (?,?,?,?,?)",
raeume,
)
# ─── Ausgänge: linearer Aufstieg (jede Etage → nächste Etage) ────────────────
# ─── 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 = [
(1, "Aufzug nach oben 🛗", 2),
(2, "Treppe hoch 🪜", 3),
(3, "Treppe hoch 🪜", 4),
(4, "Aufs Dach 🏢", 5),
# 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) VALUES (?,?,?)",
"INSERT INTO ausgaenge (von_raum, richtung, nach_raum, hinweis) VALUES (?,?,?,?)",
ausgaenge,
)
@ -97,38 +173,66 @@ db.executemany(
# Pro Etage 4 Fragen: 12 thematisch passend, danach Popkultur.
# "antwort" ist die korrekte Option, "optionen" alle Auswahlmöglichkeiten (|-getrennt).
fragen = [
# ── Etage 1: Haie ─────────────────────────────────────────────
(2, "🦈 Welcher Hai ist der größte Fisch der Welt?",
# ── Etage 1 · RICHTIG: Hai-Fragen (Raum 11) ──────────────────
(11, "🦈 Welcher Hai ist der größte Fisch der Welt?",
"Walhai", "Weißer Hai|Walhai|Hammerhai"),
(2, "🦈 Wie heißt Steven Spielbergs berühmter Hai-Film von 1975?",
(11, "🦈 Wie heißt Steven Spielbergs berühmter Hai-Film von 1975?",
"Der weiße Hai", "Der weiße Hai|Free Willy|Findet Nemo"),
(2, "🎮 Wie heißt Marios grün gekleideter Bruder?",
"Luigi", "Luigi|Wario|Yoshi"),
(2, "🎬 In welcher Weltraum-Saga kämpfen Jedi gegen Sith?",
"Star Wars", "Star Trek|Star Wars|Herr der Ringe"),
(11, "🦈 Womit atmen Haie unter Wasser?",
"Kiemen", "Lungen|Kiemen|Schwimmflossen"),
# ── Etage 2: Laser ────────────────────────────────────────────
(3, "🔴 Wofür steht das Akronym LASER?",
# ── 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"),
(3, "⚔️ Welche leuchtende Laser-Waffe führt ein Jedi in Star Wars?",
"Leuchtende Aktive Strahlen-Emissions-Röhre"),
(21, "⚔️ Welche leuchtende Laser-Waffe führt ein Jedi in Star Wars?",
"Lichtschwert", "Lichtschwert|Laserpistole|Zauberstab"),
(3, "🦸 Welcher Superheld trägt ein blaues Kostüm mit rotem Umhang und einem 'S'?",
"Superman", "Batman|Superman|Spider-Man"),
(3, "🎮 In welchem Spiel fängt man Kreaturen in kleinen Bällen?",
"Pokémon", "Minecraft|Tetris|Pokémon"),
(21, "🌈 Welche Farbe hat ein klassischer Laserpointer meistens?",
"Rot", "Rot|Lila|Schwarz"),
# ── Etage 3: Laserhaie ────────────────────────────────────────
(4, "🦈⚡ In welchem Film wünscht sich Dr. Evil „Haie mit Laserstrahlen auf dem Kopf“?",
# ── 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"),
(4, "🧱 Wie heißt der Bösewicht, in dessen Turm du gerade einbrichst?",
"Lord Business", "Lord Business|Lord Vader|Lord Farquaad"),
(4, "🎵 Wie lautet der Ohrwurm-Titelsong aus „The Lego Movie“?",
"Everything Is Awesome", "Everything Is Awesome|Let It Go|Happy"),
(4, "<EFBFBD> In welchem Film-Franchise werden Dinosaurier in einem Park geklont?",
(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 (?,?,?,?)",