shogi-ruby 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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 [![Build Status](https://secure.travis-ci.org/myokoym/shogi-ruby.png?branch=master)](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:
|