Ranking System Help

Started by
5 comments, last by KayT 7 years, 10 months ago

Hey guys, I am new to programming and gamedev forums. I am not sure if this is the right forum to post this but here it goes: I am trying to design a ranking system that's based on the trueskill system; Where you gain/lose points based on the difficulty of the level played and your current rank. This is how the system is designed:

  • Predictable outcomes (e.g. win against a lower ranked opponent) are treated as statistically less significant. Upsets are given more weight. So, winning against lower ranked opponents doesn't do much for your rating. Neither does losing against higher ranked ones. But beat a team that's 6 or more ranks above you and at least someone on your team will rank up.
  • In standard 4v4 format, the system approximates the skill of the team by using the average skill of the team. When calculating the skill of an opponent in a team game, the system uses the overall team skill values. For example: If a team has 4 players with skill levels of 15, 18, 17, and 16, then the average skill of the team would be an average of these numbers; 16.5.

The problem with this system is that people can artificially manipulate their skill by purposely losing games or de-ranking. So lets say someone who's a level 40 de-reranks their account all the way down to like a level 7. The system now sees this player as a bad player and expects him to lose. He then goes on to play with his friend who is also a level 40. A match may look something like this: Team 1: 40,39,38,7 vs Team 2: 37,36,36,35. There are two problems in this scenario:

  1. The level 7 skews system by bringing down the average skill of Team 1 to 31, while the average skill of Team 2 is 36. The system expects this player and his team to lose seeing any victory by this player as an upset. This results in his teammates receiving large amounts of extra elo boosting their ranks faster. This process is known as boosting. The problem here is that the level 7 actually has the skill level of a level 40 so his team shouldn't receive any extra elo for winning.
  2. Problem number 2 is a result of the matchmaking system being designed to make the average skill level of both teams as close as possible while still being within the matchmaking parameters. The system fills Team 2 with lesser level players in order to compensate for the level 7 on Team 1

In theory, I would like to design the system to account for these two problems. The key is to tell the system to not give out extra elo points in this situation, but I have no idea how to do this in programming language. In programming languages such as C++, is there any type of way I can combat these issues with some kind of exception or if/then statement. Any help on this issue would be much appreciated.

Advertisement

A programming language gives you a way to code a recipe into a form that a computer can execute it.

This implies you need to have a recipe before you can tell a computer about it. Computers are very stupid, but very fast, and very good with numbers.

The detail of a recipe here is along the lines of making your favorite food, you have to spell it out to the last drop

Assume t contains the value of the table you want to print, eg t=4 for the table of 4.

1 m := 1

2 if m > 10 then goto 7

3 p := t * m

4 print m, t, p

5 m := m + 1

6 go back to 2

7 end

As you can see, printing a table of 't' is a little longer than you'd say to another human.

A real programming language has nicer primitives, but at its core, the above is pretty much everything you can do: compute a new value, test for a condition, jump to a different line, and print output.

The design of the ranking system that you have so far is still too high level, you need to make it more detailed. Is the first step adding some numbers, or comparing some numbers? What must be done as second step?

