EnglishGitHub
Prototyppackages/slot-mashine/src

Slot Mashine

@ralphschuler/slot-mashine

Simuliert gewichtete Walzen, horizontale und diagonale Gewinne, Credits und Freispiele.

weighted randompaylinessimulation

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.

Im Repository

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?

  1. Symbole mit getrenntem weight und payout definieren.
  2. Pro Reel und sichtbarer Zeile über injizierten RNG ziehen.
  3. Explizite Payline-Koordinaten inklusive Wild-Regeln auswerten.
  4. Scatter/Freispiele und Gewinn atomisch auf Integer-Credits buchen.
  5. 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.

  1. Gewichte, Auszahlungen und Symbole als Daten statt Vererbung definieren.
  2. Raster mit einem seedbaren RNG erzeugen.
  3. Paylines als Koordinatenarrays ohne Console- oder Guthabenseiteneffekt auswerten.
Konzeptskizze · kann ausgelassene Helfer verwenden
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.
Wichtig

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