Ways to win (243 / 1024 / 4096)
TL;DR
Альтернатива paylines: вместо фиксированных линий выигрыш считается за N подряд reels с одинаковыми символами в любых row-позициях. Число «ways» для конкретного символа = произведение counts на каждом reel-е, до num_rows ^ num_columns максимум. Популярная замена paylines — больше частоты выигрышей, проще для игрока «понять».
Как работает
Конфиг
То же paytable = {(kind, sym): payout} как в paylines, но kind означает число reels подряд слева, а не позиций на линии.
paylines не нужен — ways не зависит от row-позиций.
Алгоритм evaluate
для каждого base_sym из paytable:
count_per_reel = []
for reel in 0..num_reels:
n = число вхождений (base_sym или wild) на этом reel
if n == 0: break
count_per_reel.append(n)
kind = len(count_per_reel) # число reels подряд слева
if kind < min_kind или (kind, base_sym) не в paytable: continue
base_payout = paytable[(kind, base_sym)]
ways = product(count_per_reel)
multiplier = product(wild_multipliers активных wild-ов на этих reels)
win = base_payout * ways * multiplier
Возвращает winData с meta.ways (от 1 до num_rows ^ num_columns).
Total ways
Максимум для 5×3 поля: 3⁵ = 243. Отсюда «243 ways» (Microgaming брэндинг с 2009 года).
| Поле | Total ways |
|---|---|
| 5×3 | 243 |
| 5×4 | 1024 |
| 6×4 | 4096 |
| Megaways (динамический row) | до 117 649 |
Мат-эффект
- Hit frequency выше, чем у 20-paylines games — много больше «зачтённых» выигрышей, но на меньшие суммы.
- Volatility обычно ниже при том же RTP. Часто комбинируют с tumbling и multiplier-механиками для добавления volatility.
- Combinatorics: state space тот же, что paylines (
reelstrip_len ^ num_reels), но evaluate-функция сложнее — нужно посчитать counts per reel.
Multiplier — мультипликативный
В отличие от lines, на ways multiplier на wild умножается, не складывается:
ways(H1) = (count_R1) × (count_R2) × (count_R3) × (count_R4) × (count_R5)
Если на R3 есть Wild с multiplier=3, то общий multiplier ways становится 3× (или 6× если два таких wild и они тоже множатся между собой). Это очень быстро надувает win:
L5 H1 L4 L4 L4
L1 H4 L3 H2 L4
H1 H1 H1 L3 H3Для H1: (2) × (2) × (1) × (0) × (0) = 0 ways. Прерываемся на R4.
Для L3: (0) × (1) × (1) × (1) × (1) = 0 ways на R1.
Если на R3 есть W×3 и на R4 W×2 → ways множится на 3 × 2 = 6.
Wild на reel 1
Конвенция: wild не появляется на первом reel. Иначе ways для всех paying symbols взлетают (wild считается ко всем), что ломает балансировку.
Stake math-sdk в WaysWins это не учитывает явно — должно быть запрещено в reelstrip-е (BR0/FR0 не содержат W в первом столбце). Тестим property: for all sims: count("W", reel=0) === 0.
Варианты и подвиды
- 243 ways (5×3) — стандарт.
- 1024 ways (5×4) — больше hit frequency.
- 4096 ways (6×4) — премиум.
- Megaways (динамические row 2..7 на reel) — до 117K ways. Лицензировано BTG; остальные провайдеры платят royalty.
- Both-ways pays — счёт ways слева и справа.
- Adjacent ways vs all-ways — стандарт adjacent (только подряд reels слева).
Реализационные заметки
Бэк (TS)
function evaluateWays(
board: SymbolName[][],
paytable: Map<string, number>,
wildSyms: SymbolName[],
payingSyms: SymbolName[],
): WinData {
const wins: WinDetail[] = [];
for (const sym of payingSyms) {
const counts: number[] = [];
const wildMults: number[] = [];
for (let reel = 0; reel < board.length; reel++) {
const n = board[reel].filter(s => s === sym || wildSyms.includes(s)).length;
if (n === 0) break;
counts.push(n);
const wildOnReel = collectWildMults(board[reel], wildSyms);
if (wildOnReel.length) wildMults.push(...wildOnReel);
}
const kind = counts.length;
if (kind < MIN_KIND) continue;
const key = `${kind}:${sym}`;
const basePay = paytable.get(key);
if (!basePay) continue;
const ways = counts.reduce((a, b) => a * b, 1);
const wildMult = wildMults.reduce((a, b) => a * b, 1);
wins.push({symbol: sym, kind, win: basePay * ways * wildMult, ...});
}
return {totalWin: sum(wins, w => w.win), wins};
}Edge cases
- Wild на reel 1 → property-test ловит.
- Все символы wild →
kind = num_reelsдля каждого paying sym; берём max payout. - Multiplier overflow для big-win-cap → проверка
runningBetWin >= maxWinпосле каждого win.
Фронт
Эмитится winInfo с meta.ways числом ways. Фронт обычно показывает «X ways» текстом + highlight всех позиций символа на «победивших» reels (в отличие от lines, где highlight только конкретной линии).
Compliance / cert
- Help / paytable должен раскрывать формулу
payout × ways × multiplier. - Wild-on-reel-1 запрет должен быть документирован, если оно так в нашей игре.
- LDW особенно частый на ways — много low-payout ways за раунд. Disclosures как для paylines.
Примеры реализаций
- Microgaming Thunderstruck 2 (243 ways).
- Microgaming Mega Moolah (243 ways + jackpot).
- NetEnt Gonzo’s Quest (in some versions ways, in others lines).