GitHub
Prototyppackages/slot-mashine/src

Slot Mashine

@ralphschuler/slot-mashine

Trennt bei einer Slot-Simulation idealerweise Symbolgewichte, Rastererzeugung, Payline-Auswertung und Guthabenbuchung.

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

Das Modul exportiert nichts und startet beim Import eine readline-CLI. Alle Symbole erhalten effektiv dasselbe Gewicht, horizontale Linien werden entlang eines Reels statt quer geprüft und Einsatz-/Freispielgrenzen sind fehlerhaft.

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 (intern) Kombiniert Engine, Credits, Freispielzustand, Rendering und readline-Loop.
Reel / FruitReel (intern) Zieht drei Symbole aus einer aufgebauten Symbolmenge.
BaseSymbol / WildSymbol / ScatterSymbol (intern) Symbolklassen mit Multiplikator und Darstellung.

05 · Build it yourself

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.
minimal.ts · unabhängig vom Package
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 du testen solltest

  • 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.

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

Der Repository-Name schreibt 'mashine'. Eine Korrektur wäre eine separate Breaking Change; die Doku spiegelt deshalb den tatsächlichen Slug.

08 · Weiterdenken

Quellcode und Nachbarn

Originalcode auf GitHub ansehen