예제 소스
SGF 기보로 학습하는 바둑 LLM 인공지능 · 파일 169개
ranking.ts
export type MatchOutcome = "win" | "loss" | "draw";
export type PlayerStats = {
client_id: string;
rank_level: number;
rank_label: string;
rank_points: number;
promotion_target: number;
wins: number;
losses: number;
draws: number;
total_games: number;
created_at: string;
updated_at: string;
};
export type RankProgress = {
rankLevel: number;
rankPoints: number;
promoted: boolean;
demoted: boolean;
};
/** 0=18급, 17=1급, 18=1단, 이후 단수 증가. */
export function rankLabel(rankLevel: number): string {
const level = Math.max(0, Math.trunc(rankLevel));
if (level <= 17) return `${18 - level}급`;
return `${level - 17}단`;
}
export function promotionTarget(rankLevel: number): number {
const level = Math.max(0, Math.trunc(rankLevel));
if (level >= 18) return 15;
const kyu = 18 - level;
if (kyu >= 11) return 3;
if (kyu >= 5) return 5;
return 10;
}
export function applyRankOutcome(
rankLevel: number,
rankPoints: number,
outcome: MatchOutcome,
): RankProgress {
let level = Math.max(0, Math.trunc(rankLevel));
let points = Math.trunc(rankPoints);
if (outcome === "win") points += 1;
else if (outcome === "loss") points -= 1;
let promoted = false;
let demoted = false;
if (points >= promotionTarget(level)) {
level += 1;
points = 0;
promoted = true;
} else if (points <= -promotionTarget(level)) {
if (level > 0) {
level -= 1;
demoted = true;
}
points = 0;
}
return { rankLevel: level, rankPoints: points, promoted, demoted };
}