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
@@ -0,0 +1,32 @@
|
|
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/base_player'
|
10
|
+
|
11
|
+
class TestBasePlayer < Test::Unit::TestCase
|
12
|
+
include NeuroGammon
|
13
|
+
|
14
|
+
def test_init
|
15
|
+
b=BasePlayer.new
|
16
|
+
assert_not_nil b.id, "id should not be nil"
|
17
|
+
assert_not_nil b.name, "name should not be nil"
|
18
|
+
assert_equal "NeuroGammon::BasePlayer",b.name,"unexpected default name"
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_name
|
22
|
+
b=BasePlayer.new
|
23
|
+
b.name="bob"
|
24
|
+
assert_equal "bob",b.name,"name should be bob"
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_id
|
28
|
+
b=BasePlayer.new
|
29
|
+
b.id="bob"
|
30
|
+
assert_equal "bob",b.id,"id should be bob"
|
31
|
+
end
|
32
|
+
end
|
data/test/test_board.rb
ADDED
@@ -0,0 +1,384 @@
|
|
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/board'
|
10
|
+
require 'neuro_gammon/dice'
|
11
|
+
|
12
|
+
|
13
|
+
class Array
|
14
|
+
def diff other_array
|
15
|
+
result=[]
|
16
|
+
self.each do |x|
|
17
|
+
result << x if (not other_array.include?(x))
|
18
|
+
end
|
19
|
+
|
20
|
+
other_array.each do |x|
|
21
|
+
result << x if (not self.include?(x))
|
22
|
+
end
|
23
|
+
|
24
|
+
return result.uniq
|
25
|
+
end
|
26
|
+
|
27
|
+
def shuffle!
|
28
|
+
size.downto(1) { |n| push delete_at(rand(n)) }
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
class TestBoard < Test::Unit::TestCase
|
35
|
+
include NeuroGammon
|
36
|
+
def setup
|
37
|
+
@board=Board.new
|
38
|
+
class << @board
|
39
|
+
def set=s
|
40
|
+
@board_state=s[0]
|
41
|
+
@bar=s[1]
|
42
|
+
raise Exception.new("Invalid state, wrong number of board positions:" << @board_state.size.to_s << ", should be 24") if @board_state.size!=24
|
43
|
+
raise Exception.new("Invalid state, wrong number of bar positions:" << @bar.size.to_s << ", should be 2") if @bar.size!=2
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
@dice=Dice.new
|
48
|
+
class << @dice
|
49
|
+
def set=values
|
50
|
+
@values=values
|
51
|
+
check_state
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_init
|
57
|
+
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]],@board.state
|
58
|
+
assert_equal 15,@board.piece_count(Board::BLACK)
|
59
|
+
assert_equal 15,@board.piece_count(Board::WHITE)
|
60
|
+
assert_equal 0,@board.bar_count(Board::WHITE)
|
61
|
+
assert_equal 0,@board.bar_count(Board::BLACK)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_colours
|
65
|
+
assert_equal(-1, Board::BLACK)
|
66
|
+
assert_equal(1,Board::WHITE)
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_move
|
70
|
+
|
71
|
+
@board.move!([23,20],Board::WHITE)
|
72
|
+
assert_equal [[-2,0,0,0,0,5,0,3,0,0,0,-5,5,0,0,0,-3,0,-5,0,1,0,0,1],[0,0]],@board.state
|
73
|
+
@board.move!([0,1],Board::BLACK)
|
74
|
+
assert_equal [[-1,-1,0,0,0,5,0,3,0,0,0,-5,5,0,0,0,-3,0,-5,0,1,0,0,1],[0,0]],@board.state
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_invalid_moves
|
78
|
+
|
79
|
+
#test for moving to a row containing 5
|
80
|
+
assert_raise(Exception) {@board.move!([7,5],Board::WHITE)}
|
81
|
+
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]],@board.state
|
82
|
+
|
83
|
+
#test start with no pieces
|
84
|
+
assert_raise(Exception) {@board.move!([22,21],Board::WHITE)}
|
85
|
+
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]],@board.state
|
86
|
+
|
87
|
+
#test opposing colour at start
|
88
|
+
assert_raise(Exception) {@board.move!([11,10],Board::WHITE)}
|
89
|
+
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]],@board.state
|
90
|
+
|
91
|
+
#test wrong direction (black)
|
92
|
+
assert_raise(Exception) {@board.move!([11,10],Board::BLACK)}
|
93
|
+
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]],@board.state
|
94
|
+
|
95
|
+
#test wrong direction (white)
|
96
|
+
assert_raise(Exception) {@board.move!([12,13],Board::WHITE)}
|
97
|
+
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]],@board.state
|
98
|
+
|
99
|
+
#test for destination wrong colour
|
100
|
+
assert_raise(Exception) {@board.move!([18,23],Board::BLACK)}
|
101
|
+
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]],@board.state
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_bearing_off
|
106
|
+
assert_equal false, @board.bearing_off?(Board::BLACK)
|
107
|
+
assert_equal false, @board.bearing_off?(Board::WHITE)
|
108
|
+
|
109
|
+
@board.set=[[1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1],[0,0]]
|
110
|
+
assert_equal true, @board.bearing_off?(Board::BLACK)
|
111
|
+
assert_equal true, @board.bearing_off?(Board::WHITE)
|
112
|
+
|
113
|
+
@board.set=[[1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,-1,-1,-1],[0,0]]
|
114
|
+
assert_equal false, @board.bearing_off?(Board::BLACK)
|
115
|
+
assert_equal false, @board.bearing_off?(Board::WHITE)
|
116
|
+
|
117
|
+
@board.set=[[1,1,1,1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1],[0,0]]
|
118
|
+
assert_equal false, @board.bearing_off?(Board::BLACK)
|
119
|
+
assert_equal true, @board.bearing_off?(Board::WHITE)
|
120
|
+
|
121
|
+
@board.set=[[1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1],[0,0]]
|
122
|
+
assert_equal true, @board.bearing_off?(Board::BLACK)
|
123
|
+
assert_equal false, @board.bearing_off?(Board::WHITE)
|
124
|
+
|
125
|
+
@board.set=[[1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1],[1,0]]
|
126
|
+
assert_equal false, @board.bearing_off?(Board::BLACK)
|
127
|
+
assert_equal true, @board.bearing_off?(Board::WHITE)
|
128
|
+
|
129
|
+
@board.set=[[1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1],[0,1]]
|
130
|
+
assert_equal true, @board.bearing_off?(Board::BLACK)
|
131
|
+
assert_equal false, @board.bearing_off?(Board::WHITE)
|
132
|
+
|
133
|
+
@board.set=[[-5,5,5,4,1,0,0,-1,0,0,0,0,0,0,0,0,-1,0,0,0,-2,-1,-1,-4],[0,0]]
|
134
|
+
assert_equal true, @board.bearing_off?(Board::WHITE)
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_bar_count
|
138
|
+
|
139
|
+
@board.set=[[0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0],[2,3]]
|
140
|
+
|
141
|
+
assert_equal 2,@board.bar_count(Board::BLACK)
|
142
|
+
assert_equal 3,@board.bar_count(Board::WHITE)
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_piece_count
|
146
|
+
|
147
|
+
assert_equal 15,@board.piece_count(Board::BLACK)
|
148
|
+
assert_equal 15,@board.piece_count(Board::WHITE)
|
149
|
+
|
150
|
+
@board.set=@board.set=[[0,0,0,0,-3,5,5,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0],[2,3]]
|
151
|
+
assert_equal 6,@board.piece_count(Board::BLACK)
|
152
|
+
assert_equal 14,@board.piece_count(Board::WHITE)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_move_bear_off
|
156
|
+
|
157
|
+
@board.set=[[-1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1],[0,0]]
|
158
|
+
@board.move!([5,-1],Board::WHITE)
|
159
|
+
assert_equal([[-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1],[0,0]],@board.state)
|
160
|
+
|
161
|
+
@board.set=[[1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1],[0,0]]
|
162
|
+
@board.move!([23,-1],Board::BLACK)
|
163
|
+
assert_equal([[1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0],[0,0]],@board.state)
|
164
|
+
|
165
|
+
@board.move!([22,-1],Board::BLACK)
|
166
|
+
assert_equal([[1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0]],@board.state)
|
167
|
+
|
168
|
+
@board.set=[[-5,5,5,4,1,0,0,-1,0,0,0,0,0,0,0,0,-1,0,0,0,-2,-1,-1,-4],[0,0]]
|
169
|
+
@board.move!([4,-1],Board::WHITE)
|
170
|
+
assert_equal([[-5,5,5,4,0,0,0,-1,0,0,0,0,0,0,0,0,-1,0,0,0,-2,-1,-1,-4],[0,0]],@board.state)
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_move_off_bar
|
175
|
+
|
176
|
+
@board.set=[[-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,1]]
|
177
|
+
|
178
|
+
@board.move!([-1,1],Board::BLACK)
|
179
|
+
assert_equal([[-1,-1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[0,1]],@board.state)
|
180
|
+
|
181
|
+
@board.set=[[-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,1]]
|
182
|
+
@board.move!([-1,21],Board::WHITE)
|
183
|
+
assert_equal([[-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1],[1,0]],@board.state)
|
184
|
+
|
185
|
+
@board.set=[[-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[2,1]]
|
186
|
+
@board.move!([-1,2],Board::BLACK)
|
187
|
+
assert_equal([[-1,0,-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,1]],@board.state)
|
188
|
+
|
189
|
+
@board.set=[[-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,3]]
|
190
|
+
@board.move!([-1,20],Board::WHITE)
|
191
|
+
assert_equal([[-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,-1,1],[1,2]],@board.state)
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_invalid_moves_bearing_off
|
195
|
+
|
196
|
+
@board.set=[[-1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[0,0]]
|
197
|
+
assert_raises(Exception) {@board.move!([22,-1],Board::BLACK)}
|
198
|
+
assert_equal [[-1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[0,0]],@board.state
|
199
|
+
|
200
|
+
@board.set=[[1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1],[1,0]]
|
201
|
+
assert_raises(Exception) {@board.move!([1,-1],Board::WHITE)}
|
202
|
+
assert_raises(Exception) {@board.move!([5,-1],Board::WHITE)}
|
203
|
+
assert_equal [[1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1],[1,0]],@board.state
|
204
|
+
|
205
|
+
end
|
206
|
+
|
207
|
+
def test_invalid_moves_bar
|
208
|
+
|
209
|
+
@board.set=[[-1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,1]]
|
210
|
+
|
211
|
+
#test trying to move a piece
|
212
|
+
assert_raises(Exception) {@board.move!([23,20],Board::WHITE)}
|
213
|
+
assert_equal [[-1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,1]],@board.state
|
214
|
+
|
215
|
+
#test landing on oposing peice square
|
216
|
+
assert_raises(Exception) {@board.move!([-1,4],Board::BLACK)}
|
217
|
+
assert_equal [[-1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,1]],@board.state
|
218
|
+
|
219
|
+
#test out of range
|
220
|
+
assert_raises(Exception) {@board.move!([-1,17],Board::WHITE)}
|
221
|
+
assert_equal [[-1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,1]],@board.state
|
222
|
+
|
223
|
+
#test wrong end
|
224
|
+
assert_raises(Exception) {@board.move!([-1,2],Board::WHITE)}
|
225
|
+
assert_equal [[-1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,1]],@board.state
|
226
|
+
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_move_knockoff
|
230
|
+
|
231
|
+
@board.set=[[-1,-1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,-1,1],[0,0]]
|
232
|
+
@board.move!([0,4],Board::BLACK)
|
233
|
+
assert_equal([[0,-1,0,0,-1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,-1,1],[0,1]],@board.state)
|
234
|
+
|
235
|
+
@board.set=[[-1,-1,0,0,1,-1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,-1,1],[0,0]]
|
236
|
+
@board.move!([7,5],Board::WHITE)
|
237
|
+
assert_equal([[-1,-1,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,-1,1],[1,0]],@board.state)
|
238
|
+
|
239
|
+
@board.set=[[-1,-1,0,0,1,-1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,-1,1],[1,0]]
|
240
|
+
@board.move!([7,5],Board::WHITE)
|
241
|
+
assert_equal([[-1,-1,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,-1,1],[2,0]],@board.state)
|
242
|
+
|
243
|
+
@board.set=[[-1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,1]]
|
244
|
+
@board.move!([-1,22],Board::WHITE)
|
245
|
+
assert_equal([[-1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1],[2,0]],@board.state)
|
246
|
+
|
247
|
+
@board.set=[[-1,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[1,1]]
|
248
|
+
@board.move!([-1,1],Board::BLACK)
|
249
|
+
assert_equal([[-1,-1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1],[0,2]],@board.state)
|
250
|
+
end
|
251
|
+
|
252
|
+
#Array.diff added method, added for tests
|
253
|
+
def test_array_diff
|
254
|
+
a=[1,2,3]
|
255
|
+
assert_equal [1],a.diff([2,3])
|
256
|
+
assert_equal [1],[2,3].diff(a)
|
257
|
+
assert_equal [1,2,3,4],a.diff([4])
|
258
|
+
assert_equal [4,1,2,3],[4].diff(a)
|
259
|
+
assert_equal [[1,2][3,4]], [[1,2][3,4],[5,6]].diff([[5,6]])
|
260
|
+
|
261
|
+
assert_equal [1,2],[1,1,2,2,3,3,2,1].diff([3])
|
262
|
+
|
263
|
+
assert_equal [[23,17],[23,25],[23,26]],[[23,17]].diff([[23,25],[23,26]])
|
264
|
+
|
265
|
+
end
|
266
|
+
|
267
|
+
def test_legal_moves
|
268
|
+
#very simple to start
|
269
|
+
|
270
|
+
@board.set=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[0,0]]
|
271
|
+
|
272
|
+
@dice.set=[6,6]
|
273
|
+
valid=@board.valid_moves(Board::WHITE, @dice)
|
274
|
+
assert_equal [],valid.diff([[23,17]])
|
275
|
+
|
276
|
+
@board.set=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[0,0]]
|
277
|
+
@dice.set=[6,5]
|
278
|
+
valid=@board.valid_moves(Board::WHITE, @dice)
|
279
|
+
assert_equal [],valid.diff([[23,17],[23,18]])
|
280
|
+
|
281
|
+
@board.set=[[0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[0,0]]
|
282
|
+
@dice.set=[1,2]
|
283
|
+
valid=@board.valid_moves(Board::BLACK, @dice)
|
284
|
+
assert_equal [],valid.diff([[5,6],[5,7]])
|
285
|
+
|
286
|
+
@board.set=[[0,0,0,0,0,-2,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[0,0]]
|
287
|
+
@dice.set=[1,2]
|
288
|
+
valid=@board.valid_moves(Board::BLACK, @dice)
|
289
|
+
assert_equal [],valid.diff([[5,7],[6,7],[6,8]])
|
290
|
+
|
291
|
+
#now for a piece on the bar
|
292
|
+
@board.set=[[0,0,0,0,0,-2,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[1,0]]
|
293
|
+
@dice.set=[1,2]
|
294
|
+
valid=@board.valid_moves(Board::BLACK, @dice)
|
295
|
+
assert_equal [],valid.diff([[-1,0],[-1,1]])
|
296
|
+
|
297
|
+
@board.set=[[0,0,0,0,0,-2,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[1,2]]
|
298
|
+
@dice.set=[1,5]
|
299
|
+
valid=@board.valid_moves(Board::WHITE, @dice)
|
300
|
+
assert_equal [],valid.diff([[-1,23],[-1,19]])
|
301
|
+
|
302
|
+
#test moving out of range
|
303
|
+
@board.set=[[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1],[0,0]]
|
304
|
+
@dice.set=[1,5]
|
305
|
+
valid=@board.valid_moves(Board::WHITE, @dice)
|
306
|
+
assert_equal [],valid.diff([[0,-1]])
|
307
|
+
valid=@board.valid_moves(Board::BLACK, @dice)
|
308
|
+
assert_equal [],valid.diff([[23,-1]])
|
309
|
+
|
310
|
+
@board.set=[[1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,-1],[0,0]]
|
311
|
+
@dice.set=[1,5]
|
312
|
+
valid=@board.valid_moves(Board::WHITE, @dice)
|
313
|
+
assert_equal [],valid.diff([[21,16],[21,20]])
|
314
|
+
valid=@board.valid_moves(Board::BLACK, @dice)
|
315
|
+
assert_equal [],valid.diff([[3,4],[3,8]])
|
316
|
+
end
|
317
|
+
|
318
|
+
def test_valid_moves_bearing_off
|
319
|
+
|
320
|
+
@board.set=[[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1],[0,0]]
|
321
|
+
assert_equal true,@board.bearing_off?(Board::WHITE)
|
322
|
+
assert_equal true,@board.bearing_off?(Board::BLACK)
|
323
|
+
@dice.set=[1,2]
|
324
|
+
valid=@board.valid_moves(Board::WHITE, @dice)
|
325
|
+
assert_equal [],valid.diff([[0,-1]])
|
326
|
+
|
327
|
+
@dice.set=[3,2]
|
328
|
+
valid=@board.valid_moves(Board::BLACK, @dice)
|
329
|
+
assert_equal [],valid.diff([[22,-1]])
|
330
|
+
|
331
|
+
#test can't bear off with higher slot taken
|
332
|
+
@board.set=[[1,1,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1],[0,0]]
|
333
|
+
@dice.set=[3,3]
|
334
|
+
valid=@board.valid_moves(Board::WHITE, @dice)
|
335
|
+
assert_equal [],valid.diff([[4,1]])
|
336
|
+
|
337
|
+
#test bear off with dice higher than highest slot
|
338
|
+
@dice.set=[6,6]
|
339
|
+
valid=@board.valid_moves(Board::WHITE, @dice)
|
340
|
+
assert_equal [],valid.diff([[4,-1]])
|
341
|
+
|
342
|
+
@board.set=[[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1],[0,0]]
|
343
|
+
@dice.set=[6,6]
|
344
|
+
valid=@board.valid_moves(Board::WHITE, @dice)
|
345
|
+
assert_equal [],valid.diff([[1,-1]])
|
346
|
+
valid=@board.valid_moves(Board::BLACK, @dice)
|
347
|
+
assert_equal [],valid.diff([[22,-1]])
|
348
|
+
end
|
349
|
+
|
350
|
+
def test_random_sample_moves
|
351
|
+
r=rand(1000)
|
352
|
+
srand r
|
353
|
+
|
354
|
+
@board.state.shuffle!
|
355
|
+
c=rand(10)>5 ? Board::WHITE : Board::BLACK
|
356
|
+
valid=@board.valid_moves c,@dice
|
357
|
+
valid.each do |move|
|
358
|
+
begin
|
359
|
+
@board.validate_move(move,c)
|
360
|
+
rescue Exception => e
|
361
|
+
add_failure("Invalid move found. rand seed=" << r.to_s << ", error was " << e.message)
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
|
367
|
+
def test_winner
|
368
|
+
|
369
|
+
assert_nil @board.winner
|
370
|
+
@board.set=[[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0]]
|
371
|
+
assert_equal Board::BLACK,@board.winner
|
372
|
+
@board.set=[[-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0]]
|
373
|
+
assert_equal Board::WHITE,@board.winner
|
374
|
+
end
|
375
|
+
|
376
|
+
def test_move
|
377
|
+
|
378
|
+
b2=Board.new
|
379
|
+
assert_equal([[-2, 0, 0, 0, 0, 5, 0, 3, 0, 0, 0, -5, 5, 0, 0, 0, -3, 0, -5, 0, 0, 0, 1, 1],
|
380
|
+
[0, 0]],@board.move([23,22],Board::WHITE))
|
381
|
+
assert_equal b2.state,@board.state
|
382
|
+
end
|
383
|
+
|
384
|
+
end
|
@@ -0,0 +1,91 @@
|
|
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/board_tools'
|
10
|
+
require 'neuro_gammon/board' #FIXME: cyclic dependency on board, caused by Board::<colour> - this constant needs moving.
|
11
|
+
|
12
|
+
class TestBoardTools < Test::Unit::TestCase
|
13
|
+
include NeuroGammon
|
14
|
+
include NeuroGammon::BoardTools
|
15
|
+
|
16
|
+
def test_reverse_state
|
17
|
+
state=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1],[1,0]]
|
18
|
+
new_state=reverse_state state
|
19
|
+
assert_equal [[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,1]],new_state
|
20
|
+
assert_equal [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1],[1,0]],state
|
21
|
+
new_state = reverse_state [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,5],[3,2]]
|
22
|
+
assert_equal [[-5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[2,3]],new_state
|
23
|
+
new_state = reverse_state [[-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]]
|
24
|
+
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]],new_state
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_test_for_gammon
|
28
|
+
state=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1],[0,0]]
|
29
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
30
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
31
|
+
|
32
|
+
state=[[-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0]]
|
33
|
+
assert_equal true,test_for_gammon(state,Board::WHITE)
|
34
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
35
|
+
|
36
|
+
state=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[0,0]]
|
37
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
38
|
+
assert_equal true,test_for_gammon(state,Board::BLACK)
|
39
|
+
|
40
|
+
state=[[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0]]
|
41
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
42
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
43
|
+
|
44
|
+
state=[[0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1],[0,0]]
|
45
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
46
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
47
|
+
|
48
|
+
state=[[-2,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0]]
|
49
|
+
assert_equal true,test_for_gammon(state,Board::WHITE)
|
50
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
51
|
+
|
52
|
+
state=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,5],[0,0]]
|
53
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
54
|
+
assert_equal true,test_for_gammon(state,Board::BLACK)
|
55
|
+
|
56
|
+
state=[[4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4],[0,0]]
|
57
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
58
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
59
|
+
|
60
|
+
state=[[-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,1]]
|
61
|
+
assert_equal true,test_for_gammon(state,Board::WHITE)
|
62
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
63
|
+
|
64
|
+
state=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[0,1]]
|
65
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
66
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
67
|
+
|
68
|
+
state=[[-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[1,0]]
|
69
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
70
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
71
|
+
|
72
|
+
state=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[1,0]]
|
73
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
74
|
+
assert_equal true,test_for_gammon(state,Board::BLACK)
|
75
|
+
|
76
|
+
state=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0]]
|
77
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
78
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
79
|
+
|
80
|
+
state=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,1]]
|
81
|
+
assert_equal true,test_for_gammon(state,Board::WHITE)
|
82
|
+
assert_equal false,test_for_gammon(state,Board::BLACK)
|
83
|
+
|
84
|
+
state=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[1,0]]
|
85
|
+
assert_equal false,test_for_gammon(state,Board::WHITE)
|
86
|
+
assert_equal true,test_for_gammon(state,Board::BLACK)
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|