106 lines
3.1 KiB
Markdown
106 lines
3.1 KiB
Markdown
# 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:
|
|
|
|
```bash
|
|
make serve
|
|
# open http://localhost:8000
|
|
```
|
|
|
|
Met Docker:
|
|
|
|
```bash
|
|
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`).
|
|
|
|
1. Pas de `image` in `k8s/deployment.yaml` aan naar jouw registry
|
|
(bijv. `ghcr.io/<gebruiker>/neo-tetris:latest`), of gebruik een lokaal
|
|
cluster (k3d/kind) met `imagePullPolicy: IfNotPresent`.
|
|
2. Deployen:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```text
|
|
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:
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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.
|