neuro_gammon 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|