mirror of
https://github.com/cassoule/flopobot_v2.git
synced 2026-01-18 16:37:40 +01:00
poker elo calculation update
Will be more balanced for larger groups of players
This commit is contained in:
61
game.js
61
game.js
@@ -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)})`);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
7
index.js
7
index.js
@@ -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, {
|
||||
|
||||
Reference in New Issue
Block a user