'integer', 'payout' => 'integer', ]; } /** * 关联玩家。 */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * 全部图案符号定义(key => emoji)。 * 顺序影响权重:越靠前出现概率越高(摇奖时按权重随机)。 * * @return array */ public static function symbols(): array { return [ 'cherry' => ['emoji' => '🍒', 'weight' => 30], 'lemon' => ['emoji' => '🍋', 'weight' => 25], 'orange' => ['emoji' => '🍊', 'weight' => 20], 'grape' => ['emoji' => '🍇', 'weight' => 15], 'bell' => ['emoji' => '🔔', 'weight' => 8], 'gem' => ['emoji' => '💎', 'weight' => 4], 'skull' => ['emoji' => '💀', 'weight' => 3], 'seven' => ['emoji' => '7️⃣', 'weight' => 1], ]; } /** * 按权重随机抽取一个图案 key。 */ public static function randomSymbol(): string { $symbols = static::symbols(); $totalWeight = array_sum(array_column($symbols, 'weight')); $rand = random_int(1, $totalWeight); $cumulative = 0; foreach ($symbols as $key => $item) { $cumulative += $item['weight']; if ($rand <= $cumulative) { return $key; } } return 'cherry'; // fallback } /** * 根据三列图案判断结果类型。 * * @return string 'jackpot' | 'triple_gem' | 'triple' | 'pair' | 'curse' | 'miss' */ public static function judgeResult(string $r1, string $r2, string $r3): string { // 三个7 → 大奖 if ($r1 === 'seven' && $r2 === 'seven' && $r3 === 'seven') { return 'jackpot'; } // 三个💎 → 豪华奖 if ($r1 === 'gem' && $r2 === 'gem' && $r3 === 'gem') { return 'triple_gem'; } // 三个💀 → 诅咒(亏双倍) if ($r1 === 'skull' && $r2 === 'skull' && $r3 === 'skull') { return 'curse'; } // 三同(其他) if ($r1 === $r2 && $r2 === $r3) { return 'triple'; } // 两同 if ($r1 === $r2 || $r2 === $r3 || $r1 === $r3) { return 'pair'; } return 'miss'; } /** * 结果类型中文标签。 */ public static function resultLabel(string $type): string { return match ($type) { 'jackpot' => '🎉 三个7大奖!', 'triple_gem' => '💎 三钻豪华奖', 'triple' => '✨ 三同奖', 'pair' => '🎁 两同小奖', 'curse' => '☠️ 三骷髅诅咒', 'miss' => '😔 未中奖', }; } }