# Help with a small Javascript

Hi,
I am a newbie to JavaScript (REALLY).  I am trying to test/debug a small script to calculate ELO changes between to players in a game.  An ELO is a rating system.  It is an exchange of points between 2 players based on your probability of winning and the maximum amount of points possible (16 in this case).

It's hard for me to interpret some of this code.  It works properly in calculating the new ELO for the loser.  But it does not work for the winner.
Note the points substracted from the loser's starting ELO shlould be added to the winner's starting ELO.

Here is a link to a web site that does it properly:
Elo Calculator Site
Use 16 as the "K factor" to match my results in the bottome part of the page.

Here is my script.  The 2 players have a starting ELO of 2300 and 2100.  The higher rated player wins in my example which you can run as HTML.

The looser loses 4 points correctly.  But the winner gains 19?  The winner should gain +4 points and end up with 2304.

Here is the code
``````<html>

<title>ELO Calculator</title>

<body  bgcolor="#FFFFFF">

<h1>

<script type="text/javascript">
var playerElos = [];
playerElos[1] = 2300;
playerElos[-1] = 2100;

/*  these are the starting ELO of 2 players ("1" and "-1")
The winner is designated below    */

var winner = 1

var expected={
"1": 1/(1+(Math.pow(10,(playerElos[-1]-playerElos[1])/400))),
"-1": 1/(1+(Math.pow(10,(playerElos[1]-playerElos[-1])/400))),
}
var score;
switch(winner) {
case 1: score={"1":2,"-1":0}; break;
case -1: score={"1":0,"-1":2}; break;
default: score={"1":1,"-1":1}; break;
}
var newElos={
"1": playerElos[1]+16*(score[1]-expected[1]),
"-1": playerElos[-1]+16*(score[-1]-expected[-1]),
}

document.write("Hello World! <br/>");
document.write(newElos[1] + "<br/>");
document.write(newElos[-1] + "<br/>");
document.write("Hello World! <br/>");

</script>

</h1>

</body>

</html>
``````

Can anyone see why this is happening?

hefterr
LVL 1
###### Who is Participating?

Commented:
Your algorithm is not the same as theirs
Here is there's
``````function CalculateRatingChange()

{

// Ensure Elo1 is an number
var Elo1 = document.rating.elo1.value * 1;

// Ensure Elo2 is an number
var Elo2 = document.rating.elo2.value * 1;

// Ensure k value is a number
var K = document.rating.K.value * 1;

// Take the difference in the Elo's
var EloDifference = Elo2 - Elo1;

// This is where they do one calc and you do 2
// basically in your example works out to
// 1 / ( 1 + 10^.5) ~ 75%
var percentage = 1 / ( 1 + Math.pow( 10, EloDifference / 400 ) );

// Basically 25% goes to the win
var win = Math.round( K * ( 1 - percentage ) );

var draw = Math.round( K * ( .5 - percentage ) );

// Create the labels
if (win > 0 ) win = "+" + win;

// Create the labels
if (draw > 0 ) draw = "+" + draw;

// Write to the document
document.ratingchange.win.value = win;

document.ratingchange.draw.value = draw;

// 75% goes to the loss - in this example
document.ratingchange.loss.value = Math.round( K * ( 0 - percentage ) );

document.ratingchange.percent.value =  Math.round( percentage * 100 ) + "%";

}
``````
0

Author Commented:
Hi Julian,
Thanks for showing me theirs.

Can you see the error in mine for the winner?  I'm not sure how to interpret the "case" statements in my example.

``````var score;
switch(winner) {
case 1: score={"1":2,"-1":0}; break;
case -1: score={"1":0,"-1":2}; break;
default: score={"1":1,"-1":1}; break;
}
``````

Thanks again,
hefterr
0

Commented:
The case statement is just assigning a score depending on who is the winner.

I don't know enough about ELO's to say what it is doing but based on your test data when winner=1 then
score[1] = 2 and score[-1] = 0
0

Author Commented:
Hi Julian,
Thanks for you help.  I found the problem,

The code in the script
I found the problem:

The original code:

``````var score;
switch(winner) {
case 1: score={"1":2,"-1":0}; break;
case -1: score={"1":0,"-1":2}; break;
default: score={"1":1,"-1":1}; break;
}
``````

S/B

``````  case 1: score={"1":1,"-1":0}; break;
case -1: score={"1":0,"-1":1}; break;
default: score={"1":.5,"-1":.5}; break;
``````

This works fine now.

Thanks,
again.
0

Author Commented:

rbh
0

Commented:
You are welcome.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.