Neo Tetris
Een Tetris-clone als pure browser-game (HTML/CSS/JS + Canvas), zonder backend
of database. De highscore wordt per browser bijgehouden via localStorage.
Het geheel draait als statische content achter nginx en is bedoeld om in
Kubernetes te draaien.
Speel het spel
Besturing:
| Toets | Actie |
|---|---|
◀ / ▶ |
verschuiven |
▼ |
zacht laten zakken |
▲ / X |
rechtsom draaien |
Z |
linksom draaien |
Spatie |
hard drop |
C |
hold |
P |
pauze |
R |
opnieuw starten |
Regels: vorm lijnen met de 7 tetromino's. Elke 10 lijnen ga je een level omhoog en valt het blok sneller. Punten: 1 rij = 100, 2 = 300, 3 = 500, 4 = 800 (komma's vermenigvuldigd met je level), plus bonus voor hard/soft drop. Verdien je een top-10 score, dan kun je je naam invullen.
Projectstructuur
game/ # de statische game (index.html, css/, js/)
k8s/ # Kubernetes-manifests (kustomize)
Dockerfile # nginx-image die game/ serveert
Makefile # handige commands
Lokaal ontwikkelen
Zonder Docker:
make serve
# open http://localhost:8000
Met Docker:
make build
make run
# open http://localhost:8080
Deployen naar Kubernetes
De manifests zitten in k8s/ (kustomize) en bestaan uit:
namespace.yaml, deployment.yaml en service.yaml (NodePort op 30080).
- Pas de
imageink8s/deployment.yamlaan naar jouw registry (bijv.ghcr.io/<gebruiker>/neo-tetris:latest), of gebruik een lokaal cluster (k3d/kind) metimagePullPolicy: IfNotPresent. - Deployen:
make build && make push # image in je registry zetten
make preview # manifests valideren (kubectl kustomize)
make deploy # kubectl apply -k k8s/
Daarna is het spel bereikbaar op het NodePort-adres van elk knooppunt:
http://<kube-node-ip>:30080/
De game is volledig stateless en kan dus eenvoudig horizontaal worden
opgeschaald (kubectl scale deployment neo-tetris -n games --replicas=5).
Lokaal testen met kind (op macOS)
Op macOS draait kind in een VM en is het interne node-IP niet vanaf de host
bereikbaar. Gebruik daarvoor kind-config.yaml in deze repo, die poort
30080 van het knooppunt naar localhost doorzet:
kind create cluster --config kind-config.yaml --name kind
kind load docker-image neo-tetris:latest --name kind
make deploy
# open http://localhost:30080
Handige commando's
make status # pods/service in één oogopslag
make logs # logs van de pods volgen
make pf # alternatief: tijdelijk port-forwarden naar localhost:8088
make undeploy # alles verwijderen (kubectl delete -k k8s/)
Highscores
Scores staan in localStorage (top 10 per browser). Wil je later één gedeelde
ranglijst voor alle spelers, dan kun je er een klein stateless API'tje
(met een database) voor toevoegen zonder de game zelf te veranderen.