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:
1 parent
441bdb440c
commit
7f590a6f74
5 files changed
+32
-9
No files matched your search
@@ -36,7 +36,8 @@ starten (beim ersten Mal ggf. Rechtsklick → Öffnen wegen Gatekeeper).
|
|||||||
## Ablauf
|
## Ablauf
|
||||||
|
|
||||||
1. **Tutorialbild** (jede Runde, auch nach einem Ergebnis) – weiter mit A / Space
|
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
|
3. **Ampel-Start** (rot/gelb/grün + Reissverschluss), dann läuft die Runde
|
||||||
4. **Ergebnis**: Stufe, Prozent und ein Spruch – dazu **10 Sekunden Cooldown**,
|
4. **Ergebnis**: Stufe, Prozent und ein Spruch – dazu **10 Sekunden Cooldown**,
|
||||||
damit man nicht versehentlich weiterspringt. Danach startet A eine neue
|
damit man nicht versehentlich weiterspringt. Danach startet A eine neue
|
||||||
|
|||||||
@@ -121,3 +121,9 @@ Runde:
|
|||||||
```
|
```
|
||||||
ANLEITUNG → MODUSWAHL → STARTSEQUENZ → SPIEL → ABSCHLUSS (10 s) → ANLEITUNG → …
|
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. |
|
||||||
@@ -71,7 +71,8 @@ MAX_UNITS_H = 3
|
|||||||
# Ab dieser Entfernung zur Barriere wird abgebremst – früh, damit man Zeit hat.
|
# Ab dieser Entfernung zur Barriere wird abgebremst – früh, damit man Zeit hat.
|
||||||
FAST_TO_SLOW_DISTANCE = 260
|
FAST_TO_SLOW_DISTANCE = 260
|
||||||
# Ab dieser Entfernung darf eingerastet/gedreht/gestapelt werden.
|
# 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.
|
# Lücke, die nach einer Kollision (ohne Einrasten) entsteht – Strafe bleibt wie bisher.
|
||||||
FAIL_GAP = 60
|
FAIL_GAP = 60
|
||||||
PLATFORM_TOLERANCE = 5 # Toleranz für "bündig an der Barriere"
|
PLATFORM_TOLERANCE = 5 # Toleranz für "bündig an der Barriere"
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
"""Schwierigkeitsstufen: wie schnell die Koffer einlaufen.
|
"""Schwierigkeitsstufen: wie schnell die Koffer einlaufen.
|
||||||
|
|
||||||
``hard`` entspricht dem Tempo des Altstands (6 bzw. 2 Pixel pro Frame bei
|
Referenz: der Altstand lief mit 6 bzw. 2 Pixeln pro Frame bei 120 fps, also
|
||||||
120 fps = 720 bzw. 240 Pixel pro Sekunde).
|
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
|
from __future__ import annotations
|
||||||
@@ -24,8 +31,8 @@ class Difficulty:
|
|||||||
|
|
||||||
DIFFICULTIES: tuple[Difficulty, ...] = (
|
DIFFICULTIES: tuple[Difficulty, ...] = (
|
||||||
Difficulty("easy", "Easy", speed_fast=420.0, speed_slow=140.0),
|
Difficulty("easy", "Easy", speed_fast=420.0, speed_slow=140.0),
|
||||||
Difficulty("normal", "Normal", speed_fast=570.0, speed_slow=190.0),
|
Difficulty("normal", "Normal", speed_fast=740.0, speed_slow=250.0),
|
||||||
Difficulty("hard", "Hard", speed_fast=720.0, speed_slow=240.0),
|
Difficulty("hard", "Hard", speed_fast=1080.0, speed_slow=360.0),
|
||||||
)
|
)
|
||||||
|
|
||||||
DEFAULT_DIFFICULTY: Difficulty = DIFFICULTIES[1]
|
DEFAULT_DIFFICULTY: Difficulty = DIFFICULTIES[1]
|
||||||
|
|||||||
+11
-3
@@ -85,9 +85,17 @@ class DifficultyTests(unittest.TestCase):
|
|||||||
self.assertEqual([d.key for d in DIFFICULTIES], ["easy", "normal", "hard"])
|
self.assertEqual([d.key for d in DIFFICULTIES], ["easy", "normal", "hard"])
|
||||||
self.assertEqual([d.label 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:
|
def test_speeds_match_the_requested_levels(self) -> None:
|
||||||
hard = by_key("hard")
|
self.assertEqual(
|
||||||
self.assertEqual((hard.speed_fast, hard.speed_slow), (720.0, 240.0))
|
[(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:
|
def test_speeds_increase_with_difficulty(self) -> None:
|
||||||
fast = [d.speed_fast for d in DIFFICULTIES]
|
fast = [d.speed_fast for d in DIFFICULTIES]
|
||||||
|
|||||||
Reference in new issue
Block a user