01 · Problem
Wofür braucht man das?
Eine reproduzierbare Spielsimulation muss Zufallsverteilung und Auszahlung unabhängig modellieren und jede sichtbare Linie korrekt auswerten.
02 · Denkmodell
Das mentale Modell
Reels erzeugen Spalten eines Rasters. Paylines sind explizite Koordinatenfolgen; ein reiner Evaluator berechnet daraus einen Gewinn.
Simuliert gewichtete Walzen, horizontale und diagonale Gewinne, Credits und Freispiele. Die Engine ist eine didaktische deterministische Simulation. UI, Echtgeldbuchhaltung und regulatorische Anforderungen liegen außerhalb ihres Vertrags.
03 · Kontrollfluss
Was passiert in welcher Reihenfolge?
- Symbole mit getrenntem weight und payout definieren.
- Pro Reel und sichtbarer Zeile über injizierten RNG ziehen.
- Explizite Payline-Koordinaten inklusive Wild-Regeln auswerten.
- Scatter/Freispiele und Gewinn atomisch auf Integer-Credits buchen.
- Engineergebnis separat rendern oder über eine CLI bedienen.
04 · Bauteile
Die entscheidenden Verträge
FruitSlotMachine.betAndSpinVerarbeitet Einsatz, Gewinnlinien und Freispielzustand.Reel / FruitReelZieht gewichtete Symbole mit injizierbarer Zufallsquelle.getCredit / getFreeSpinsLiest expliziten Simulationszustand.05 · Selbst bauen
Selbst implementieren
Die Kernengine sollte rein und deterministisch sein; Zufall und UI werden injiziert.
- Gewichte, Auszahlungen und Symbole als Daten statt Vererbung definieren.
- Raster mit einem seedbaren RNG erzeugen.
- Paylines als Koordinatenarrays ohne Console- oder Guthabenseiteneffekt auswerten.
type Weighted<T> = { value: T; weight: number };
function pick<T>(items: Weighted<T>[], random: () => number) {
const total = items.reduce((sum, item) => sum + item.weight, 0);
let cursor = random() * total;
for (const item of items) {
cursor -= item.weight;
if (cursor < 0) return item.value;
}
throw new Error("No selectable symbol");
}
const middleLine = [[0, 1], [1, 1], [2, 1]] as const;06 · Verifizieren
Was solltest du testen?
- Grenzwerte der Gewichtsintervalle wählen das erwartete Symbol.
- Jede horizontale und diagonale Payline liest die richtigen Rasterkoordinaten.
- Negative, unendliche und zu große Einsätze verändern Credits nicht.
Selbst ausprobieren
Formuliere die erste Prüfaussage als fehlschlagenden Test, implementiere die kleinste Korrektur und ergänze einen Grenzfall.
Grenzwerte der Gewichtsintervalle wählen das erwartete Symbol.
Ansatz vergleichen
Dein Test sollte beim gezielten Verletzen der Invariante fehlschlagen und nach der Korrektur wieder bestehen. Halte den Aufbau deterministisch und prüfe ein beobachtbares Ergebnis.
07 · Grenzen
Kompromisse und Stolperfallen
- Reproduzierbarer RNG erleichtert Tests, ist bei echtem Glücksspiel regulatorisch unzureichend.
- Mehr Paylines erhöhen Variation und Auszahlungswahrscheinlichkeit.
- Geld als Integer-Cents verhindert Gleitkommafehler.
Die Engine ist eine didaktische deterministische Simulation. UI, Echtgeldbuchhaltung und regulatorische Anforderungen liegen außerhalb ihres Vertrags.
08 · Weiterdenken
Quellcode und verwandte Ideen
yarn tsx packages/slot-mashine/examples/basic.ts