ruby-go 0.0.2 → 1.0.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.
@@ -0,0 +1,40 @@
1
+ module RubyGo
2
+ class TextPrinter
3
+ COLORS = { black: 'x', white: 'o', empty: '_' }.freeze
4
+
5
+ attr_reader :io
6
+
7
+ def initialize(io)
8
+ @io = io
9
+ end
10
+
11
+ def print_game(game)
12
+ print_board(game.board)
13
+ io.puts " " + "_"*(game.board.size * 2)
14
+ io.print " Prisoners || White: #{game.captures[:black]} |"
15
+ io.puts " Black: #{game.captures[:white]}"
16
+ io.puts " " + "-"*(game.board.size * 2)
17
+ end
18
+
19
+ private
20
+
21
+ def print_board(board)
22
+ if board.size < 11
23
+ io.puts " #{(0..board.size - 1).to_a.join(' ')}"
24
+ else
25
+ io.puts " #{(0..10).to_a.join(' ')}#{(11..board.size - 1).to_a.join('')}"
26
+ end
27
+
28
+ board.rows.each_with_index do |row, i|
29
+ i = " #{i}" if i < 10
30
+ io.print "#{i} "
31
+ row.each { |stn| print_stone(stn) }
32
+ io.puts
33
+ end
34
+ end
35
+
36
+ def print_stone(stone)
37
+ io.print "#{COLORS[stone.color]} "
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,50 @@
1
+ module RubyGo
2
+ class Stone
3
+ LETTERS = ('a'..'z').to_a
4
+
5
+ attr_reader :color, :x_coord, :y_coord
6
+
7
+ def initialize(x_coord, y_coord, color)
8
+ @x_coord = x_coord
9
+ @y_coord = y_coord
10
+ @color = color
11
+ end
12
+
13
+ def to_sgf
14
+ x = LETTERS[x_coord]
15
+ y = LETTERS[y_coord]
16
+ ";#{color.to_s[0].upcase}[#{x}#{y}]"
17
+ end
18
+
19
+ def empty?
20
+ false
21
+ end
22
+
23
+ def to_coord
24
+ [x_coord, y_coord]
25
+ end
26
+
27
+ def ==(other)
28
+ other.is_a?(Stone) &&
29
+ (color == other.color) &&
30
+ (to_coord == other.to_coord)
31
+ end
32
+ end
33
+
34
+ # This can be changed to a Pass object
35
+ class NullStone < Stone
36
+ def initialize(color = :empty)
37
+ @x_coord = nil
38
+ @y_coord = nil
39
+ @color = color
40
+ end
41
+
42
+ def to_sgf
43
+ ";#{color.to_s[0].upcase}[]"
44
+ end
45
+
46
+ def empty?
47
+ true
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,3 @@
1
+ module RubyGo
2
+ VERSION = "1.0.0"
3
+ end
@@ -1,161 +1,183 @@
1
1
  require_relative 'test_helper'
2
2
  require 'stringio'
3
3
 
4
- class GoTest < Minitest::Test
5
- def setup
6
- b,w = Board::Colors[:black], Board::Colors[:white]
7
- e = Board::Colors[:empty]
4
+ module RubyGo
5
+ class GoTest < Minitest::Test
6
+ def setup
7
+ @row_9_str = " 8 _ _ _ _ _ _ _ _ _ \n"
8
8
 
9
- @row_9_str = "_ _ _ _ _ _ _ _ _\n"
9
+ @game = Game.new(board: 9)
10
+ end
10
11
 
11
- @game = Game.new(board: 9)
12
- end
12
+ def test_game_has_blank_board_when_initialized
13
+ assert @game.board.empty?
14
+ end
13
15
 
14
- def test_game_has_blank_board_when_initialized
15
- assert @game.board.empty?
16
- end
16
+ def test_printer_can_print_the_game
17
+ out = StringIO.new
18
+ printer = RubyGo::TextPrinter.new(out)
19
+ printer.print_game(@game)
20
+ out.rewind
21
+ assert_includes out.read, @row_9_str
22
+ end
17
23
 
18
- def test_empty_board_looks_like_empty_board
19
- assert_includes @game.board.to_s, @row_9_str
20
- end
24
+ def test_game_can_place_a_stone
25
+ game = Game.new(board: 9)
26
+ game.place_black(2,2)
27
+ assert_equal :black, game.board.at(2,2).color
28
+ end
21
29
 
