Refactor betting logic and add game results calculation

This commit is contained in:
pd0a6847 2025-11-17 14:53:21 +09:00
parent 14a3743616
commit 0cc97a9196
4 changed files with 101 additions and 82 deletions

View File

@ -1,26 +1,11 @@
import type { DurableObjectNamespace, DurableObjectState } from '@cloudflare/workers-types'; import type { DurableObjectNamespace, DurableObjectState } from '@cloudflare/workers-types';
import type { Session, BettingInfo } from './types';
import { applyBetResults } from './game-results';
export interface Env { export interface Env {
COUNTER: DurableObjectNamespace; COUNTER: DurableObjectNamespace;
} }
interface Session {
id: string;
webSocket: WebSocket;
nickname?: string;
capital?: number;
// 배팅 정보
oddBet: number;
evenBet: number;
bigBet: number;
smallBet: number;
// 결과
oddResult?: 'win' | 'lose' | null;
evenResult?: 'win' | 'lose' | null;
bigResult?: 'win' | 'lose' | null;
smallResult?: 'win' | 'lose' | null;
lastWinAmount?: number;
}
export class CounterDurableObject { export class CounterDurableObject {
private ctx: DurableObjectState; private ctx: DurableObjectState;
@ -165,60 +150,9 @@ export class CounterDurableObject {
// 주사위 합계 // 주사위 합계
const sum = this.dice1 + this.dice2 + this.dice3; const sum = this.dice1 + this.dice2 + this.dice3;
const isOdd = sum % 2 === 1;
const isBig = sum >= 10;
// 각 세션별로 배팅 결과 계산 // 추출된 함수로 배팅 결과 계산 및 세션 갱신
this.sessions.forEach((session) => { applyBetResults(this.sessions, sum);
if (!session.capital) return;
let winAmount = 0;
// 홀수 배팅 결과
if (session.oddBet > 0) {
if (isOdd) {
session.oddResult = 'win';
winAmount += session.oddBet * 2;
} else {
session.oddResult = 'lose';
}
}
// 짝수 배팅 결과
if (session.evenBet > 0) {
if (!isOdd) {
session.evenResult = 'win';
winAmount += session.evenBet * 2;
} else {
session.evenResult = 'lose';
}
}
// 대 배팅 결과
if (session.bigBet > 0) {
if (isBig) {
session.bigResult = 'win';
winAmount += session.bigBet * 2;
} else {
session.bigResult = 'lose';
}
}
// 소 배팅 결과
if (session.smallBet > 0) {
if (!isBig) {
session.smallResult = 'win';
winAmount += session.smallBet * 2;
} else {
session.smallResult = 'lose';
}
}
// 자본금 업데이트
const totalBet = session.oddBet + session.evenBet + session.bigBet + session.smallBet;
session.lastWinAmount = winAmount - totalBet;
session.capital += winAmount;
});
// 상태 저장 // 상태 저장
this.ctx.storage.put('noMoreBet', this.noMoreBet); this.ctx.storage.put('noMoreBet', this.noMoreBet);
@ -289,13 +223,7 @@ export class CounterDurableObject {
const connectedWebSockets = this.ctx.getWebSockets(); const connectedWebSockets = this.ctx.getWebSockets();
// 전체 사용자 배팅 내역 수집 // 전체 사용자 배팅 내역 수집
const allBettings: Array<{ const allBettings: BettingInfo[] = [];
nickname: string;
oddBet: number;
evenBet: number;
bigBet: number;
smallBet: number;
}> = [];
this.sessions.forEach((session) => { this.sessions.forEach((session) => {
if (session.nickname && (session.oddBet > 0 || session.evenBet > 0 || session.bigBet > 0 || session.smallBet > 0)) { if (session.nickname && (session.oddBet > 0 || session.evenBet > 0 || session.bigBet > 0 || session.smallBet > 0)) {
@ -341,4 +269,3 @@ export class CounterDurableObject {
}); });
} }
} }

62
src/lib/game-results.ts Normal file
View File

@ -0,0 +1,62 @@
import type { Session } from './types';
/**
* .
* * 2 , .
* lastWinAmount = ( - )
*/
export function applyBetResults(sessions: Map<WebSocket, Session>, sum: number) {
const isOdd = sum % 2 === 1;
const isBig = sum >= 10; // 10~18: 대
sessions.forEach((session) => {
if (session.capital === undefined) return; // 아직 사용자 설정 안됨
let winAmount = 0;
// 홀수 배팅
if (session.oddBet > 0) {
if (isOdd) {
session.oddResult = 'win';
winAmount += session.oddBet * 2;
} else {
session.oddResult = 'lose';
}
}
// 짝수 배팅
if (session.evenBet > 0) {
if (!isOdd) {
session.evenResult = 'win';
winAmount += session.evenBet * 2;
} else {
session.evenResult = 'lose';
}
}
// 대 배팅
if (session.bigBet > 0) {
if (isBig) {
session.bigResult = 'win';
winAmount += session.bigBet * 2;
} else {
session.bigResult = 'lose';
}
}
// 소 배팅
if (session.smallBet > 0) {
if (!isBig) {
session.smallResult = 'win';
winAmount += session.smallBet * 2;
} else {
session.smallResult = 'lose';
}
}
const totalBet = session.oddBet + session.evenBet + session.bigBet + session.smallBet;
session.lastWinAmount = winAmount - totalBet;
session.capital = (session.capital ?? 0) + winAmount;
});
}

26
src/lib/types.ts Normal file
View File

@ -0,0 +1,26 @@
export interface Session {
id: string;
webSocket: WebSocket;
nickname?: string;
capital?: number;
// 배팅 정보
oddBet: number;
evenBet: number;
bigBet: number;
smallBet: number;
// 결과
oddResult?: 'win' | 'lose' | null;
evenResult?: 'win' | 'lose' | null;
bigResult?: 'win' | 'lose' | null;
smallResult?: 'win' | 'lose' | null;
lastWinAmount?: number;
}
export interface BettingInfo {
nickname: string;
oddBet: number;
evenBet: number;
bigBet: number;
smallBet: number;
}

View File

@ -390,7 +390,8 @@
{#if oddBet > 0 || evenBet > 0 || bigBet > 0 || smallBet > 0} {#if oddBet > 0 || evenBet > 0 || bigBet > 0 || smallBet > 0}
<div class="grid grid-cols-2 gap-3 mb-4"> <div class="grid grid-cols-2 gap-3 mb-4">
{#if oddBet > 0} {#if oddBet > 0}
<div class="p-3 rounded-lg {oddResult === 'win' ? 'bg-green-100 border-2 border-green-300' : oddResult === 'lose' ? 'bg-red-100 border-2 border-red-300' : 'bg-gray-100 border-2 border-gray-300'}"> <div
class="p-3 rounded-lg {oddResult === 'win' ? 'bg-green-100 border-2 border-green-300' : oddResult === 'lose' ? 'bg-red-100 border-2 border-red-300' : 'bg-gray-100 border-2 border-gray-300'}">
<div class="text-sm text-gray-600">홀수 배팅</div> <div class="text-sm text-gray-600">홀수 배팅</div>
<div class="text-lg font-bold">{oddBet.toLocaleString()}</div> <div class="text-lg font-bold">{oddBet.toLocaleString()}</div>
{#if oddResult === 'win'} {#if oddResult === 'win'}
@ -401,7 +402,8 @@
</div> </div>
{/if} {/if}
{#if evenBet > 0} {#if evenBet > 0}
<div class="p-3 rounded-lg {evenResult === 'win' ? 'bg-green-100 border-2 border-green-300' : evenResult === 'lose' ? 'bg-red-100 border-2 border-red-300' : 'bg-gray-100 border-2 border-gray-300'}"> <div
class="p-3 rounded-lg {evenResult === 'win' ? 'bg-green-100 border-2 border-green-300' : evenResult === 'lose' ? 'bg-red-100 border-2 border-red-300' : 'bg-gray-100 border-2 border-gray-300'}">
<div class="text-sm text-gray-600">짝수 배팅</div> <div class="text-sm text-gray-600">짝수 배팅</div>
<div class="text-lg font-bold">{evenBet.toLocaleString()}</div> <div class="text-lg font-bold">{evenBet.toLocaleString()}</div>
{#if evenResult === 'win'} {#if evenResult === 'win'}
@ -412,7 +414,8 @@
</div> </div>
{/if} {/if}
{#if bigBet > 0} {#if bigBet > 0}
<div class="p-3 rounded-lg {bigResult === 'win' ? 'bg-green-100 border-2 border-green-300' : bigResult === 'lose' ? 'bg-red-100 border-2 border-red-300' : 'bg-gray-100 border-2 border-gray-300'}"> <div
class="p-3 rounded-lg {bigResult === 'win' ? 'bg-green-100 border-2 border-green-300' : bigResult === 'lose' ? 'bg-red-100 border-2 border-red-300' : 'bg-gray-100 border-2 border-gray-300'}">
<div class="text-sm text-gray-600">대 배팅</div> <div class="text-sm text-gray-600">대 배팅</div>
<div class="text-lg font-bold">{bigBet.toLocaleString()}</div> <div class="text-lg font-bold">{bigBet.toLocaleString()}</div>
{#if bigResult === 'win'} {#if bigResult === 'win'}
@ -423,7 +426,8 @@
</div> </div>
{/if} {/if}
{#if smallBet > 0} {#if smallBet > 0}
<div class="p-3 rounded-lg {smallResult === 'win' ? 'bg-green-100 border-2 border-green-300' : smallResult === 'lose' ? 'bg-red-100 border-2 border-red-300' : 'bg-gray-100 border-2 border-gray-300'}"> <div
class="p-3 rounded-lg {smallResult === 'win' ? 'bg-green-100 border-2 border-green-300' : smallResult === 'lose' ? 'bg-red-100 border-2 border-red-300' : 'bg-gray-100 border-2 border-gray-300'}">
<div class="text-sm text-gray-600">소 배팅</div> <div class="text-sm text-gray-600">소 배팅</div>
<div class="text-lg font-bold">{smallBet.toLocaleString()}</div> <div class="text-lg font-bold">{smallBet.toLocaleString()}</div>
{#if smallResult === 'win'} {#if smallResult === 'win'}