poker elo calculation update

Will be more balanced for larger groups of players
This commit is contained in:
Milo
2025-07-07 14:25:23 +02:00
parent 0871cccee7
commit 71d22458e6
2 changed files with 38 additions and 30 deletions

61
game.js
View File

@@ -222,6 +222,7 @@ export async function eloHandler(p1, p2, p1score, p2score, type) {
export async function pokerEloHandler(room) {
if (room.fakeMoney) return
let DBplayers = []
Object.keys(room.players).forEach(playerId => {
const DBuser = getUser.get(playerId)
@@ -231,46 +232,52 @@ export async function pokerEloHandler(room) {
})
const winnerIds = new Set(room.winners)
const baseK = 5
const playerCount = Object.keys(room.players).length
const K = baseK * Math.log2(playerCount)
const baseK = 10
const avgOpponentElo = (player) => {
const opponents = DBplayers.filter(p => p.id !== player.id);
return opponents.reduce((sum, p) => sum + p.elo, 0) / opponents.length;
};
DBplayers.forEach(player => {
const others = DBplayers.filter(p => p.id !== player.id)
const avgOppElo = others.reduce((sum, p) => sum + p.elo, 0) / others.length
const avgElo = avgOpponentElo(player);
const expectedScore = 1 / (1 + 10 ** ((avgElo - player.elo) / 400))
const expectedScore = 1 / (1 + Math.pow(10, (avgOppElo - player.elo) / 400))
let actualScore;
if (winnerIds.has(player.id)) {
if (winnerIds.size === DBplayers.length) {
actualScore = 0.5
} else {
actualScore = 1
}
actualScore = (winnerIds.size === playerCount) ? 0.5 : 1;
} else {
actualScore = 0
actualScore = 0;
}
const K = winnerIds.has(player.id) ? (baseK * playerCount) : baseK
const delta = K * (actualScore - expectedScore)
const newElo = Math.max(Math.floor(player.elo + delta), 0)
console.log(`${player.id} elo update : ${player.elo} -> ${newElo} (K: ${K})`)
updateElo.run({ id: player.id, elo: newElo })
insertGame.run({
id: player.id + '-' + Date.now().toString(),
p1: player.id,
p2: null,
p1_score: actualScore,
p2_score: null,
p1_elo: player.elo,
p2_elo: avgOppElo,
p1_new_elo: newElo,
p2_new_elo: null,
type: 'POKER_ROUND',
timestamp: Date.now(),
})
if (!isNaN(newElo)) {
console.log(`${player.id} elo update: ${player.elo} -> ${newElo} (K: ${K.toFixed(2)}, Δ: ${delta.toFixed(2)})`);
updateElo.run({ id: player.id, elo: newElo })
insertGame.run({
id: player.id + '-' + Date.now().toString(),
p1: player.id,
p2: null,
p1_score: actualScore,
p2_score: null,
p1_elo: player.elo,
p2_elo: avgElo,
p1_new_elo: newElo,
p2_new_elo: null,
type: 'POKER_ROUND',
timestamp: Date.now(),
})
} else {
console.log(`# ELO UPDATE ERROR -> ${player.id} elo update: ${player.elo} -> ${newElo} (K: ${K.toFixed(2)}, Δ: ${delta.toFixed(2)})`);
}
})
}

View File

@@ -609,7 +609,7 @@ client.on('messageCreate', async (message) => {
}
}
else if (message.content.startsWith(prefix + ':poker')) {
io.emit('message', message.content);
console.log('poker')
}
else if (message.content.startsWith(prefix + ':elo-test')) {
const numbers = message.content.match(/\d+/g);
@@ -3599,8 +3599,8 @@ app.post('/poker-room/join', async (req, res) => {
let amount = getUser.get(userId)?.coins
let fakeMoney = false
if (!amount || amount < 100) {
amount = 100
if (!amount || amount < 1000) {
amount = 1000
fakeMoney = true
}
@@ -4432,6 +4432,7 @@ async function updatePokerPlayersSolve(roomId) {
import http from 'http';
import { Server } from 'socket.io';
import * as test from "node:test";
const server = http.createServer(app);
const io = new Server(server, {