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 { 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
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}
|
{#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'}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user