Topic: Cистема оценки Ladder'a Elo
Система очков, используемая Battle.net, является той же самой системой оценки Elo.
Вопрос как ее изменить ?
PvPGN Community Forums |
forums.pvpgn.pro → [RU] Starcraft → Cистема оценки Ladder'a Elo
Система очков, используемая Battle.net, является той же самой системой оценки Elo.
Вопрос как ее изменить ?
Редактированием исходного кода
/*
* Compute probability of winning using the Elo system
*
* The formula is:
*
* D = rating(player a) - rating(player b)
*
* 1
* Pwin(D) = ------------------
* -(D / 400)
* 1 + 10
*/
static double probability(unsigned int a, unsigned int b)
{
double i, j;i = (((double)a) - ((double)b)) / 400.0;
j = std::pow(10.0,-i);
return (1.0 / (1.0+j));
}...
как правильно переписать формулы так чтобы соответствовала этому:
Standing of your opponent If your win If you lose
5 or + ranks above yours 250 pts 0 pts
4 ranks above yours 230pts -10 pts
3 ranks above yours 210 pts -20 pts
2 ranks above yours 190 pts -30 pts
1 rank above yours 170 pts -40 pts
The same rank 150 pts -50 pts
1 rank below yours 130 pts -10 pts
2 ranks below yours 110 pts -70 pts
3 ranks below yours 90 pts -80 pts
4 ranks below yours 70 pts -90 pts
5 or + ranks below yours 50 pts -100 pts
Note : A team which is 6 never loses any points
Для начала нужно разобраться что есть что.
pts, как я понял, рейтинг, который прибавляеся или вычитается от текущего у игрока.
А ранк что такое, и как понимать "A team which is 6"?
хотелось бы вот что
Тебе надо изменить значение delta в файле ladder_calc.cpp в строках 616 и 618 для виннера и лузера соответственно. Эта дельта и есть прибавляемый и вычитаемый рейтинг по окончании игры.
В sorted в этой же функции хранится сортированный массив рейтингов игроков. Те что выиграли, находятся в начале массива, и те кто проиграл - в конце.
Нужно написать две функции: одну для расчета ранков каждого плеера (по рейтингу), и одну для расчета дельты (по расчитаным ранкам).
Всё наверное. Только нужно учесть, что там жестко закодированы функции расчета результатов игр с более чем двумя игроками, поэтому больше половины ихнего кода можно вообще удалить и сделать только для двух.
это понятно спс
а как сделать чтобы в профиле над win loss показывались очки ладдера ?
проверь и если что то не правильно отредактируй пожалуйста))
{
unsigned int a,b;
double ab;
int rdiffa, rdiffb;
a = rating[0];
b = rating[1];
/* Check player A rank */
if(a < 850 && a > 0)
rdiffa=1;
if(a > 849 && a < 1000)
rdiffa=2;
else if(a > 999 && a < 1500)
rdiffa=3;
else if(a > 1499 && a < 2000)
rdiffa=4;
else if(a > 1999 && a < 2500)
rdiffa=5;
else if(a > 2499 && a < 3000)
rdiffa=6;
else if(a > 2999 && a < 4000)
rdiffa=7;
else if(a > 3999 && a < 5000)
rdiffa=8;
else if(a > 4999 && a < 6000)
rdiffa=9;
else if(a > 5999 && a < 7000)
rdiffa=10;
else if(a > 6999 && a < 8000)
rdiffa=11;
else if(a > 7999 && a < 9000)
rdiffa=12;
else if(a > 8999 && a < 10000)
rdiffa=13;
else if(a > 9999 && a < 11000)
rdiffa=14;
else if(a > 10999 && a < 12000)
rdiffa=15;
else if(a > 11999 && a < 13000)
rdiffa=16;
else if(a > 12999 && a < 15000)
rdiffa=17;
else if(a > 15000)
rdiffa=18;
/* end of check player A rank */
/* Check player B rank */
if(b < 850 && b > 0)
rdiffb=1;
if(b > 849 && b < 1000)
rdiffb=2;
else if(b > 999 && b < 1500)
rdiffb=3;
else if(b > 1499 && b < 2000)
rdiffb=4;
else if(b > 1999 && b < 2500)
rdiffb=5;
else if(b > 2499 && b < 3000)
rdiffb=6;
else if(b > 2999 && b < 4000)
rdiffb=7;
else if(b > 3999 && b < 5000)
rdiffb=8;
else if(b > 4999 && b < 6000)
rdiffb=9;
else if(b > 5999 && b < 7000)
rdiffb=10;
else if(b > 6999 && b < 8000)
rdiffb=11;
else if(b > 7999 && b < 9000)
rdiffb=12;
else if(b > 8999 && b < 10000)
rdiffb=13;
else if(b > 9999 && b < 11000)
rdiffb=14;
else if(b > 10999 && b < 12000)
rdiffb=15;
else if(b > 11999 && b < 13000)
rdiffa=16;
else if(b > 12999 && b < 15000)
rdiffa=17;
else if(b > 15000)
rdiffb=18;
/* end of check player B rank */
//ab = probability(a,b);
//ab = (double)100;
ab=(double)(rdiffb-rdiffa);
return ab;
}
Code:
if (prob<=-4)
k=-100;
else if (prob==-3)
k=-75;
else if (prob==-2)
k=-50;
else if (prob==-1)
k=-25;
else if (prob==0)
k=0;
else if (prob==1)
k=25;
else if (prob==2)
k=50;
else if (prob==3)
k=75;
else if (prob>=4)
k=100;
Code:
if (results[curr]==game_result_win)
// delta = fabs(k * (1.0 - prob)
delta = (double)(100)+k;
else
// delta = -fabs(k * prob);
delta = (double)((-50)+(-k/2));
Это ты отсюда взял
Да, это вполне подходит, но там другая система подсчета.
угу, хотел уточнить корректно ли это будет работать ? и очки будут начисляться так ?
win loss
same lvl +100 -50
1 more lvl +125 -33
2 more lvl +150 -25
3 more lvl +175 -17
4 more lvl +200 -0
1 less lvl +87 -67
2 less lvl +75 -75
3 less lvl +50 -87
4 less lvl +37 -100
Да. Только разброс по рейтингу, имхо, очень большой. 15к на любительском серваке навряд ли кто-то наберет.
это то да, спс огромное ))
а как сделать чтобы в профиле над win loss показывались очки ладдера ?
Хех, а покажи скрин на каком сервере в этом месте они показывается
И что такое очки ладдера?
тогда так )) можно ли их впихнуть в профиль и если можно, то как ?
Можно только в те поля, что существуют в клиенте игры в этом окошке профиля. Там около 4 полей: вин, лосс, посл. результат, и время посл. игры.
Смотри в файле src/client/bnstat.cpp
вместо дисконекта можно будет попробовать)))
else if (std::strcmp(clienttag,"SEXP")==0)
{
packet_append_string(packet,"Record\\SEXP\\0\\last game");
packet_append_string(packet,"Record\\SEXP\\0\\last game result");
packet_append_string(packet,"Record\\SEXP\\0\\wins");
packet_append_string(packet,"Record\\SEXP\\0\\losses");
packet_append_string(packet,"Record\\SEXP\\0\\disconnects");//можно же вместо disconnects ? и если да то ее заменить на *packet_append_string(packet,"Record\\SEXP\\1\\rating");*//
packet_append_string(packet,"Record\\SEXP\\0\\draws");
count += 6;
Major, а на ик-кап зайти и посмотреть не?
неа))
Ну попробуй.
http://www.iccup.com/starcraft/sc_start.html
и что эта ссылка должна была тать ?
Зайди на серв и посмотри, как там сделано, перед тем, как спрашивать.
forums.pvpgn.pro → [RU] Starcraft → Cистема оценки Ladder'a Elo