elo 0.0.2.alpha

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
@@ -0,0 +1,124 @@
1
+ = Elo
2
+
3
+ From {Wikipedia}[http://en.wikipedia.org/wiki/Elo_rating_system]:
4
+
5
+ The Elo rating system is a method for calculating the relative skill levels of
6
+ players in two-player games such as chess and Go. It is named after its creator
7
+ Arpad Elo, a Hungarian-born American physics professor.
8
+
9
+ The Elo system was invented as an improved chess rating system, but today it is
10
+ also used in many other games. It is also used as a rating system for multiplayer
11
+ competition in a number of computer games, and has been adapted to team sports
12
+ including association football, American college football and basketball, and
13
+ Major League Baseball.
14
+
15
+ == Links
16
+
17
+ * {API documentation}[http://iain.github.com/elo/doc]
18
+ * {Source Code}[http://github.com/iain/elo]
19
+
20
+ == Usage
21
+
22
+ You need to have at least to players that can play a game (duh).
23
+
24
+ bob = Elo::Player.new
25
+ jane = Elo::Player.new(:rating => 1500)
26
+
27
+ Once you have players, you can register games in a variaty of ways.
28
+ There is more than one way to do it, choose whatever works from your other code:
29
+
30
+ game1 = bob.wins_from(jane)
31
+ game2 = bob.loses_from(jane)
32
+ game3 = bob.plays_draw(jane)
33
+
34
+ game4 = bob.versus(jane)
35
+ game4.winner = jane
36
+
37
+ game5 = bob.versus(jane)
38
+ game5.loser = jane
39
+
40
+ game6 = bob.versus(jane)
41
+ game6.draw
42
+
43
+ game7 = bob.versus(jane)
44
+ game7.result = 1 # result is in perspective of bob, so bob wins
45
+
46
+ You can get all kinds of info from a player:
47
+
48
+ bob.rating
49
+ bob.pro?
50
+ bob.starter?
51
+ bob.pro_rating?
52
+ bob.games_played
53
+ bob.games
54
+
55
+ Or get a list of players:
56
+
57
+ Elo::Player.all
58
+
59
+
60
+ == Configuration
61
+
62
+ You can configure Elo in many ways. In it's default configuration, it is configured
63
+ in the same way as the {FIDE}[http://www.fide.com/] (World Chess Foundation).
64
+
65
+ Altering settings to your liking is very easy and very flexible. You can even specify
66
+ your own K-factor rules. Have a look at the Rdoc in the code for a complete reference.
67
+
68
+ Here is an example:
69
+
70
+ Elo.configure do |config|
71
+
72
+ # Every player starts with a rating of 1000
73
+ config.default_rating = 1000
74
+
75
+ # A player is considered a pro, when he/she has more than 2400 points
76
+ config.pro_rating_boundry = 2400
77
+
78
+ # A player is considered a new, when he/she has played less than 30 games
79
+ config.starter_boundry = 30
80
+
81
+ end
82
+
83
+ == About the K-factor
84
+
85
+ The Elo rating system knows a variable called the "K-factor". The K-factor is used
86
+ to reward new talent and stableize the rating once a player is participating longer.
87
+
88
+ FIDE (the World Chess Foundation), gives players with less than 30 played games a
89
+ K-factor of 25. Normal players get a K-factor of 15 and pro's get a K-factor of 10.
90
+ Once you reach a pro status, you're K-factor never changes, even if your rating drops.
91
+
92
+ You need to provide Elo the amount of games played, their rating and their pro-status.
93
+
94
+ bob = Elo::Player.new(:games_played => 29, :rating => 2300, :pro => true)
95
+
96
+ You can define your own K-factors by adding K-factor rules.
97
+ This code will change the K-factor to 12, for every player who's name starts with a B,
98
+ and 16 for everybody else.
99
+
100
+ Elo.configure do |config|
101
+ config.k_factor(12) { name =~ /^b/i }
102
+ config.default_k_factor = 16
103
+ config.use_FIDE_settings = false
104
+ end
105
+
106
+
107
+
108
+ == Installation
109
+
110
+ gem install elo
111
+
112
+ == Note on Patches/Pull Requests
113
+
114
+ * Fork the project.
115
+ * Make your feature addition or bug fix.
116
+ * Add tests for it. This is important so I don't break it in a
117
+ future version unintentionally.
118
+ * Commit, do not mess with rakefile, version, or history.
119
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
120
+ * Send me a pull request. Bonus points for topic branches.
121
+
122
+ == Copyright
123
+
124
+ Copyright (c) 2010 Iain Hecker. Released under the MIT License
@@ -0,0 +1,50 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "elo"
8
+ gem.summary = %Q{The Elo rating system is a method for calculating the relative skill levels of players in two-player games such as cess and Go.}
9
+ gem.description = %Q{The Elo rating system is a method for calculating the relative skill levels of players in two-player games such as cess and Go.}
10
+ gem.email = "iain@iain.nl"
11
+ gem.homepage = "http://github.com/iain/elo"
12
+ gem.authors = ["Iain Hecker"]
13
+ gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+ Jeweler::GemcutterTasks.new
17
+ rescue LoadError
18
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
19
+ end
20
+
21
+ require 'spec/rake/spectask'
22
+ Spec::Rake::SpecTask.new(:spec) do |spec|
23
+ spec.libs << 'lib' << 'spec'
24
+ spec.spec_files = FileList['spec/**/*_spec.rb']
25
+ end
26
+
27
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
28
+ spec.libs << 'lib' << 'spec'
29
+ spec.pattern = 'spec/**/*_spec.rb'
30
+ spec.rcov = true
31
+ end
32
+
33
+ task :spec => :check_dependencies
34
+
35
+ task :default => :spec
36
+
37
+ begin
38
+ require 'hanna/rdoctask'
39
+ rescue LoadError
40
+ require 'rake/rdoctask'
41
+ end
42
+
43
+ Rake::RDocTask.new do |rdoc|
44
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
45
+
46
+ rdoc.rdoc_dir = 'doc'
47
+ rdoc.title = "elo #{version}"
48
+ rdoc.rdoc_files.include('README*')
49
+ rdoc.rdoc_files.include('lib/**/*.rb')
50
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.2.alpha
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2
+ <html lang='en'>
3
+ <head>
4
+ <title>: Elo [elo ]</title>
5
+ <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
6
+ <link href='../rdoc-style.css' media='screen' rel='stylesheet' type='text/css'>
7
+ <script type='text/javascript'>
8
+ //<![CDATA[
9
+ function popupCode(url) {
10
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
11
+ }
12
+
13
+ function toggleCode(id) {
14
+ var code = document.getElementById(id)
15
+
16
+ code.style.display = code.style.display != 'block' ? 'block' : 'none'
17
+ return true
18
+ }
19
+
20
+ // Make codeblocks hidden by default
21
+ document.writeln('<' + 'style type="text/css">.method .source pre { display: none }<\/style>')
22
+ //]]>
23
+ </script>
24
+ </head>
25
+ <body class='page'>
26
+ <div class='class' id='wrapper'>
27
+ <div class='header'>
28
+ <h1 class='name'>
29
+ <span class='type'>Module</span>
30
+ Elo
31
+ </h1>
32
+ <ol class='paths'>
33
+ <li>
34
+ <a href="../files/lib/elo_rb.html">lib/elo.rb</a>
35
+ </li>
36
+ </ol>
37
+ </div>
38
+ <div id='content'>
39
+ <div id='text'>
40
+ <div id='description'>
41
+ <p>
42
+ The configuration of <a href="Elo.html">Elo</a> is done here.
43
+ </p>
44
+ <p>
45
+ See <a href="../files/README_rdoc.html">README.rdoc</a> for general
46
+ information about <a href="Elo.html">Elo</a>.
47
+ </p>
48
+ </div>
49
+ <div id='section'>
50
+ <div id='class-list'>
51
+ <h2>Classes and Modules</h2>
52
+ Module <a href="Elo/Configuration.html" class="link">Elo::Configuration</a><br />
53
+ Module <a href="Elo/EloHelper.html" class="link">Elo::EloHelper</a><br />
54
+ Class <a href="Elo/Game.html" class="link">Elo::Game</a><br />
55
+ Class <a href="Elo/Player.html" class="link">Elo::Player</a><br />
56
+ Class <a href="Elo/Rating.html" class="link">Elo::Rating</a><br />
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ <div id='footer-push'></div>
62
+ </div>
63
+ <div id='footer'>
64
+ <a href="http://github.com/mislav/hanna/tree/master"><strong>Hanna</strong> RDoc template</a>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,184 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2
+ <html lang='en'>
3
+ <head>
4
+ <title>: Elo::Configuration [elo ]</title>
5
+ <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
6
+ <link href='../../rdoc-style.css' media='screen' rel='stylesheet' type='text/css'>
7
+ <script type='text/javascript'>
8
+ //<![CDATA[
9
+ function popupCode(url) {
10
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
11
+ }
12
+
13
+ function toggleCode(id) {
14
+ var code = document.getElementById(id)
15
+
16
+ code.style.display = code.style.display != 'block' ? 'block' : 'none'
17
+ return true
18
+ }
19
+
20
+ // Make codeblocks hidden by default
21
+ document.writeln('<' + 'style type="text/css">.method .source pre { display: none }<\/style>')
22
+ //]]>
23
+ </script>
24
+ </head>
25
+ <body class='page'>
26
+ <div class='class' id='wrapper'>
27
+ <div class='header'>
28
+ <h1 class='name'>
29
+ <span class='type'>Module</span>
30
+ Elo::Configuration
31
+ </h1>
32
+ <ol class='paths'>
33
+ <li>
34
+ <a href="../../files/lib/elo_rb.html">lib/elo.rb</a>
35
+ </li>
36
+ </ol>
37
+ </div>
38
+ <div id='content'>
39
+ <div id='text'>
40
+ <div id='method-list'>
41
+ <h2>Methods</h2>
42
+ <h3>public instance</h3>
43
+ <ol>
44
+ <li><a href="#M000006">configure</a></li>
45
+ <li><a href="#M000005">k_factor</a></li>
46
+ </ol>
47
+ </div>
48
+ <div id='section'>
49
+ <div id='attribute-list'>
50
+ <h2 class='section-bar'>Attributes</h2>
51
+ <div class='name-list'>
52
+ <table>
53
+ <tr class='top-aligned-row context-row'>
54
+ <td class='context-item-name'>default_k_factor</td>
55
+ <td class='context-item-value'>[RW]</td>
56
+ <td class='context-item-desc'>
57
+
58
+ The default k-factor is chosen when no k-factor rules apply. K-factor rules
59
+ can be added by using the <tt><a
60
+ href="Configuration.html#M000005">k_factor</a></tt>-method. (default = 15)
61
+ </td>
62
+ </tr>
63
+ <tr class='top-aligned-row context-row'>
64
+ <td class='context-item-name'>default_rating</td>
65
+ <td class='context-item-value'>[RW]</td>
66
+ <td class='context-item-desc'>
67
+
68
+ This is the rating every player starts out with. (default = 1000)
69
+ </td>
70
+ </tr>
71
+ <tr class='top-aligned-row context-row'>
72
+ <td class='context-item-name'>pro_rating_boundry</td>
73
+ <td class='context-item-value'>[RW]</td>
74
+ <td class='context-item-desc'>
75
+
76
+ This is the lower boundry of the rating you need to be a pro player. This
77
+ setting is used in the FIDE k-factor rules. (default = 2400)
78
+ </td>
79
+ </tr>
80
+ <tr class='top-aligned-row context-row'>
81
+ <td class='context-item-name'>starter_boundry</td>
82
+ <td class='context-item-value'>[RW]</td>
83
+ <td class='context-item-desc'>
84
+
85
+ This is the lower boundry in the amount of games played to be a starting
86
+ player This setting is used in the FIDE k-factor rules. (default = 30)
87
+ </td>
88
+ </tr>
89
+ <tr class='top-aligned-row context-row'>
90
+ <td class='context-item-name'>use_FIDE_settings</td>
91
+ <td class='context-item-value'>[RW]</td>
92
+ <td class='context-item-desc'>
93
+
94
+ Use the settings that FIDE use for determening the K-factor. This is the
95
+ case when all settings are unaltered. (default = true)
96
+
97
+ <p>
98
+ In short:
99
+ </p>
100
+ <ul>
101
+ <li>K-factor is 25 when a player is a starter (less than 30 games played)
102
+
103
+ </li>
104
+ <li>K-factor is 10 when a player is a pro (rating above 2400, now or in the
105
+ past)
106
+
107
+ </li>
108
+ <li>K-factor is 15 when a player in other cases
109
+
110
+ </li>
111
+ </ul>
112
+ <p>
113
+ If you want to use your own settings, either change the boundry settings,
114
+ or set this setting to false and add you&#8217;re own k-factor rules.
115
+ K-factor rules can be added by using the <tt><a
116
+ href="Configuration.html#M000005">k_factor</a></tt>-method.
117
+ </p>
118
+ </td>
119
+ </tr>
120
+ </table>
121
+ </div>
122
+ </div>
123
+ <div id='methods'>
124
+ <h2>Public instance methods</h2>
125
+ <div class='method public-instance' id='method-M000006'>
126
+ <a name='M000006'></a>
127
+ <div class='synopsis'>
128
+ <span class='name'>configure</span>
129
+ <span class='arguments'>() {|self| ...}</span>
130
+ </div>
131
+ <div class='description'>
132
+ <p>
133
+ Configure <a href="../Elo.html">Elo</a> in a block style.
134
+ </p>
135
+ <pre>Elo.configure do |config|&#x000A; config.setting = value&#x000A;end</pre>
136
+ </div>
137
+ <div class='source'>
138
+ <a class='source-toggle' href='#' onclick="toggleCode('M000006-source'); return false">
139
+ [show source]
140
+ </a>
141
+ <pre id='M000006-source'><span class="ruby-comment cmt"># File lib/elo.rb, line 68</span>&#x000A; <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">configure</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)&#x000A; <span class="ruby-keyword kw">yield</span>(<span class="ruby-keyword kw">self</span>)&#x000A; <span class="ruby-keyword kw">end</span></pre>
142
+ </div>
143
+ </div>
144
+ <div class='method public-instance' id='method-M000005'>
145
+ <a name='M000005'></a>
146
+ <div class='synopsis'>
147
+ <span class='name'>k_factor</span>
148
+ <span class='arguments'>(factor, &amp;rule)</span>
149
+ </div>
150
+ <div class='description'>
151
+ <p>
152
+ Add a K-factor rule. The first argument is the k-factor value. The block
153
+ should return a boolean that determines if this K-factor rule applies. The
154
+ first rule that applies is the one determining the K-factor.
155
+ </p>
156
+ <p>
157
+ The block is instance_eval&#8216;ed into the player, so you can access all
158
+ it&#8217;s properties directly. The K-factor is recalculated every time a
159
+ match is played.
160
+ </p>
161
+ <p>
162
+ By default, the FIDE settings are used (see: <tt>use_FIDE_settings</tt>).
163
+ To implement that yourself, you could write:
164
+ </p>
165
+ <pre>Elo.configure do |config|&#x000A; config.k_factor(10) { pro? or pro_rating? }&#x000A; config.k_factor(25) { starter? }&#x000A; config.default_k_factor = 15&#x000A;end</pre>
166
+ </div>
167
+ <div class='source'>
168
+ <a class='source-toggle' href='#' onclick="toggleCode('M000005-source'); return false">
169
+ [show source]
170
+ </a>
171
+ <pre id='M000005-source'><span class="ruby-comment cmt"># File lib/elo.rb, line 30</span>&#x000A; <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">k_factor</span>(<span class="ruby-identifier">factor</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">rule</span>)&#x000A; <span class="ruby-identifier">k_factors</span> <span class="ruby-operator">&lt;&lt;</span> { <span class="ruby-identifier">:factor</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">factor</span>, <span class="ruby-identifier">:rule</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">rule</span> }&#x000A; <span class="ruby-keyword kw">end</span></pre>
172
+ </div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ </div>
177
+ </div>
178
+ <div id='footer-push'></div>
179
+ </div>
180
+ <div id='footer'>
181
+ <a href="http://github.com/mislav/hanna/tree/master"><strong>Hanna</strong> RDoc template</a>
182
+ </div>
183
+ </body>
184
+ </html>