22
- def test_game_can_print_the_board
23
- out = StringIO.new
24
- temp = $stdout
25
- $stdout = out
26
- @game.view
27
- $stdout = temp
28
- out.rewind
29
- assert_includes out.read, @row_9_str
30
- end
30
+ def test_cannot_place_a_stone_on_top_of_another_stone
31
+ game = Game.new(board: 9)
32
+ game.place_black(2,2)
33
+ assert_raises(Game::IllegalMove) do
34
+ game.place_white(2,2)
35
+ end
36
+ end
31
37
 
32
- def test_game_can_place_a_stone
33
- game = Game.new(board: 9)
34
- game.black(2,2)
35
- assert_equal BlackStone.new(2,2), game.board.at(2,2)
36
- end
38
+ def test_can_capture_one_stone
39
+ game = Game.new(board: 9)
40
+ game.place_black(2,2)
41
+ game.place_white(2,1)
42
+ game.place_white(2,3)
43
+ game.place_white(1,2)
44
+ game.place_white(3,2)
45
+ assert_equal 1, game.captures[:black]
46
+ end
37
47
 
38
- def test_cannot_place_a_stone_on_top_of_another_stone
39
- game = Game.new(board: 9)
40
- game.black(2,2)
41
- assert_raises(Game::IllegalMove) do
42
- game.white(2,2)
48
+ def test_capture_removes_stone
49
+ game = Game.new(board: 9)
50
+ game.place_black(2,2)
51
+ game.place_white(2,1)
52
+ game.place_white(2,3)
53
+ game.place_white(1,2)
54
+ game.place_white(3,2)
55
+ assert game.board.at(2,2).empty?
43
56
  end
44
- end
45
57
 
46
- def test_can_capture_one_stone
47
- game = Game.new(board: 9)
48
- game.black(2,2)
49
- game.white(2,1)
50
- game.white(2,3)
51
- game.white(1,2)
52
- game.white(3,2)
53
- assert_equal 1, game.captures[:black]
54
- end
58
+ def test_capture_three_stones
59
+ game = Game.new(board: 9)
60
+ game.place_black(2,1)
61
+ game.place_black(2,2)
62
+ game.place_black(2,3)
63
+ game.place_white(2,0)
64
+ game.place_white(2,4)
65
+ game.place_white(1,1)
66
+ game.place_white(1,2)
67
+ game.place_white(1,3)
68
+ game.place_white(3,1)
69
+ game.place_white(3,2)
70
+ game.place_white(3,3)
71
+ assert_equal 3, game.captures[:black]
72
+ end
55
73
 
56
- def test_capture_removes_stone
57
- game = Game.new(board: 9)
58
- game.black(2,2)
59
- game.white(2,1)
60
- game.white(2,3)
61
- game.white(1,2)
62
- game.white(3,2)
63
- assert_equal Liberty.new(2,2), game.board.at(2,2)
64
- end
74
+ def test_snap_back
75
+ game = Game.new(board: 9)
76
+ game.place_black(3,2)
77
+ game.place_black(2,3)
78
+ game.place_black(4,3)
79
+ game.place_black(2,4)
80
+ game.place_black(5,4)
81
+ game.place_black(3,5)
82
+ game.place_black(4,5)
83
+ game.place_white(4,2)
84
+ game.place_white(5,3)
85
+ game.place_white(3,4)
86
+ game.place_white(4,4)
87
+ game.place_white(3,3)
88
+ assert_equal 1, game.captures[:black]
89
+ assert_equal 0, game.captures[:white]
90
+ game.place_black(4,3)
91
+ assert_equal 1, game.captures[:black]
92
+ assert_equal 3, game.captures[:white]
93
+ end
65
94
 
66
- def test_capture_three_stones
67
- game = Game.new(board: 9)
68
- game.black(2,1)
69
- game.black(2,2)
70
- game.black(2,3)
71
- game.white(2,0)
72
- game.white(2,4)
73
- game.white(1,1)
74
- game.white(1,2)
75
- game.white(1,3)
76
- game.white(3,1)
77
- game.white(3,2)
78
- game.white(3,3)
79
- assert_equal 3, game.captures[:black]
80
- end
95
+ def test_can_undo
96
+ game = Game.new()
97
+ game.place_black(2,2)
98
+ game.place_white(2,3)
99
+ game.undo
100
+ assert game.board.at(2,3).empty?
101
+ end
81
102
 
82
- def test_can_undo
83
- game = Game.new()
84
- game.black(2,2)
85
- game.white(2,3)
86
- game.undo
87
- assert_equal Liberty.new(2,3), game.board.at(2,3)
88
- end
103
+ def test_can_undo_pass
104
+ game = Game.new
105
+ game.place_black(2,2)
106
+ game.white_pass
107
+ game.undo
108
+ assert_equal 0, game.passes
109
+ end
89
110
 
