5.1 KiB
5.1 KiB
ELO评级系统
概述
为匹配框架引入了ELO评级系统,为每个规则集单独维护ELO评级,提供更精确的玩家技能评估和匹配质量。
核心特性
🎯 规则集分离
- 每个规则集(如休闲模式、竞技模式)独立维护ELO评级
- 玩家在不同规则集下有不同的ELO分数
- 支持无限扩展新的规则集
📊 标准ELO算法
- 基于经典ELO评级系统
- 期望得分计算:
1 / (1 + 10^((对手ELO - 自己ELO) / 400)) - 新ELO = 旧ELO + K * (实际得分 - 期望得分)
- 支持胜利(1分)、失败(0分)、平局(0.5分)
⚙️ 动态K因子
- 新手 (< 30场): K = 32 (快速调整)
- 普通 (30-100场): K = 24 (中等调整)
- 老手 (> 100场): K = 16 (稳定调整)
🛡️ 安全边界
- ELO范围:100 - 3000
- 初始ELO:1200
- 自动记录历史最高ELO
数据库设计
player_elo_ratings 表
CREATE TABLE player_elo_ratings (
player_id TEXT NOT NULL, -- 玩家ID
rule_set_id TEXT NOT NULL, -- 规则集ID
elo_rating INTEGER DEFAULT 1200, -- 当前ELO评级
games_played INTEGER DEFAULT 0, -- 游戏场次
wins INTEGER DEFAULT 0, -- 胜利次数
losses INTEGER DEFAULT 0, -- 失败次数
draws INTEGER DEFAULT 0, -- 平局次数
highest_elo INTEGER DEFAULT 1200, -- 历史最高ELO
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
PRIMARY KEY (player_id, rule_set_id)
);
核心函数
get_or_create_player_elo()- 获取或创建ELO记录update_player_elo()- 更新单个玩家ELObatch_update_player_elos()- 批量更新ELO(战斗结束)get_elo_leaderboard()- 获取排行榜
API端点
排行榜
GET /api/v1/elo/leaderboard/:ruleSetId?limit=50&offset=0
玩家ELO信息
GET /api/v1/elo/player/:playerId/:ruleSetId
GET /api/v1/elo/player/:playerId # 所有规则集
统计信息
GET /api/v1/elo/statistics/:ruleSetId
战斗预测
GET /api/v1/elo/predict/:playerAId/:playerBId/:ruleSetId
配置信息
GET /api/v1/elo/config
GET /api/v1/elo/win-rate/:eloDifference
系统集成
战斗结束自动更新
战斗结束时,battleReportService 会自动:
- 获取两个玩家的当前ELO
- 根据战斗结果计算新ELO
- 原子性批量更新数据库
- 记录详细日志
// 在 battleReportService.ts 中
if (battleData.ruleSetId && battleResult !== 'abandoned') {
await eloService.processBattleEloUpdate(
battleData.playerAId,
battleData.playerBId,
winnerId,
battleData.ruleSetId
)
}
匹配系统集成
匹配系统已支持规则集分离,ELO系统可以:
- 基于ELO进行更精确的匹配
- 预测战斗结果概率
- 提供匹配质量评估
部署步骤
1. 数据库迁移
在Supabase SQL编辑器中执行:
-- 执行ELO系统迁移
\i packages/database/sql/06_add_elo_system.sql
2. 服务器更新
ELO系统已集成到现有服务器中,无需额外配置。
3. 测试验证
# 测试ELO计算逻辑
cd packages/server && npx tsx src/test-elo.ts
# 启动服务器测试API
node dist/cli.js server --port 8102
使用示例
获取排行榜
curl "http://localhost:8102/api/v1/elo/leaderboard/casual_standard_ruleset?limit=10"
查看玩家ELO
curl "http://localhost:8102/api/v1/elo/player/player123/casual_standard_ruleset"
预测战斗结果
curl "http://localhost:8102/api/v1/elo/predict/player1/player2/competitive_ruleset"
配置选项
ELO系统支持运行时配置调整:
const eloService = new EloService(repository, calculationService)
// 更新配置
eloService.updateEloConfig({
initialElo: 1500,
kFactor: {
newbie: 40,
normal: 20,
veteran: 10
},
minElo: 200,
maxElo: 2800
})
监控和日志
日志记录
- ELO更新详细日志
- 计算过程追踪
- 错误处理和恢复
性能监控
- 数据库查询优化
- 批量更新性能
- API响应时间
未来扩展
可能的增强功能
- 季度重置 - 定期重置ELO评级
- 衰减机制 - 长期不活跃玩家ELO衰减
- 匹配优化 - 基于ELO的智能匹配
- 成就系统 - ELO里程碑奖励
- 数据分析 - ELO分布统计和趋势分析
扩展新规则集
添加新规则集只需:
- 在规则系统中定义新规则集
- ELO系统自动支持(无需代码修改)
- 玩家首次游戏时自动创建ELO记录
故障排除
常见问题
-
ELO记录不存在
- 系统会自动创建初始记录
- 检查规则集ID是否正确
-
ELO更新失败
- 检查数据库连接
- 查看服务器日志
- 验证战斗数据完整性
-
API响应错误
- 确认数据库迁移已执行
- 检查API路由注册
- 验证请求参数格式
调试工具
# 测试ELO计算
npx tsx packages/server/src/test-elo.ts
# 检查数据库表
SELECT * FROM player_elo_ratings LIMIT 10;
# 查看API状态
curl "http://localhost:8102/api/v1/elo/config"