Elo Chess Al go: назначение К-фактора отдельным игрокам в одном цикле событий - PullRequest
0 голосов
/ 29 апреля 2020

Ниже приведена часть шахматного рейтинга Эло al go (извините за соглашение об именах, оно является предварительным):

 let newRankRed = red[rank] + (redK * (results[result] - winProbRed))
 let newRankBlue = blue[rank] + (blueK * (Math.abs(results[result]-1) - winProbBlue))

Коэффициент K (redK, blueK) - это число, которое изменится в зависимости от того, сколько матчей было у игрока. Объекты Player хранятся в БД, а свойство записи (количество совпадений у них) является просто числовым свойством объекта Player. Мой вопрос таков: у двух игроков был матч, и результат был отправлен в приложение. Приложение попадает в базу данных, выбирает обоих игроков и проверяет их записи, чтобы определить правильный коэффициент K для каждого игрока. Два игрока, два отдельных коэффициента K: Каков наилучший способ назначить правильный коэффициент K? Я знаю, что у нас может быть несколько условных операторов, таких как:

if (red.record >= 0 && red.record <=10) redK = 32
else if ...

Но это приведет к длинному и неуклюжему коду, и это должно быть сделано для каждого игрока.

Может кто-нибудь предложить лучшую альтернативу?

1 Ответ

0 голосов
/ 29 апреля 2020

Только что понял это. Ниже приведена часть решения; красный и синий - объекты игрока со свойством record:

let redK, blueK

let red = await PlayerData.getPlayerById(redId)
let blue = await PlayerData.getPlayerById(blueId)

[[red, redK], [blue, blueK]].forEach((pair) =>{
  if(pair[0].record >=0 && pair[0].record <= 12) pair[1]= 32
  else if(pair[0].record >=13 && pair[0].record <= 24) pair[1]= 24
  else pair[1]= 16
})

Это избавляет меня от необходимости переписывать условные операторы для каждого игрока. Если у кого-то есть лучшее решение, было бы здорово его увидеть.

...