v1.4: Tempo erhoeht - Normal 740 px/s (+30%), Hard 1080 (+50%), Easy unveraendert. Snap-Fenster 160->200 px, damit genug Zeit fuer Befehle bleibt. 57 Tests gruen.

This commit is contained in:
Project Bridge committed 2026-11-01 12:22:08 +00:00
1 parent 441bdb440c
commit 7f590a6f74
5 files changed
+32 -9

No files matched your search

+2 -1
View File
@@ -36,7 +36,8 @@ starten (beim ersten Mal ggf. Rechtsklick → Öffnen wegen Gatekeeper).
## Ablauf
1. **Tutorialbild** (jede Runde, auch nach einem Ergebnis) – weiter mit A / Space
2. **Stufenauswahl**: Easy / Normal / Hard (Hard = Tempo des Altstands)
2. **Stufenauswahl**: Easy / Normal / Hard – Einlauf 420 / 740 / 1080 Pixel pro Sekunde,
gebremst 140 / 250 / 360. Das Zeitfenster für Befehle ist in allen Stufen gleich gross.
3. **Ampel-Start** (rot/gelb/grün + Reissverschluss), dann läuft die Runde
4. **Ergebnis**: Stufe, Prozent und ein Spruch – dazu **10 Sekunden Cooldown**,
damit man nicht versehentlich weiterspringt. Danach startet A eine neue
+6
View File
@@ -121,3 +121,9 @@ Runde:
```
ANLEITUNG → MODUSWAHL → STARTSEQUENZ → SPIEL → ABSCHLUSS (10 s) → ANLEITUNG → …
```
## 9. Tempo nachgezogen (v1.4)
| Rückmeldung | Umsetzung |
| --- | --- |
| „Normal und Hard sind zu einfach, aber die Zeit für die Befehle soll bleiben" | Tempo erhöht: Normal 570 → **740** px/s (+30 %), Hard 720 → **1080** px/s (+50 %), Easy unverändert 420. Gebremst entsprechend 250 bzw. 360 px/s. Damit die Reaktionszeit nicht mitschrumpft, wurde das Snap-Fenster von 160 auf **200 px** vergrössert: rund 1,4 s (Easy), 0,8 s (Normal) und 0,55 s (Hard) zwischen „Befehl möglich" und Barriere. |
+2 -1
View File
@@ -71,7 +71,8 @@ MAX_UNITS_H = 3
# Ab dieser Entfernung zur Barriere wird abgebremst – früh, damit man Zeit hat.
FAST_TO_SLOW_DISTANCE = 260
# Ab dieser Entfernung darf eingerastet/gedreht/gestapelt werden.
SNAP_WINDOW = 160
# 200 px ergeben je nach Stufe rund 1,4 s (Easy), 0,8 s (Normal) und 0,55 s (Hard).
SNAP_WINDOW = 200
# Lücke, die nach einer Kollision (ohne Einrasten) entsteht – Strafe bleibt wie bisher.
FAIL_GAP = 60
PLATFORM_TOLERANCE = 5 # Toleranz für "bündig an der Barriere"
+11 -4
View File
@@ -1,7 +1,14 @@
"""Schwierigkeitsstufen: wie schnell die Koffer einlaufen.
``hard`` entspricht dem Tempo des Altstands (6 bzw. 2 Pixel pro Frame bei
120 fps = 720 bzw. 240 Pixel pro Sekunde).
Referenz: der Altstand lief mit 6 bzw. 2 Pixeln pro Frame bei 120 fps, also
720 bzw. 240 Pixel pro Sekunde. Das ist die Basis, von der aus skaliert wird:
* **Easy** – 0,58× so schnell wie der Altstand (zum Einsteigen)
* **Normal** – 1,3× so schnell wie der Altstand
* **Hard** – 1,5× so schnell wie der Altstand
Das Zeitfenster für die Befehle (Einrasten/Drehen/Stapeln) steht in
``config.SNAP_WINDOW`` und ist für alle Stufen gleich gross.
"""
from __future__ import annotations
@@ -24,8 +31,8 @@ class Difficulty:
DIFFICULTIES: tuple[Difficulty, ...] = (
Difficulty("easy", "Easy", speed_fast=420.0, speed_slow=140.0),
Difficulty("normal", "Normal", speed_fast=570.0, speed_slow=190.0),
Difficulty("hard", "Hard", speed_fast=720.0, speed_slow=240.0),
Difficulty("normal", "Normal", speed_fast=740.0, speed_slow=250.0),
Difficulty("hard", "Hard", speed_fast=1080.0, speed_slow=360.0),
)
DEFAULT_DIFFICULTY: Difficulty = DIFFICULTIES[1]
+11 -3
View File
@@ -85,9 +85,17 @@ class DifficultyTests(unittest.TestCase):
self.assertEqual([d.key for d in DIFFICULTIES], ["easy", "normal", "hard"])
self.assertEqual([d.label for d in DIFFICULTIES], ["Easy", "Normal", "Hard"])
def test_hard_matches_old_game_speed(self) -> None:
hard = by_key("hard")
self.assertEqual((hard.speed_fast, hard.speed_slow), (720.0, 240.0))
def test_speeds_match_the_requested_levels(self) -> None:
self.assertEqual(
[(d.speed_fast, d.speed_slow) for d in DIFFICULTIES],
[(420.0, 140.0), (740.0, 250.0), (1080.0, 360.0)],
)
# Gegenüber der ersten Fassung (Normal 570, Hard 720):
# Normal ~30 % schneller, Hard ~50 % schneller
self.assertAlmostEqual(by_key("normal").speed_fast / 570.0, 1.30, delta=0.02)
self.assertAlmostEqual(by_key("hard").speed_fast / 720.0, 1.50, delta=0.02)
self.assertAlmostEqual(by_key("normal").speed_slow / 190.0, 1.30, delta=0.02)
self.assertAlmostEqual(by_key("hard").speed_slow / 240.0, 1.50, delta=0.02)
def test_speeds_increase_with_difficulty(self) -> None:
fast = [d.speed_fast for d in DIFFICULTIES]