Refactor betting logic and add game results calculation
This commit is contained in:
parent
14a3743616
commit
0cc97a9196
@ -1,26 +1,11 @@
|
||||
import type { DurableObjectNamespace, DurableObjectState } from '@cloudflare/workers-types';
|
||||
import type { Session, BettingInfo } from './types';
|
||||
import { applyBetResults } from './game-results';
|
||||
|
||||
export interface Env {
|
||||
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 {
|
||||
private ctx: DurableObjectState;
|
||||
@ -165,60 +150,9 @@ export class CounterDurableObject {
|
||||
|
||||
// 주사위 합계
|
||||
const sum = this.dice1 + this.dice2 + this.dice3;
|
||||
const isOdd = sum % 2 === 1;
|
||||
const isBig = sum >= 10;
|
||||
|
||||
// 각 세션별로 배팅 결과 계산
|
||||
this.sessions.forEach((session) => {
|
||||
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;
|
||||
});
|
||||
// 추출된 함수로 배팅 결과 계산 및 세션 갱신
|
||||
applyBetResults(this.sessions, sum);
|
||||
|
||||
// 상태 저장
|
||||
this.ctx.storage.put('noMoreBet', this.noMoreBet);
|
||||
@ -289,13 +223,7 @@ export class CounterDurableObject {
|
||||
const connectedWebSockets = this.ctx.getWebSockets();
|
||||
|
||||
// 전체 사용자 배팅 내역 수집
|
||||
const allBettings: Array<{
|
||||
nickname: string;
|
||||
oddBet: number;
|
||||
evenBet: number;
|
||||
bigBet: number;
|
||||
smallBet: number;
|
||||
}> = [];
|
||||
const allBettings: BettingInfo[] = [];
|
||||
|
||||
this.sessions.forEach((session) => {
|
||||
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
62
src/lib/game-results.ts
Normal 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
26
src/lib/types.ts
Normal 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;
|
||||
}
|
||||
|
||||
@ -390,7 +390,8 @@
|
||||
{#if oddBet > 0 || evenBet > 0 || bigBet > 0 || smallBet > 0}
|
||||
<div class="grid grid-cols-2 gap-3 mb-4">
|
||||
{#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-lg font-bold">{oddBet.toLocaleString()}원</div>
|
||||
{#if oddResult === 'win'}
|
||||
@ -401,7 +402,8 @@
|
||||
</div>
|
||||
{/if}
|
||||
{#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-lg font-bold">{evenBet.toLocaleString()}원</div>
|
||||
{#if evenResult === 'win'}
|
||||
@ -412,7 +414,8 @@
|
||||
</div>
|
||||
{/if}
|
||||
{#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-lg font-bold">{bigBet.toLocaleString()}원</div>
|
||||
{#if bigResult === 'win'}
|
||||
@ -423,7 +426,8 @@
|
||||
</div>
|
||||
{/if}
|
||||
{#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-lg font-bold">{smallBet.toLocaleString()}원</div>
|
||||
{#if smallResult === 'win'}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user