90
- def test_can_undo_until_beginning
91
- game = Game.new()
92
- game.black(2,2)
93
- game.white(3,2)
94
- game.black(3,3)
95
- 3.times {game.undo}
96
- assert_equal Liberty.new(2,2), game.board.at(2,2)
97
- end
111
+ def test_can_undo_until_beginning
112
+ game = Game.new()
113
+ game.place_black(2,2)
114
+ game.place_white(3,2)
115
+ game.place_black(3,3)
116
+ 3.times {game.undo}
117
+ assert game.board.at(2,2).empty?
118
+ end
98
119
 
99
- def test_can_pass
100
- game = Game.new
101
- game.pass
102
- game.pass
103
- assert_equal 2, game.passes
104
- end
120
+ def test_can_pass
121
+ game = Game.new
122
+ game.black_pass
123
+ game.white_pass
124
+ assert_equal 2, game.passes
125
+ end
105
126
 
106
- def test_cannot_play_a_suicide
107
- game = Game.new
108
- game.black(3,3)
109
- game.white(2,3)
110
- game.white(4,3)
111
- game.white(3,4)
112
- game.white(3,2)
113
- assert_raises(Game::IllegalMove) do
114
- game.black(3,3)
127
+ def test_cannot_play_a_suicide
128
+ game = Game.new
129
+ game.place_black(3,3)
130
+ game.place_white(2,3)
131
+ game.place_white(4,3)
132
+ game.place_white(3,4)
133
+ game.place_white(3,2)
134
+ assert_raises(Game::IllegalMove) do
135
+ game.place_black(3,3)
136
+ end
115
137
  end
116
- end
117
138
 
118
- def test_cannot_play_a_ko
119
- game = Game.new
120
- game.black(3,3)
121
- game.white(2,3)
122
- game.white(4,3)
123
- game.white(3,4)
124
- game.white(3,2)
125
- game.black(4,2)
126
- game.black(4,4)
127
- game.black(5,3)
128
- game.black(3,3)
129
- assert_raises(Game::IllegalMove) do
130
- game.white(4,3)
139
+ def test_cannot_play_a_ko
140
+ game = Game.new
141
+ game.place_black(3,3)
142
+ game.place_white(2,3)
143
+ game.place_white(4,3)
144
+ game.place_white(3,4)
145
+ game.place_white(3,2)
146
+ game.place_black(4,2)
147
+ game.place_black(4,4)
148
+ game.place_black(5,3)
149
+ game.place_black(3,3)
150
+ assert_raises(Game::IllegalMove) do
151
+ game.place_white(4,3)
152
+ end
131
153
  end
132
- end
133
154
 
134
- def big_capture_area_game
135
- game = Game.new
136
- game.black(0,0)
137
- game.white(1,1)
138
- game.black(0,1)
139
- game.white(0,2)
140
- game.black(1,0)
141
- game.white(2,0)
142
- game
143
- end
155
+ def big_capture_area_game
156
+ game = Game.new
157
+ game.place_black(0,0)
158
+ game.place_white(1,1)
159
+ game.place_black(0,1)
160
+ game.place_white(0,2)
161
+ game.place_black(1,0)
162
+ game.place_white(2,0)
163
+ game
164
+ end
144
165
 
145
- def test_can_play_in_previous_capture_area_that_is_not_a_ko
146
- game = big_capture_area_game
147
- assert_equal Liberty.new(0,0), game.board.at(0,0)
148
- game.black(0,0)
149
- assert_equal BlackStone.new(0,0), game.board.at(0,0)
150
-
151
- game = big_capture_area_game
152
- assert_equal Liberty.new(0,1), game.board.at(0,1)
153
- game.black(0,1)
154
- assert_equal BlackStone.new(0,1), game.board.at(0,1)
155
-
156
- game = big_capture_area_game
157
- assert_equal Liberty.new(1,0), game.board.at(1,0)
158
- game.black(1,0)
159
- assert_equal BlackStone.new(1,0), game.board.at(1,0)
166
+ def test_can_play_in_previous_capture_area_that_is_not_a_ko
167
+ game = big_capture_area_game
168
+ assert game.board.at(0,0).empty?
169
+ game.place_black(0,0)
170
+ assert_equal :black, game.board.at(0,0).color
171
+
172
+ game = big_capture_area_game
173
+ assert game.board.at(0,1).empty?
174
+ game.place_black(0,1)
175
+ assert_equal :black, game.board.at(0,1).color
176
+
177
+ game = big_capture_area_game
178
+ assert game.board.at(1,0).empty?
179
+ game.place_black(1,0)
180
+ assert_equal :black, game.board.at(1,0).color
181
+ end
160
182
  end
