shogi-ruby 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/README.md +31 -7
- data/lib/shogi/board.rb +54 -38
- data/lib/shogi/game.rb +37 -0
- data/lib/shogi/version.rb +1 -1
- data/lib/shogi.rb +1 -0
- data/test/test-board.rb +116 -33
- data/test/test-game.rb +61 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d5a3884fbd500566d19348e3068232b1e0b2daa
|
4
|
+
data.tar.gz: 19c5fd3246ff70a0dffd7ff6ec6719bdb5605150
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3690d7afaa7f2305d4c892f98f636831f98c9c01fd96c78f1f6802b4a1318c20f5f7c19e7372401dfd869dcad1dfaf3cf694dbde9a9602b7d1c9975d96861226
|
7
|
+
data.tar.gz: 419b0e66515dd7c6ed60e982a469b880e9ee2a115d02f3c63c03ee370767467bcf5dc82f06307ff7c9e8179fadf926f6891a041c48abcf76547a8230295cb3bd
|
data/README.md
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
# Shogi Library for Ruby [](http://travis-ci.org/myokoym/shogi-ruby)
|
2
2
|
|
3
|
+
Ruby用の将棋ライブラリです。
|
4
|
+
|
5
|
+
## 用途
|
6
|
+
### 向いていること
|
7
|
+
* 将棋盤の簡単なコンソール表示
|
8
|
+
* GUIアプリケーションの内部状態の管理
|
9
|
+
|
10
|
+
### 向いていないこと
|
11
|
+
* 速度的に、思考エンジンのデータ構造には向きません。
|
12
|
+
|
13
|
+
## 機能
|
14
|
+
### できること
|
15
|
+
* CSA形式で、将棋盤オブジェクトを作成、操作、表示できます。
|
16
|
+
* 駒の動きが正しいかどうかチェックできます。
|
17
|
+
|
18
|
+
### まだできないこと
|
19
|
+
* 二歩チェック
|
20
|
+
* 行きどころのない駒のチェック
|
21
|
+
* 詰みチェック
|
22
|
+
* 手番の管理
|
23
|
+
* 棋譜の管理
|
24
|
+
* USI形式との相互変換
|
25
|
+
|
3
26
|
## Installation
|
4
27
|
|
5
28
|
Add this line to your application's Gemfile:
|
@@ -36,7 +59,7 @@ Ruby 2.0.0 or later. (and 1.9.3)
|
|
36
59
|
P+
|
37
60
|
P-
|
38
61
|
|
39
|
-
board.
|
62
|
+
board.move("+7776FU", :csa)
|
40
63
|
puts board.to_csa
|
41
64
|
#=> P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
|
42
65
|
P2 * -HI * * * * * -KA *
|
@@ -50,9 +73,9 @@ Ruby 2.0.0 or later. (and 1.9.3)
|
|
50
73
|
P+
|
51
74
|
P-
|
52
75
|
|
53
|
-
board.
|
54
|
-
board.
|
55
|
-
board.to_csa
|
76
|
+
board.move("-3334FU", :csa)
|
77
|
+
board.move("+8822UM", :csa)
|
78
|
+
puts board.to_csa
|
56
79
|
#=> P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
|
57
80
|
P2 * -HI * * * * * +UM *
|
58
81
|
P3-FU-FU-FU-FU-FU-FU * -FU-FU
|
@@ -65,9 +88,10 @@ Ruby 2.0.0 or later. (and 1.9.3)
|
|
65
88
|
P+00KA
|
66
89
|
P-
|
67
90
|
|
68
|
-
board.
|
69
|
-
board.
|
70
|
-
board.
|
91
|
+
board.default_format = :csa
|
92
|
+
board.move("-3122GI")
|
93
|
+
board.move("+0055KA")
|
94
|
+
board.show
|
71
95
|
#=> P1-KY-KE-GI-KI-OU-KI * -KE-KY
|
72
96
|
P2 * -HI * * * * * -GI *
|
73
97
|
P3-FU-FU-FU-FU-FU-FU * -FU-FU
|
data/lib/shogi/board.rb
CHANGED
@@ -7,10 +7,12 @@ module Shogi
|
|
7
7
|
class MoveError < Error; end
|
8
8
|
class MovementError < Error; end
|
9
9
|
|
10
|
+
attr_accessor :default_format
|
10
11
|
attr_accessor :validate_movement
|
11
|
-
def initialize(csa=nil)
|
12
|
-
|
13
|
-
|
12
|
+
def initialize(default_format=:csa, position=nil)
|
13
|
+
@default_format = default_format
|
14
|
+
if position
|
15
|
+
set_from_csa(position)
|
14
16
|
else
|
15
17
|
@position = default_position
|
16
18
|
@captured = []
|
@@ -56,10 +58,14 @@ module Shogi
|
|
56
58
|
position_row = []
|
57
59
|
row.chomp!
|
58
60
|
unless /\AP#{i + 1}(#{cell_pattern}){9}\z/ =~ row
|
59
|
-
raise FormatError, "Format Error: line #{i + 1}"
|
61
|
+
raise FormatError, "Format Error: line P#{i + 1}"
|
60
62
|
end
|
61
63
|
row[2..28].scan(/#{cell_pattern}/) do |cell|
|
62
|
-
|
64
|
+
if cell == " * "
|
65
|
+
position_row << ""
|
66
|
+
else
|
67
|
+
position_row << cell
|
68
|
+
end
|
63
69
|
end
|
64
70
|
position << position_row
|
65
71
|
end
|
@@ -69,7 +75,7 @@ module Shogi
|
|
69
75
|
csa_lines.slice(9, 2).each do |captured_line|
|
70
76
|
captured_line.chomp!
|
71
77
|
unless /\AP[+-](00[A-Z]{2})*\z/ =~ captured_line
|
72
|
-
raise FormatError, "Format Error: captured line"
|
78
|
+
raise FormatError, "Format Error: captured piece line"
|
73
79
|
end
|
74
80
|
turn = captured_line[1]
|
75
81
|
captured_line[2..-1].scan(/00([A-Z]{2})/) do |cell|
|
@@ -91,7 +97,7 @@ module Shogi
|
|
91
97
|
usi_row << space_count.to_s
|
92
98
|
space_count = 0
|
93
99
|
end
|
94
|
-
usi =
|
100
|
+
usi = Piece.const_get(cell[1..2]).new.usi
|
95
101
|
if cell[0] == "-"
|
96
102
|
usi_row << usi.downcase
|
97
103
|
else
|
@@ -107,7 +113,37 @@ module Shogi
|
|
107
113
|
}.join("/") << "\n"
|
108
114
|
end
|
109
115
|
|
110
|
-
def move_from_csa(
|
116
|
+
def move_from_csa(movement)
|
117
|
+
$stderr.puts "warning: Shogi::Board#move_from_csa(movement) is deplicated. Use Shogi::Board#move(movement, :csa)"
|
118
|
+
move(movement, :csa)
|
119
|
+
end
|
120
|
+
|
121
|
+
def move(movement_lines, format=@default_format)
|
122
|
+
movement_lines.each_line do |movement|
|
123
|
+
movement.chomp!
|
124
|
+
__send__("move_by_#{format.to_s}", movement)
|
125
|
+
end
|
126
|
+
self
|
127
|
+
end
|
128
|
+
|
129
|
+
def show(format=@default_format)
|
130
|
+
$stdout.puts __send__("to_#{format}")
|
131
|
+
end
|
132
|
+
|
133
|
+
private
|
134
|
+
def default_position
|
135
|
+
[["-KY", "-KE", "-GI", "-KI", "-OU", "-KI", "-GI", "-KE", "-KY"],
|
136
|
+
[ "", "-HI", "", "", "", "", "", "-KA", ""],
|
137
|
+
["-FU", "-FU", "-FU", "-FU", "-FU", "-FU", "-FU", "-FU", "-FU"],
|
138
|
+
[ "", "", "", "", "", "", "", "", ""],
|
139
|
+
[ "", "", "", "", "", "", "", "", ""],
|
140
|
+
[ "", "", "", "", "", "", "", "", ""],
|
141
|
+
["+FU", "+FU", "+FU", "+FU", "+FU", "+FU", "+FU", "+FU", "+FU"],
|
142
|
+
[ "", "+KA", "", "", "", "", "", "+HI", ""],
|
143
|
+
["+KY", "+KE", "+GI", "+KI", "+OU", "+KI", "+GI", "+KE", "+KY"]]
|
144
|
+
end
|
145
|
+
|
146
|
+
def move_by_csa(csa)
|
111
147
|
unless /\A[+-](00|[1-9]{2})[1-9]{2}[A-Z]{2}\z/ =~ csa
|
112
148
|
raise FormatError, "Wrong CSA format: #{csa}"
|
113
149
|
end
|
@@ -119,10 +155,10 @@ module Shogi
|
|
119
155
|
if csa[1..2] == "00"
|
120
156
|
before_piece = csa[0] + csa[5..6]
|
121
157
|
unless @captured.include?(before_piece)
|
122
|
-
raise MoveError, "Not captured piece: #{
|
158
|
+
raise MoveError, "Not captured piece: #{before_piece}"
|
123
159
|
end
|
124
160
|
before_cell = before_piece
|
125
|
-
before_piece =
|
161
|
+
before_piece = Piece.const_get(before_cell[1..2]).new
|
126
162
|
else
|
127
163
|
before_x = 9 - csa[1].to_i
|
128
164
|
before_y = csa[2].to_i - 1
|
@@ -130,13 +166,13 @@ module Shogi
|
|
130
166
|
if before_cell == ""
|
131
167
|
raise MoveError, "Before cell is blank"
|
132
168
|
end
|
133
|
-
before_piece =
|
169
|
+
before_piece = Piece.const_get(before_cell[1..2]).new
|
134
170
|
|
135
171
|
unless csa[0] == before_cell[0]
|
136
|
-
raise MoveError, "
|
172
|
+
raise MoveError, "Not your piece: #{before_cell}"
|
137
173
|
end
|
138
174
|
unless csa[5..6] == before_cell[1..2]
|
139
|
-
after_piece =
|
175
|
+
after_piece = Piece.const_get(csa[5..6]).new
|
140
176
|
unless before_piece.promoter == after_piece.class
|
141
177
|
raise MoveError, "Don't promote: #{before_cell[1..2]} -> #{csa[5..6]}"
|
142
178
|
end
|
@@ -144,11 +180,11 @@ module Shogi
|
|
144
180
|
after_y = csa[4].to_i - 1
|
145
181
|
if csa[0] == "+"
|
146
182
|
unless after_y < 3 || before_y < 3
|
147
|
-
raise_movement_error("Don't promote
|
183
|
+
raise_movement_error("Don't promote this move: #{csa}")
|
148
184
|
end
|
149
185
|
else
|
150
186
|
unless after_y > 6 || before_y > 6
|
151
|
-
raise_movement_error("Don't promote
|
187
|
+
raise_movement_error("Don't promote this move: #{csa}")
|
152
188
|
end
|
153
189
|
end
|
154
190
|
end
|
@@ -175,12 +211,12 @@ module Shogi
|
|
175
211
|
end
|
176
212
|
|
177
213
|
unless before_piece.move?(movement_x, movement_y)
|
178
|
-
raise_movement_error("Invalid movement")
|
214
|
+
raise_movement_error("Invalid movement: #{csa}")
|
179
215
|
end
|
180
216
|
end
|
181
217
|
|
182
218
|
unless after_cell == ""
|
183
|
-
after_piece =
|
219
|
+
after_piece = Piece.const_get(after_cell[1..2]).new
|
184
220
|
if after_piece.class.const_defined?(:CHILD)
|
185
221
|
@captured << "#{csa[0]}#{after_piece.class::CHILD}"
|
186
222
|
else
|
@@ -206,27 +242,7 @@ module Shogi
|
|
206
242
|
@position[before_y][before_x] = ""
|
207
243
|
end
|
208
244
|
|
209
|
-
|
210
|
-
end
|
211
|
-
|
212
|
-
def move_from_csa_lines(csa_lines)
|
213
|
-
csa_lines.each_line do |csa|
|
214
|
-
csa.chomp!
|
215
|
-
move_from_csa(csa)
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
private
|
220
|
-
def default_position
|
221
|
-
[["-KY", "-KE", "-GI", "-KI", "-OU", "-KI", "-GI", "-KE", "-KY"],
|
222
|
-
[ "", "-HI", "", "", "", "", "", "-KA", ""],
|
223
|
-
["-FU", "-FU", "-FU", "-FU", "-FU", "-FU", "-FU", "-FU", "-FU"],
|
224
|
-
[ "", "", "", "", "", "", "", "", ""],
|
225
|
-
[ "", "", "", "", "", "", "", "", ""],
|
226
|
-
[ "", "", "", "", "", "", "", "", ""],
|
227
|
-
["+FU", "+FU", "+FU", "+FU", "+FU", "+FU", "+FU", "+FU", "+FU"],
|
228
|
-
[ "", "+KA", "", "", "", "", "", "+HI", ""],
|
229
|
-
["+KY", "+KE", "+GI", "+KI", "+OU", "+KI", "+GI", "+KE", "+KY"]]
|
245
|
+
self
|
230
246
|
end
|
231
247
|
|
232
248
|
def raise_movement_error(message)
|
data/lib/shogi/game.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
module Shogi
|
2
|
+
class Game
|
3
|
+
attr_accessor :default_format
|
4
|
+
attr_reader :turn
|
5
|
+
def initialize(format=:csa, turn="+", kifu=[])
|
6
|
+
raise ArgumentError, "Undefined format: #{format}" unless /\Acsa\z/ =~ format
|
7
|
+
raise ArgumentError, "Invalid turn: #{turn}" unless /\A[+-]\z/ =~ turn
|
8
|
+
|
9
|
+
@default_format = format
|
10
|
+
@board = Shogi::Board.new(@default_format)
|
11
|
+
@turn = turn
|
12
|
+
@kifu = kifu
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_csa
|
16
|
+
@board.to_csa << turn << "\n"
|
17
|
+
end
|
18
|
+
|
19
|
+
def move(movement_lines, format=@default_format)
|
20
|
+
movement_lines.each_line do |movement|
|
21
|
+
movement.chomp!
|
22
|
+
@kifu << movement
|
23
|
+
@board.move(movement, format)
|
24
|
+
@turn = (@turn == "+") ? "-" : "+"
|
25
|
+
end
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def kifu
|
30
|
+
@kifu.join("\n") << "\n"
|
31
|
+
end
|
32
|
+
|
33
|
+
def show(format=@default_format)
|
34
|
+
$stdout.puts __send__("to_#{format}")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/shogi/version.rb
CHANGED
data/lib/shogi.rb
CHANGED
data/test/test-board.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "shogi/board"
|
2
|
+
require "stringio"
|
2
3
|
|
3
4
|
class BoardTest < Test::Unit::TestCase
|
4
5
|
def setup
|
@@ -12,7 +13,7 @@ class BoardTest < Test::Unit::TestCase
|
|
12
13
|
end
|
13
14
|
|
14
15
|
def test_initialize_csa
|
15
|
-
|
16
|
+
position = <<-EOT
|
16
17
|
P1 * * * * +HI * * -KE *
|
17
18
|
P2 * * * * * +KA-OU * -KY
|
18
19
|
P3 * * * * * * -FU-FU-FU
|
@@ -25,8 +26,24 @@ P9 * * * * * * * * *
|
|
25
26
|
P+00HI00GI00KE
|
26
27
|
P-
|
27
28
|
EOT
|
28
|
-
@board = Shogi::Board.new(csa)
|
29
|
-
assert_equal(
|
29
|
+
@board = Shogi::Board.new(:csa, position)
|
30
|
+
assert_equal(position, @board.to_csa)
|
31
|
+
assert_nothing_raised do
|
32
|
+
@board.move("+0031HI")
|
33
|
+
end
|
34
|
+
assert_equal(<<-EOT, @board.to_csa)
|
35
|
+
P1 * * * * +HI * +HI-KE *
|
36
|
+
P2 * * * * * +KA-OU * -KY
|
37
|
+
P3 * * * * * * -FU-FU-FU
|
38
|
+
P4 * * * * +KY * * -GI *
|
39
|
+
P5 * * * * * * * * *
|
40
|
+
P6 * * * * * * * * *
|
41
|
+
P7 * * * * * * * * *
|
42
|
+
P8 * * * * * * * * *
|
43
|
+
P9 * * * * * * * * *
|
44
|
+
P+00GI00KE
|
45
|
+
P-
|
46
|
+
EOT
|
30
47
|
end
|
31
48
|
|
32
49
|
def test_to_csa
|
@@ -47,6 +64,32 @@ P-
|
|
47
64
|
assert_equal(before_state, @board.instance_variable_get(:@position))
|
48
65
|
end
|
49
66
|
|
67
|
+
def test_show
|
68
|
+
before_state = @board.instance_variable_get(:@position).dup
|
69
|
+
s = ""
|
70
|
+
io = StringIO.new(s)
|
71
|
+
$stdout = io
|
72
|
+
@board.default_format = :csa
|
73
|
+
|
74
|
+
@board.show
|
75
|
+
|
76
|
+
$stdout = STDOUT
|
77
|
+
assert_equal(<<-EOT, s)
|
78
|
+
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
|
79
|
+
P2 * -HI * * * * * -KA *
|
80
|
+
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
|
81
|
+
P4 * * * * * * * * *
|
82
|
+
P5 * * * * * * * * *
|
83
|
+
P6 * * * * * * * * *
|
84
|
+
P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
|
85
|
+
P8 * +KA * * * * * +HI *
|
86
|
+
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
|
87
|
+
P+
|
88
|
+
P-
|
89
|
+
EOT
|
90
|
+
assert_equal(before_state, @board.instance_variable_get(:@position))
|
91
|
+
end
|
92
|
+
|
50
93
|
def test_set_from_csa
|
51
94
|
csa = <<-EOT
|
52
95
|
P1 * * * * +HI * * -KE *
|
@@ -63,6 +106,9 @@ P-
|
|
63
106
|
EOT
|
64
107
|
@board.set_from_csa(csa)
|
65
108
|
assert_equal(csa, @board.to_csa)
|
109
|
+
assert_nothing_raised do
|
110
|
+
@board.move("+0031HI", :csa)
|
111
|
+
end
|
66
112
|
end
|
67
113
|
|
68
114
|
def test_to_usi
|
@@ -73,31 +119,37 @@ lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL
|
|
73
119
|
assert_equal(before_state, @board.instance_variable_get(:@position))
|
74
120
|
end
|
75
121
|
|
76
|
-
def
|
122
|
+
def test_move_csa
|
123
|
+
@board.default_format = :csa
|
124
|
+
|
77
125
|
assert_raise Shogi::Board::FormatError do
|
78
|
-
@board.
|
126
|
+
@board.move("+27FU")
|
79
127
|
end
|
80
128
|
assert_raise Shogi::Board::UndefinedPieceError do
|
81
|
-
@board.
|
129
|
+
@board.move("+2726AA")
|
82
130
|
end
|
83
131
|
assert_raise Shogi::Board::MoveError do
|
84
|
-
assert_false(@board.
|
132
|
+
assert_false(@board.move("+2726HI"))
|
85
133
|
end
|
86
134
|
assert_raise Shogi::Board::MoveError do
|
87
|
-
assert_false(@board.
|
135
|
+
assert_false(@board.move("+2827HI"))
|
88
136
|
end
|
89
137
|
assert_raise Shogi::Board::MoveError do
|
90
|
-
assert_false(@board.
|
138
|
+
assert_false(@board.move("+2625FU"))
|
91
139
|
end
|
92
140
|
assert_raise Shogi::Board::MovementError do
|
93
|
-
assert_false(@board.
|
141
|
+
assert_false(@board.move("+2725FU"))
|
94
142
|
end
|
95
143
|
assert_raise Shogi::Board::MoveError do
|
96
|
-
assert_false(@board.
|
144
|
+
assert_false(@board.move("-4131KI"))
|
97
145
|
end
|
98
|
-
|
99
|
-
|
100
|
-
|
146
|
+
|
147
|
+
assert_nothing_raised do
|
148
|
+
@board.move("+7776FU")
|
149
|
+
@board.move("-4132KI")
|
150
|
+
@board.move("+2868HI")
|
151
|
+
end
|
152
|
+
|
101
153
|
assert_equal(<<-EOT, @board.to_csa)
|
102
154
|
P1-KY-KE-GI-KI-OU * -GI-KE-KY
|
103
155
|
P2 * -HI * * * * -KI-KA *
|
@@ -113,11 +165,32 @@ P-
|
|
113
165
|
EOT
|
114
166
|
end
|
115
167
|
|
116
|
-
def
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
168
|
+
def test_move_csa_chain
|
169
|
+
assert_nothing_raised do
|
170
|
+
@board.move("+7776FU", :csa).move("-4132KI", :csa)
|
171
|
+
end
|
172
|
+
assert_equal(<<-EOT, @board.to_csa)
|
173
|
+
P1-KY-KE-GI-KI-OU * -GI-KE-KY
|
174
|
+
P2 * -HI * * * * -KI-KA *
|
175
|
+
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
|
176
|
+
P4 * * * * * * * * *
|
177
|
+
P5 * * * * * * * * *
|
178
|
+
P6 * * +FU * * * * * *
|
179
|
+
P7+FU+FU * +FU+FU+FU+FU+FU+FU
|
180
|
+
P8 * +KA * * * * * +HI *
|
181
|
+
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
|
182
|
+
P+
|
183
|
+
P-
|
184
|
+
EOT
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_move_csa_at_captured
|
188
|
+
assert_nothing_raised do
|
189
|
+
@board.move("+7776FU", :csa)
|
190
|
+
@board.move("-3334FU", :csa)
|
191
|
+
@board.move("+8822KA", :csa)
|
192
|
+
@board.move("-3122GI", :csa)
|
193
|
+
end
|
121
194
|
assert_equal(<<-EOT, @board.to_csa)
|
122
195
|
P1-KY-KE-GI-KI-OU-KI * -KE-KY
|
123
196
|
P2 * -HI * * * * * -GI *
|
@@ -131,7 +204,9 @@ P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
|
|
131
204
|
P+00KA
|
132
205
|
P-00KA
|
133
206
|
EOT
|
134
|
-
|
207
|
+
assert_nothing_raised do
|
208
|
+
@board.move("+0055KA", :csa)
|
209
|
+
end
|
135
210
|
assert_equal(<<-EOT, @board.to_csa)
|
136
211
|
P1-KY-KE-GI-KI-OU-KI * -KE-KY
|
137
212
|
P2 * -HI * * * * * -GI *
|
@@ -147,13 +222,15 @@ P-00KA
|
|
147
222
|
EOT
|
148
223
|
end
|
149
224
|
|
150
|
-
def
|
151
|
-
@board.
|
152
|
-
@board.
|
225
|
+
def test_move_csa_promote
|
226
|
+
@board.move("+7776FU", :csa)
|
227
|
+
@board.move("-3334FU", :csa)
|
153
228
|
assert_raise Shogi::Board::MovementError do
|
154
|
-
assert_false(@board.
|
229
|
+
assert_false(@board.move("+2726TO", :csa))
|
230
|
+
end
|
231
|
+
assert_nothing_raised do
|
232
|
+
@board.move("+8822UM", :csa)
|
155
233
|
end
|
156
|
-
assert_true(@board.move_from_csa("+8822UM"))
|
157
234
|
assert_equal(<<-EOT, @board.to_csa)
|
158
235
|
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
|
159
236
|
P2 * -HI * * * * * +UM *
|
@@ -167,7 +244,9 @@ P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
|
|
167
244
|
P+00KA
|
168
245
|
P-
|
169
246
|
EOT
|
170
|
-
|
247
|
+
assert_nothing_raised do
|
248
|
+
@board.move("-3122GI", :csa)
|
249
|
+
end
|
171
250
|
assert_equal(<<-EOT, @board.to_csa)
|
172
251
|
P1-KY-KE-GI-KI-OU-KI * -KE-KY
|
173
252
|
P2 * -HI * * * * * -GI *
|
@@ -181,10 +260,12 @@ P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
|
|
181
260
|
P+00KA
|
182
261
|
P-00KA
|
183
262
|
EOT
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
263
|
+
assert_nothing_raised do
|
264
|
+
@board.move("+0033KA", :csa)
|
265
|
+
@board.move("-0078KA", :csa)
|
266
|
+
@board.move("+3366UM", :csa)
|
267
|
+
@board.move("-7867UM", :csa)
|
268
|
+
end
|
188
269
|
assert_equal(<<-EOT, @board.to_csa)
|
189
270
|
P1-KY-KE-GI-KI-OU-KI * -KE-KY
|
190
271
|
P2 * -HI * * * * * -GI *
|
@@ -200,7 +281,7 @@ P-00FU
|
|
200
281
|
EOT
|
201
282
|
end
|
202
283
|
|
203
|
-
def
|
284
|
+
def test_move_csa_lines
|
204
285
|
csa_lines = <<-EOT
|
205
286
|
+7776FU
|
206
287
|
-3334FU
|
@@ -209,7 +290,7 @@ P-00FU
|
|
209
290
|
+0055KA
|
210
291
|
EOT
|
211
292
|
|
212
|
-
@board.
|
293
|
+
@board.move(csa_lines, :csa)
|
213
294
|
|
214
295
|
assert_equal(<<-EOT, @board.to_csa)
|
215
296
|
P1-KY-KE-GI-KI-OU-KI * -KE-KY
|
@@ -230,6 +311,8 @@ P-00KA
|
|
230
311
|
assert_true(@board.validate_movement)
|
231
312
|
@board.validate_movement = false
|
232
313
|
assert_false(@board.validate_movement)
|
233
|
-
|
314
|
+
assert_nothing_raised do
|
315
|
+
@board.move("+2755FU", :csa)
|
316
|
+
end
|
234
317
|
end
|
235
318
|
end
|
data/test/test-game.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require "shogi/game"
|
2
|
+
|
3
|
+
class GameTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@game = Shogi::Game.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_initialize
|
9
|
+
assert_equal(:csa, @game.default_format)
|
10
|
+
assert_equal("+", @game.turn)
|
11
|
+
assert_equal([], @game.instance_variable_get(:@kifu))
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_to_csa
|
15
|
+
assert_equal(<<-EOT, @game.to_csa)
|
16
|
+
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
|
17
|
+
P2 * -HI * * * * * -KA *
|
18
|
+
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
|
19
|
+
P4 * * * * * * * * *
|
20
|
+
P5 * * * * * * * * *
|
21
|
+
P6 * * * * * * * * *
|
22
|
+
P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
|
23
|
+
P8 * +KA * * * * * +HI *
|
24
|
+
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
|
25
|
+
P+
|
26
|
+
P-
|
27
|
+
+
|
28
|
+
EOT
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_move
|
32
|
+
@game.default_format = :csa
|
33
|
+
|
34
|
+
assert_nothing_raised do
|
35
|
+
@game.move("+7776FU")
|
36
|
+
@game.move("-4132KI")
|
37
|
+
@game.move("+2868HI")
|
38
|
+
end
|
39
|
+
|
40
|
+
assert_equal(<<-EOT, @game.to_csa)
|
41
|
+
P1-KY-KE-GI-KI-OU * -GI-KE-KY
|
42
|
+
P2 * -HI * * * * -KI-KA *
|
43
|
+
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
|
44
|
+
P4 * * * * * * * * *
|
45
|
+
P5 * * * * * * * * *
|
46
|
+
P6 * * +FU * * * * * *
|
47
|
+
P7+FU+FU * +FU+FU+FU+FU+FU+FU
|
48
|
+
P8 * +KA * +HI * * * * *
|
49
|
+
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
|
50
|
+
P+
|
51
|
+
P-
|
52
|
+
-
|
53
|
+
EOT
|
54
|
+
|
55
|
+
assert_equal(<<-EOT, @game.kifu)
|
56
|
+
+7776FU
|
57
|
+
-4132KI
|
58
|
+
+2868HI
|
59
|
+
EOT
|
60
|
+
end
|
61
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shogi-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masafumi Yokoyama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-unit
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- lib/shogi.rb
|
97
97
|
- lib/shogi/board.rb
|
98
98
|
- lib/shogi/cell.rb
|
99
|
+
- lib/shogi/game.rb
|
99
100
|
- lib/shogi/piece.rb
|
100
101
|
- lib/shogi/piece/base.rb
|
101
102
|
- lib/shogi/piece/promoter.rb
|
@@ -104,6 +105,7 @@ files:
|
|
104
105
|
- test/run-test.rb
|
105
106
|
- test/test-board.rb
|
106
107
|
- test/test-cell.rb
|
108
|
+
- test/test-game.rb
|
107
109
|
- test/test-piece.rb
|
108
110
|
homepage: https://github.com/myokoym/shogi-ruby
|
109
111
|
licenses:
|
@@ -133,5 +135,6 @@ test_files:
|
|
133
135
|
- test/run-test.rb
|
134
136
|
- test/test-board.rb
|
135
137
|
- test/test-cell.rb
|
138
|
+
- test/test-game.rb
|
136
139
|
- test/test-piece.rb
|
137
140
|
has_rdoc:
|