neuro_gammon 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/.hgignore +7 -0
- data/.loadpath +6 -0
- data/.project +24 -0
- data/README +3 -0
- data/Rakefile +37 -0
- data/VERSION +1 -0
- data/fred.net +34 -0
- data/lib/main.rb +49 -0
- data/lib/main2.rb +73 -0
- data/lib/neuro_gammon.rb +1 -0
- data/lib/neuro_gammon/base_neural_player.rb +62 -0
- data/lib/neuro_gammon/base_player.rb +18 -0
- data/lib/neuro_gammon/best_of_tournament_engine.rb +60 -0
- data/lib/neuro_gammon/board.rb +236 -0
- data/lib/neuro_gammon/board_tools.rb +46 -0
- data/lib/neuro_gammon/dice.rb +60 -0
- data/lib/neuro_gammon/fann_player.rb +116 -0
- data/lib/neuro_gammon/game.rb +44 -0
- data/lib/neuro_gammon/game_engine.rb +75 -0
- data/lib/neuro_gammon/lazy_player.rb +25 -0
- data/lib/neuro_gammon/random_player.rb +38 -0
- data/nbproject/private/rake-t.txt +1 -0
- data/nbproject/project.properties +6 -0
- data/nbproject/project.xml +15 -0
- data/neuro_gammon.gemspec +82 -0
- data/test/test_base_player.rb +32 -0
- data/test/test_board.rb +384 -0
- data/test/test_board_tools.rb +91 -0
- data/test/test_dice.rb +109 -0
- data/test/test_fann_player.rb +50 -0
- data/test/test_game.rb +111 -0
- data/test/test_game_engine.rb +35 -0
- metadata +136 -0
data/test/test_dice.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
#
|
2
|
+
# To change this template, choose Tools | Templates
|
3
|
+
# and open the template in the editor.
|
4
|
+
|
5
|
+
|
6
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
7
|
+
|
8
|
+
require 'test/unit'
|
9
|
+
require 'neuro_gammon/dice'
|
10
|
+
|
11
|
+
class TestDice < Test::Unit::TestCase
|
12
|
+
include NeuroGammon
|
13
|
+
def setup
|
14
|
+
@dice=Dice.new
|
15
|
+
class << @dice
|
16
|
+
def set=values
|
17
|
+
@values=values
|
18
|
+
check_state
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_init
|
24
|
+
|
25
|
+
assert_equal true,@dice[0]>0 && @dice[0]<=6
|
26
|
+
assert_equal true,@dice[1]>0 && @dice[1]<=6
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_roll
|
30
|
+
|
31
|
+
10.downto(0) do
|
32
|
+
@dice.roll
|
33
|
+
assert_equal true,@dice[0]>0 && @dice[0]<=6
|
34
|
+
assert_equal true,@dice[1]>0 && @dice[1]<=6
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_double
|
39
|
+
|
40
|
+
@dice.set=[1,2]
|
41
|
+
assert_not_nil @dice.double?
|
42
|
+
assert_equal false,@dice.double?
|
43
|
+
@dice.set=[2,2]
|
44
|
+
assert_not_nil @dice.double?
|
45
|
+
assert_equal true,@dice.double?
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_to_a
|
49
|
+
|
50
|
+
@dice.set=[1,2]
|
51
|
+
assert_equal [1,2],@dice.to_a
|
52
|
+
@dice.set=[3,3]
|
53
|
+
assert @dice.double?
|
54
|
+
assert_equal [3,3,3,3],@dice.to_a
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_each
|
58
|
+
|
59
|
+
@dice.set=[1,6]
|
60
|
+
t=[]
|
61
|
+
@dice.each {|v| t << v}
|
62
|
+
assert_equal [1,6],t
|
63
|
+
|
64
|
+
t=[]
|
65
|
+
@dice.each do |v|
|
66
|
+
t<<v
|
67
|
+
end
|
68
|
+
assert_equal [1,6],t
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_use
|
72
|
+
|
73
|
+
@dice.set=[1,2]
|
74
|
+
@dice.use!(1)
|
75
|
+
assert_equal [2],@dice.to_a
|
76
|
+
|
77
|
+
@dice.set=[4,3]
|
78
|
+
@dice.use!(3)
|
79
|
+
assert_equal [4],@dice.to_a
|
80
|
+
@dice.use!(4)
|
81
|
+
assert_equal [],@dice.to_a
|
82
|
+
|
83
|
+
@dice.set=[5,5,5,5]
|
84
|
+
@dice.use!(5)
|
85
|
+
assert_equal [5,5,5],@dice.to_a
|
86
|
+
@dice.use!(5)
|
87
|
+
assert_equal [5,5],@dice.to_a
|
88
|
+
@dice.use!(5)
|
89
|
+
assert_equal [5],@dice.to_a
|
90
|
+
@dice.use!(5)
|
91
|
+
assert_equal [],@dice.to_a
|
92
|
+
|
93
|
+
@dice.set=[1,2]
|
94
|
+
assert_raise(Exception) {@dice.use!(5)}
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_use2
|
99
|
+
while @dice.double?
|
100
|
+
@dice.roll
|
101
|
+
end
|
102
|
+
assert_equal 2,@dice.to_a.size
|
103
|
+
@dice.use!(@dice[0])
|
104
|
+
assert_equal 1,@dice.to_a.size
|
105
|
+
@dice.use!(@dice[0])
|
106
|
+
assert_equal 0,@dice.to_a.size
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require 'neuro_gammon/fann_player'
|
3
|
+
require 'neuro_gammon/board'
|
4
|
+
require 'neuro_gammon/dice'
|
5
|
+
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
class TestFannPlayer < Test::Unit::TestCase
|
9
|
+
|
10
|
+
include NeuroGammon
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@board=Board.new
|
14
|
+
@dice=Dice.new
|
15
|
+
@player=FannPlayer.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_init
|
19
|
+
assert_not_nil @player
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_suggest_move
|
23
|
+
moves=@player.suggest_move(@board,@dice,Board::BLACK)
|
24
|
+
assert_not_nil moves
|
25
|
+
assert !moves.empty?
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_to_and_from_yaml
|
29
|
+
moves=@player.suggest_move(@board,@dice,Board::BLACK)
|
30
|
+
|
31
|
+
#dump and load from yaml and check the suggested moves are the same
|
32
|
+
yaml=YAML::dump(@player)
|
33
|
+
|
34
|
+
assert_not_nil yaml
|
35
|
+
player2=FannPlayer.from_yaml(yaml)
|
36
|
+
|
37
|
+
moves2=player2.suggest_move(@board,@dice,Board::BLACK)
|
38
|
+
assert_equal moves,moves2
|
39
|
+
end
|
40
|
+
|
41
|
+
#not really a unit test :)
|
42
|
+
def test_play_and_learn
|
43
|
+
player2=FannPlayer.new
|
44
|
+
ge = GameEngine.new(@player,player2)
|
45
|
+
game = ge.play_game
|
46
|
+
@player.learn!([game])
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
end
|
data/test/test_game.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
#
|
2
|
+
# To change this template, choose Tools | Templates
|
3
|
+
# and open the template in the editor.
|
4
|
+
|
5
|
+
|
6
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
7
|
+
|
8
|
+
require 'test/unit'
|
9
|
+
require 'neuro_gammon/game'
|
10
|
+
require 'neuro_gammon/random_player'
|
11
|
+
require 'neuro_gammon/board'
|
12
|
+
require 'neuro_gammon/dice'
|
13
|
+
|
14
|
+
class TestGame < Test::Unit::TestCase
|
15
|
+
include NeuroGammon
|
16
|
+
def test_init
|
17
|
+
b_p=RandomPlayer.new
|
18
|
+
w_p=RandomPlayer.new
|
19
|
+
g=Game.new w_p,b_p
|
20
|
+
|
21
|
+
assert_equal w_p,g.white_player
|
22
|
+
assert_equal b_p,g.black_player
|
23
|
+
assert_equal [],g.board_states
|
24
|
+
assert_equal [],g.moves
|
25
|
+
assert_equal [],g.dice_states
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_board_state
|
29
|
+
b_p=RandomPlayer.new
|
30
|
+
w_p=RandomPlayer.new
|
31
|
+
g=Game.new w_p,b_p
|
32
|
+
|
33
|
+
b=[1,2,3]
|
34
|
+
g.add_board_state(b)
|
35
|
+
b[0]=5
|
36
|
+
g.add_board_state(b)
|
37
|
+
|
38
|
+
assert_equal [1,2,3],g.board_states[0]
|
39
|
+
assert_equal [5,2,3],g.board_states[1]
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_moves
|
43
|
+
b_p=RandomPlayer.new
|
44
|
+
w_p=RandomPlayer.new
|
45
|
+
g=Game.new w_p,b_p
|
46
|
+
|
47
|
+
m=[1,2]
|
48
|
+
g.add_move m
|
49
|
+
m[0]=4
|
50
|
+
m[1]=7
|
51
|
+
g.add_move m
|
52
|
+
|
53
|
+
assert_equal [1,2],g.moves[0]
|
54
|
+
assert_equal [4,7],g.moves[1]
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_dice
|
58
|
+
b_p=RandomPlayer.new
|
59
|
+
w_p=RandomPlayer.new
|
60
|
+
g=Game.new w_p,b_p
|
61
|
+
|
62
|
+
d=[1,2]
|
63
|
+
g.add_dice_state d
|
64
|
+
d[0]=6
|
65
|
+
d[1]=6
|
66
|
+
g.add_dice_state d
|
67
|
+
|
68
|
+
assert_equal [1,2],g.dice_states[0]
|
69
|
+
assert_equal [6,6],g.dice_states[1]
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_winner_colour
|
73
|
+
b_p=RandomPlayer.new
|
74
|
+
w_p=RandomPlayer.new
|
75
|
+
g=Game.new w_p,b_p
|
76
|
+
|
77
|
+
assert_nil g.winner_colour
|
78
|
+
|
79
|
+
g.winner_colour=Board::BLACK
|
80
|
+
|
81
|
+
assert_equal Board::BLACK,g.winner_colour
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_colour_moved
|
85
|
+
b_p=RandomPlayer.new
|
86
|
+
w_p=RandomPlayer.new
|
87
|
+
g=Game.new w_p,b_p
|
88
|
+
|
89
|
+
g.add_move([0,2])
|
90
|
+
g.add_move([23,22])
|
91
|
+
|
92
|
+
#bear off
|
93
|
+
g.add_move([22,-1])
|
94
|
+
g.add_move([3,-1])
|
95
|
+
|
96
|
+
#come on
|
97
|
+
g.add_move([-1,4])
|
98
|
+
g.add_move([-1,22])
|
99
|
+
|
100
|
+
assert_equal g.moves.size,g.colour_moved.size
|
101
|
+
|
102
|
+
assert_equal Board::BLACK,g.colour_moved[0]
|
103
|
+
assert_equal Board::WHITE,g.colour_moved[1]
|
104
|
+
|
105
|
+
assert_equal Board::BLACK,g.colour_moved[2]
|
106
|
+
assert_equal Board::WHITE,g.colour_moved[3]
|
107
|
+
|
108
|
+
assert_equal Board::BLACK,g.colour_moved[4]
|
109
|
+
assert_equal Board::WHITE,g.colour_moved[5]
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#
|
2
|
+
# To change this template, choose Tools | Templates
|
3
|
+
# and open the template in the editor.
|
4
|
+
|
5
|
+
|
6
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
7
|
+
|
8
|
+
require 'test/unit'
|
9
|
+
require 'neuro_gammon/game_engine'
|
10
|
+
require 'neuro_gammon/random_player'
|
11
|
+
require 'neuro_gammon/game'
|
12
|
+
require 'neuro_gammon/fann_player'
|
13
|
+
|
14
|
+
class TestGameEngine < Test::Unit::TestCase
|
15
|
+
include NeuroGammon
|
16
|
+
def test_init
|
17
|
+
p1=RandomPlayer.new
|
18
|
+
p2=RandomPlayer.new
|
19
|
+
eng=GameEngine.new p1,p2
|
20
|
+
assert_equal p1,eng.white_player
|
21
|
+
assert_equal p2,eng.black_player
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_game_state
|
25
|
+
srand(100) #ensures the predictedly dice differ at the start
|
26
|
+
eng=GameEngine.new(RandomPlayer.new, FannPlayer.new)
|
27
|
+
game=eng.play_game
|
28
|
+
assert_equal [[-2,0,0,0,0,5,0,3,0,0,0,-5,5,0,0,0,-3,0,-5,0,0,0,0,2],[0,0]],game.board_states[0]
|
29
|
+
assert_not_equal game.board_states[0],game.board_states[1]
|
30
|
+
assert_not_equal game.moves[0],game.moves[1]
|
31
|
+
assert_not_equal game.dice_states[0],game.dice_states[1]
|
32
|
+
assert_equal game.moves.size,game.colour_moved.size
|
33
|
+
assert_not_nil eng.winner
|
34
|
+
end
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: neuro_gammon
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 3
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 7
|
9
|
+
- 0
|
10
|
+
version: 0.7.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Stu
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-04 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: uuidtools
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 9
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 1
|
33
|
+
- 1
|
34
|
+
version: 2.1.1
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: ruby-fann
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 21
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 1
|
49
|
+
- 3
|
50
|
+
version: 1.1.3
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
description:
|
54
|
+
email: sowen@stuzart.org
|
55
|
+
executables: []
|
56
|
+
|
57
|
+
extensions: []
|
58
|
+
|
59
|
+
extra_rdoc_files:
|
60
|
+
- README
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- .hgignore
|
64
|
+
- .loadpath
|
65
|
+
- .project
|
66
|
+
- README
|
67
|
+
- Rakefile
|
68
|
+
- VERSION
|
69
|
+
- fred.net
|
70
|
+
- lib/main.rb
|
71
|
+
- lib/main2.rb
|
72
|
+
- lib/neuro_gammon.rb
|
73
|
+
- lib/neuro_gammon/base_neural_player.rb
|
74
|
+
- lib/neuro_gammon/base_player.rb
|
75
|
+
- lib/neuro_gammon/best_of_tournament_engine.rb
|
76
|
+
- lib/neuro_gammon/board.rb
|
77
|
+
- lib/neuro_gammon/board_tools.rb
|
78
|
+
- lib/neuro_gammon/dice.rb
|
79
|
+
- lib/neuro_gammon/fann_player.rb
|
80
|
+
- lib/neuro_gammon/game.rb
|
81
|
+
- lib/neuro_gammon/game_engine.rb
|
82
|
+
- lib/neuro_gammon/lazy_player.rb
|
83
|
+
- lib/neuro_gammon/random_player.rb
|
84
|
+
- nbproject/private/rake-t.txt
|
85
|
+
- nbproject/project.properties
|
86
|
+
- nbproject/project.xml
|
87
|
+
- neuro_gammon.gemspec
|
88
|
+
- test/test_base_player.rb
|
89
|
+
- test/test_board.rb
|
90
|
+
- test/test_board_tools.rb
|
91
|
+
- test/test_dice.rb
|
92
|
+
- test/test_fann_player.rb
|
93
|
+
- test/test_game.rb
|
94
|
+
- test/test_game_engine.rb
|
95
|
+
has_rdoc: true
|
96
|
+
homepage:
|
97
|
+
licenses: []
|
98
|
+
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options:
|
101
|
+
- --charset=UTF-8
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
hash: 3
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
version: "0"
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 3
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
requirements: []
|
123
|
+
|
124
|
+
rubyforge_project:
|
125
|
+
rubygems_version: 1.3.7
|
126
|
+
signing_key:
|
127
|
+
specification_version: 3
|
128
|
+
summary: Neural Net Backgammon utility library - just a bit of messing about - nothing serious.
|
129
|
+
test_files:
|
130
|
+
- test/test_game_engine.rb
|
131
|
+
- test/test_dice.rb
|
132
|
+
- test/test_base_player.rb
|
133
|
+
- test/test_board_tools.rb
|
134
|
+
- test/test_fann_player.rb
|
135
|
+
- test/test_game.rb
|
136
|
+
- test/test_board.rb
|