161
183
  end
@@ -1,51 +1,52 @@
1
1
  require_relative 'test_helper'
2
2
 
3
- class SGFTest < Minitest::Test
3
+ module RubyGo
4
+ class SGFTest < Minitest::Test
4
5
 
5
- def test_game_converts_to_sgf
6
- game = Game.new
7
- assert_equal "(;GM[1]FF[4]CA[UTF-8]AP[jphager2]SZ[19]PW[White]PB[Black])",
8
- game.to_sgf
9
- end
6
+ def test_game_converts_to_sgf
7
+ game = Game.new
8
+ assert_equal "(;GM[1]FF[4]CA[UTF-8]AP[jphager2]SZ[19]PW[White]PB[Black])",
9
+ game.to_sgf
10
+ end
10
11
 
11
- def test_game_converts_to_sgf_with_moves
12
- game = Game.new
13
- game.black(15,3)
14
- game.white(3,3)
15
- game.black(3,15)
16
- game.white(15,15)
17
- assert_equal "(;GM[1]FF[4]CA[UTF-8]AP[jphager2]SZ[19]PW[White]PB[Black];B[pd];W[dd];B[dp];W[pp])",
18
- game.to_sgf
19
- end
12
+ def test_game_converts_to_sgf_with_moves
13
+ game = Game.new
14
+ game.place_black(15,3)
15
+ game.place_white(3,3)
16
+ game.place_black(3,15)
17
+ game.place_white(15,15)
18
+ assert_equal "(;GM[1]FF[4]CA[UTF-8]AP[jphager2]SZ[19]PW[White]PB[Black];B[pd];W[dd];B[dp];W[pp])",
19
+ game.to_sgf
20
+ end
20
21
 
21
- def test_game_converts_correctly_with_capture
22
- game = Game.new
23
- game.black(15,3)
24
- game.white(16,3)
25
- game.black(16,2)
26
- game.white(15,2)
27
- game.black(14,2)
28
- game.white(14,3)
29
- game.black(17,3)
30
- game.white(15,4)
31
- game.black(16,4)
32
- game.white(15,3)
22
+ def test_game_converts_correctly_with_capture
23
+ game = Game.new
24
+ game.place_black(15,3)
25
+ game.place_white(16,3)
26
+ game.place_black(16,2)
27
+ game.place_white(15,2)
28
+ game.place_black(14,2)
29
+ game.place_white(14,3)
30
+ game.place_black(17,3)
31
+ game.place_white(15,4)
32
+ game.place_black(16,4)
33
+ game.place_white(15,3)
33
34
 
34
- assert_equal "(;GM[1]FF[4]CA[UTF-8]AP[jphager2]SZ[19]PW[White]PB[Black];B[pd];W[qd];B[qc];W[pc];B[oc];W[od];B[rd];W[pe];B[qe];W[pd])",
35
- game.to_sgf
36
- end
35
+ assert_equal "(;GM[1]FF[4]CA[UTF-8]AP[jphager2]SZ[19]PW[White]PB[Black];B[pd];W[qd];B[qc];W[pc];B[oc];W[od];B[rd];W[pe];B[qe];W[pd])",
36
+ game.to_sgf
37
+ end
37
38
 
38
- def test_saves_sgf
39
- file = File.expand_path('../../my_go_game.sgf', __FILE__)
40
- path = File.expand_path('../../*.sgf', __FILE__)
41
- File.delete(file) if File.exist?(file)
42
- game = Game.new
43
- game.black(15,3)
44
- game.white(16,3)
45
- game.black(16,2)
46
- game.white(15,2)
47
- game.save
48
- assert_includes Dir.glob(path), file
39
+ def test_saves_sgf
40
+ file = File.expand_path('../../my_go_game.sgf', __FILE__)
41
+ path = File.expand_path('../../*.sgf', __FILE__)
42
+ File.delete(file) if File.exist?(file)
43
+ game = Game.new
44
+ game.place_black(15,3)
45
+ game.place_white(16,3)
46
+ game.place_black(16,2)
47
+ game.place_white(15,2)
48
+ game.save
49
+ assert_includes Dir.glob(path), file
50
+ end
49
51
  end
50
-
51
52
  end