diff --git a/.gitignore b/.gitignore index 877ff42..1c9118c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,7 @@ venv/ __pycache__/ *.pyc +# SQLite-Datenbank entsteht auf dem Server (untracked) – nie committen, +# sonst würde ein Deploy die Server-Datenbank überschreiben +*.db + diff --git a/api.html b/api.html index 31be829..8429ccc 100644 --- a/api.html +++ b/api.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Adventure Kommentare diff --git a/app.py b/app.py index 2c3a9c5..eba2b61 100644 --- a/app.py +++ b/app.py @@ -1,7 +1,19 @@ -from flask import Flask, request, redirect +import os +import sqlite3 +from flask import Flask, request, redirect, session from datetime import datetime, timezone, timedelta app = Flask(__name__) +app.secret_key = "octan-tower-kragle-everything-is-awesome-2026" # für session (Adventure-Fortschritt) + +# ─── SQLite-Datenbank (U18) ────────────────────────────────────────────────── +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +DB_PATH = os.path.join(BASE_DIR, "adventure.db") + +def get_db(): + db = sqlite3.connect(DB_PATH) + db.row_factory = sqlite3.Row # Spalten per Name ansprechen + return db # ─── Zeitzone: CEST (UTC+2) ────────────────────────────────────────────────── BERLIN = timezone(timedelta(hours=2)) @@ -87,6 +99,7 @@ def seite(inhalt):
diff --git a/galerie.html b/galerie.html index 6e9b8c1..b691dfb 100644 --- a/galerie.html +++ b/galerie.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Adventure Kommentare diff --git a/impressum.html b/impressum.html index af1ff4d..d0e374a 100644 --- a/impressum.html +++ b/impressum.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Adventure Kommentare diff --git a/index.html b/index.html index c563d95..5e0d94a 100644 --- a/index.html +++ b/index.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Adventure Kommentare diff --git a/init_db.py b/init_db.py new file mode 100644 index 0000000..97b6ec2 --- /dev/null +++ b/init_db.py @@ -0,0 +1,144 @@ +""" +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) + +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, + ist_ziel INTEGER DEFAULT 0 +); + +CREATE TABLE ausgaenge ( + von_raum INTEGER, + richtung TEXT, + nach_raum INTEGER +); + +CREATE TABLE fragen ( + id INTEGER PRIMARY KEY, + raum_id INTEGER, + frage TEXT, + antwort TEXT, + optionen TEXT -- Antwortmöglichkeiten, per | getrennt +); +""") + +# ─── Räume: der Aufstieg durch den Octan-Tower ─────────────────────────────── +raeume = [ + (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), + + (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), + + (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), + + (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), + + (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), +] +db.executemany( + "INSERT INTO raeume (id, name, beschreibung, ist_ziel) VALUES (?,?,?,?)", + raeume, +) + +# ─── Ausgänge: linearer Aufstieg (jede Etage → nächste Etage) ──────────────── +ausgaenge = [ + (1, "Aufzug nach oben 🛗", 2), + (2, "Treppe hoch 🪜", 3), + (3, "Treppe hoch 🪜", 4), + (4, "Aufs Dach 🏢", 5), +] +db.executemany( + "INSERT INTO ausgaenge (von_raum, richtung, nach_raum) 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: Haie ───────────────────────────────────────────── + (2, "🦈 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?", + "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"), + + # ── Etage 2: Laser ──────────────────────────────────────────── + (3, "🔴 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?", + "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"), + + # ── Etage 3: Laserhaie ──────────────────────────────────────── + (4, "🦈⚡ 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, "🧙 Welches Zauberer-Internat besucht Harry Potter?", + "Hogwarts", "Narnia|Hogwarts|Mordor"), +] +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)) diff --git a/kanban.html b/kanban.html index eec8063..5cacca1 100644 --- a/kanban.html +++ b/kanban.html @@ -43,6 +43,7 @@ API Demo Kanban Quiz + Adventure Kommentare diff --git a/kontakt.html b/kontakt.html index d30f297..009d8f7 100644 --- a/kontakt.html +++ b/kontakt.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Adventure Kommentare diff --git a/notenrechner.html b/notenrechner.html index 799ff6c..674ecbb 100644 --- a/notenrechner.html +++ b/notenrechner.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Adventure Kommentare diff --git a/quiz.html b/quiz.html index faa335b..253a329 100644 --- a/quiz.html +++ b/quiz.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Adventure Kommentare diff --git a/team.html b/team.html index 9231e36..3e122f4 100644 --- a/team.html +++ b/team.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Adventure Kommentare diff --git a/textanalyse.html b/textanalyse.html index 726dd80..41e3770 100644 --- a/textanalyse.html +++ b/textanalyse.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Adventure Kommentare diff --git a/ueber_uns.html b/ueber_uns.html index ea810cb..f55493b 100644 --- a/ueber_uns.html +++ b/ueber_uns.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Adventure Kommentare