diff --git a/app/__pycache__/app.cpython-313.pyc b/app/__pycache__/app.cpython-313.pyc
new file mode 100644
index 0000000..d4c8bb2
Binary files /dev/null and b/app/__pycache__/app.cpython-313.pyc differ
diff --git a/app/app.py b/app/app.py
index f8393bf..841f938 100644
--- a/app/app.py
+++ b/app/app.py
@@ -1,38 +1,102 @@
import os
import sqlite3
-from flask import Flask, request
+import time
+from flask import Flask, redirect, request, session
app = Flask(__name__)
+app.secret_key = "escape-room-secret"
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
return db
+
+def get_highscores(limit=10):
+ db = get_db()
+ rows = db.execute(
+ """
+ SELECT name, fertig_zeit - start_zeit AS dauer
+ FROM spieler
+ WHERE fertig_zeit IS NOT NULL
+ ORDER BY dauer
+ LIMIT ?
+ """,
+ (limit,),
+ ).fetchall()
+ db.close()
+ return rows
+
+
@app.route("/", methods=["GET", "POST"])
@app.route("/app", methods=["GET", "POST"])
@app.route("/app/", methods=["GET", "POST"])
def start():
+ if request.method == "POST" and "spielername" in request.form:
+ name = request.form.get("spielername", "").strip() or "Unbekannt"
+ db = get_db()
+ cur = db.execute(
+ "INSERT INTO spieler (name, start_zeit, fertig_zeit) VALUES (?, ?, NULL)",
+ (name, time.time()),
+ )
+ db.commit()
+ db.close()
+ session["player_id"] = cur.lastrowid
+ session["player_name"] = name
+ return redirect("/app/?room=1")
+
room_id = request.args.get("room", type=int)
- if room_id is None:
- return '
Verlies
Abenteuer starten'
+ player_id = session.get("player_id")
+
+ if room_id is None or player_id is None:
+ html = "Verlies
"
+ if player_id is not None:
+ html += "Willkommen zurück, " + session.get("player_name", "Spieler") + ".
"
+ else:
+ html += "Bitte gib zuerst deinen Namen ein, bevor du ins Verlies gehst.
"
+ html += ""
+ html += "Highscores ansehen
"
+ html += "Highscores
"
+ rows = get_highscores()
+ if rows:
+ for row in rows:
+ html += "- " + row["name"] + ": " + f"{row['dauer']:.2f}" + "s
"
+ else:
+ html += "- Noch keine abgeschlossenen Spiele.
"
+ html += "
"
+ return html
db = get_db()
- r = db.execute("SELECT name, beschreibung, raetsel_frage, raetsel_antwort FROM raeume WHERE id = ?", (room_id,)).fetchone()
+ r = db.execute(
+ "SELECT name, beschreibung, raetsel_frage, raetsel_antwort FROM raeume WHERE id = ?",
+ (room_id,),
+ ).fetchone()
ausgaenge = db.execute(
"SELECT richtung, nach_raum FROM ausgaenge WHERE von_raum = ?", (room_id,)
).fetchall()
db.close()
if r is None:
- return 'Raum nicht gefunden
'
+ return "Raum nicht gefunden
"
if r["raetsel_frage"]:
if request.method == "POST":
if request.form.get("antwort", "").strip() == r["raetsel_antwort"]:
- return "Befreit!
"
+ db = get_db()
+ current = db.execute(
+ "SELECT fertig_zeit FROM spieler WHERE id = ?", (player_id,)
+ ).fetchone()
+ if current and current["fertig_zeit"] is None:
+ db.execute(
+ "UPDATE spieler SET fertig_zeit = ? WHERE id = ?",
+ (time.time(), player_id),
+ )
+ db.commit()
+ db.close()
+ return "Geschafft!
Du hast den Schatz gefunden.
Zum Highscore
"
return 'Leider falsch. nochmal'
html = "" + r["name"] + "
"
@@ -46,6 +110,20 @@ def start():
html += '' + a["richtung"] + ' '
return html
+
+@app.route("/app/highscore")
+def highscore():
+ html = "Highscores
"
+ rows = get_highscores()
+ if rows:
+ for row in rows:
+ html += "- " + row["name"] + ": " + f"{row['dauer']:.2f}" + "s
"
+ else:
+ html += "- Noch keine abgeschlossenen Spiele.
"
+ html += "
Zurück zum Spiel
"
+ return html
+
+
if __name__ == "__main__":
port = int(os.environ.get("PORT", "9003"))
app.run(host="0.0.0.0", port=port)
diff --git a/app/init_db.py b/app/init_db.py
index 8530b66..7bd1dc1 100644
--- a/app/init_db.py
+++ b/app/init_db.py
@@ -5,6 +5,7 @@ db = sqlite3.connect("adventure.db") # Datei wird angelegt, falls nicht da
db.executescript("""
DROP TABLE IF EXISTS raeume;
DROP TABLE IF EXISTS ausgaenge;
+DROP TABLE IF EXISTS spieler;
CREATE TABLE raeume (
id INTEGER PRIMARY KEY,
@@ -18,6 +19,12 @@ CREATE TABLE ausgaenge (
richtung TEXT,
nach_raum INTEGER
);
+CREATE TABLE spieler (
+ id INTEGER PRIMARY KEY,
+ name TEXT,
+ start_zeit REAL,
+ fertig_zeit REAL
+);
INSERT INTO raeume (id, name, beschreibung, raetsel_frage, raetsel_antwort) VALUES
(1, 'Eingangshalle', 'Eine schwere Tür fällt hinter dir zu. Zwei Gänge führen ins Dunkel.', NULL, NULL),