Computers do not have a magic "solve my system problem" statement (I'd wish they have!). Using a computer in the end to run your recipe thus does not help you in the design (other than adding a 10,000 numbers or doing 1,000,000 steps in the recipe is no sweat, computers are really really fast with numbers).

I'd suggest to first for get about recipes and computers, and first try to write instructions for another person that you cannot meet face-to-face, you can only use written instructions. He/she has to use your system to judge ranking for teams. This is a very important competition, so better make sure your rules cover every possible case!

Once you have that, start worrying about telling it to a computer.

By doing it in two steps, you can solve the details of your ranking design first, and tell computers second, rather than trying to do both at the same time, which is a lot more complicated.

In the mean time, you may want to try a little computer programming as well. You do not seem to have much or any programming experience, reading from your description. In that case, C++ is probably a little too high for you at this time. C++ assumes the user knows what he/she is doing, and will happily do whatever you say, except it will just crash if you say the wrong things. Python is a very good first language to try instead. It will also crash, but at least it tells you what it found to be wrong. C# is another language (although I don't know the language).

thanks so much for the response!

A programming language gives you a way to code a recipe into a form that a computer can execute it.

This implies you need to have a recipe before you can tell a computer about it. Computers are very stupid, but very fast, and very good with numbers.

The detail of a recipe here is along the lines of making your favorite food, you have to spell it out to the last drop

Assume t contains the value of the table you want to print, eg t=4 for the table of 4.

1 m := 1

2 if m > 10 then goto 7

3 p := t * m

4 print m, t, p

5 m := m + 1

6 go back to 2

7 end

As you can see, printing a table of 't' is a little longer than you'd say to another human.

A real programming language has nicer primitives, but at its core, the above is pretty much everything you can do: compute a new value, test for a condition, jump to a different line, and print output.

The design of the ranking system that you have so far is still too high level, you need to make it more detailed. Is the first step adding some numbers, or comparing some numbers? What must be done as second step?

Computers do not have a magic "solve my system problem" statement (I'd wish they have!). Using a computer in the end to run your recipe thus does not help you in the design (other than adding a 10,000 numbers or doing 1,000,000 steps in the recipe is no sweat, computers are really really fast with numbers).

I'd suggest to first for get about recipes and computers, and first try to write instructions for another person that you cannot meet face-to-face, you can only use written instructions. He/she has to use your system to judge ranking for teams. This is a very important competition, so better make sure your rules cover every possible case!

Once you have that, start worrying about telling it to a computer.

By doing it in two steps, you can solve the details of your ranking design first, and tell computers second, rather than trying to do both at the same time, which is a lot more complicated.

In the mean time, you may want to try a little computer programming as well. You do not seem to have much or any programming experience, reading from your description. In that case, C++ is probably a little too high for you at this time. C++ assumes the user knows what he/she is doing, and will happily do whatever you say, except it will just crash if you say the wrong things. Python is a very good first language to try instead. It will also crash, but at least it tells you what it found to be wrong. C# is another language (although I don't know the language).

Wow, thanks so much for the informative response. I was trying my best not to sound too much like a novice but I guess that failed. The truth is, I am just a science major who has always had an interest in programming because of my gaming background. My favorite game series used to use a system like the one I mentioned above; A system that I absolutely loved despite its flaws. But in recent years, they have strayed away from this system because of the flaws that I mentioned. Even though the system had its problems, I still greatly prefer it to the current system that they use. I have always been a proponent of the fact that every problem has a solution, and I can't see this as being any different; Especially considering some of the amazing stuff that you guys do when programming these games. I just have such a strong passion for this franchise and would like to help out in any way that I can. Unfortunately, the developers won't even look at you twice unless you have a degree in the field; Which I guess is fair. It's just really hard for me to try and offer solutions without knowing what's actually possible in the programming languages. Here's a much more in-depth look at the system if you'd like to check it out, if not then it's fine. Again, thanks so much for your help, it's much appreciated. ttp://research.microsoft.com/en-us/projects/trueskill/details.aspx.

I was trying my best not to sound too much like a novice but I guess that failed.

Ha, you posted in the beginner forum :p

Seriously, it's fine. We get loads of new users here every week, although you're the first with a ranking system problem :)

The truth is, I am just a science major who has always had an interest in programming because of my gaming background. My favorite game series used to use a system like the one I mentioned above;

Programming a game is very different from playing one, unless you count "code a game" as play :p

When you play a game, you're a consumer. When you write/design a game, you're deciding what the player will experience, a very different yet satisfying problem.

I have always been a proponent of the fact that every problem has a solution

Love this idea. However I found some problems will take a life time or longer to solve, so it may be wise not to go near them :p

It's just really hard for me to try and offer solutions without knowing what's actually possible in the programming languages.

Euhm, you want to try to steer the developers of your game back to the original ranking system? Even with fixes for the flaws that's unlikely to happen. For commercial games, my guess is that even if you also fix flaws of the current system, they will still be very reluctant to accept your solution. (With acceptance come possible claims about ownership and/or payment for your work etc.)

For working on the flaws themselves, as I tried to explain before, programming is irrelevant until you can explain how to work with the fixed system in words. Computers are just a means to execute the system faster, nothing else. (A lot faster, often from minutes to micro-seconds.)

It seems a lot of people like to "design" games, and then code them based on this design. IE come up with a detailed ranking system before ever writing a line of code.

I would suggest that you code the very basics of your idea first - because in the process of coding you will likely stumble upon problems and solutions that you never would have by formulating some design on paper.

Once you have something working you can mutate and evolve that thing to something that is fun and when you have problems like "boosting" and such you qill have some tangible code to edit to fix the problem.

Otherwise you will spend a lot of time trying to solve problems that may never exist, and waste a lot of time writing needless code.

It seems a lot of people like to "design" games, and then code them based on this design. IE come up with a detailed ranking system before ever writing a line of code.

I would suggest that you code the very basics of your idea first - because in the process of coding you will likely stumble upon problems and solutions that you never would have by formulating some design on paper.

Once you have something working you can mutate and evolve that thing to something that is fun and when you have problems like "boosting" and such you qill have some tangible code to edit to fix the problem.

Otherwise you will spend a lot of time trying to solve problems that may never exist, and waste a lot of time writing needless code.

Hey thanks so much for the input man, I really appreciate it!

This topic is closed to new replies.

Advertisement