console-shogi 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +19 -0
- data/images/active/gote/fu.png +0 -0
- data/images/active/gote/gin.png +0 -0
- data/images/active/gote/gyoku.png +0 -0
- data/images/active/gote/hisha.png +0 -0
- data/images/active/gote/kaku.png +0 -0
- data/images/active/gote/keima.png +0 -0
- data/images/active/gote/kin.png +0 -0
- data/images/active/gote/kyosha.png +0 -0
- data/images/active/gote/narigin.png +0 -0
- data/images/active/gote/narikei.png +0 -0
- data/images/active/gote/narikyo.png +0 -0
- data/images/active/gote/ohsho.png +0 -0
- data/images/active/gote/ryu.png +0 -0
- data/images/active/gote/tokin.png +0 -0
- data/images/active/gote/uma.png +0 -0
- data/images/active/nonepiece.png +0 -0
- data/images/active/sente/fu.png +0 -0
- data/images/active/sente/gin.png +0 -0
- data/images/active/sente/gyoku.png +0 -0
- data/images/active/sente/hisha.png +0 -0
- data/images/active/sente/kaku.png +0 -0
- data/images/active/sente/keima.png +0 -0
- data/images/active/sente/kin.png +0 -0
- data/images/active/sente/kyosha.png +0 -0
- data/images/active/sente/narigin.png +0 -0
- data/images/active/sente/narikei.png +0 -0
- data/images/active/sente/narikyo.png +0 -0
- data/images/active/sente/ohsho.png +0 -0
- data/images/active/sente/ryu.png +0 -0
- data/images/active/sente/tokin.png +0 -0
- data/images/active/sente/uma.png +0 -0
- data/images/focused/gote/fu.png +0 -0
- data/images/focused/gote/gin.png +0 -0
- data/images/focused/gote/gyoku.png +0 -0
- data/images/focused/gote/hisha.png +0 -0
- data/images/focused/gote/kaku.png +0 -0
- data/images/focused/gote/keima.png +0 -0
- data/images/focused/gote/kin.png +0 -0
- data/images/focused/gote/kyosha.png +0 -0
- data/images/focused/gote/narigin.png +0 -0
- data/images/focused/gote/narikei.png +0 -0
- data/images/focused/gote/narikyo.png +0 -0
- data/images/focused/gote/ohsho.png +0 -0
- data/images/focused/gote/ryu.png +0 -0
- data/images/focused/gote/tokin.png +0 -0
- data/images/focused/gote/uma.png +0 -0
- data/images/focused/nonepiece.png +0 -0
- data/images/focused/sente/fu.png +0 -0
- data/images/focused/sente/gin.png +0 -0
- data/images/focused/sente/gyoku.png +0 -0
- data/images/focused/sente/hisha.png +0 -0
- data/images/focused/sente/kaku.png +0 -0
- data/images/focused/sente/keima.png +0 -0
- data/images/focused/sente/kin.png +0 -0
- data/images/focused/sente/kyosha.png +0 -0
- data/images/focused/sente/narigin.png +0 -0
- data/images/focused/sente/narikei.png +0 -0
- data/images/focused/sente/narikyo.png +0 -0
- data/images/focused/sente/ohsho.png +0 -0
- data/images/focused/sente/ryu.png +0 -0
- data/images/focused/sente/tokin.png +0 -0
- data/images/focused/sente/uma.png +0 -0
- data/lib/console_shogi/board.rb +5 -9
- data/lib/console_shogi/game.rb +118 -19
- data/lib/console_shogi/komadai.rb +11 -9
- data/lib/console_shogi/new_board_builder.rb +41 -41
- data/lib/console_shogi/piece.rb +34 -23
- data/lib/console_shogi/piece_movement_checker.rb +46 -0
- data/lib/console_shogi/piece_mover.rb +31 -48
- data/lib/console_shogi/piece_mover_on_komadai.rb +30 -36
- data/lib/console_shogi/player.rb +5 -13
- data/lib/console_shogi/teban.rb +8 -0
- data/lib/console_shogi/terminal/cursor.rb +80 -0
- data/lib/console_shogi/terminal/display_area.rb +30 -0
- data/lib/console_shogi/terminal/operator.rb +209 -0
- data/lib/console_shogi/version.rb +1 -1
- data/lib/console_shogi.rb +6 -1
- metadata +102 -37
- data/images/gote/nonepiece.png +0 -0
- data/lib/console_shogi/terminal_operator.rb +0 -211
- /data/images/{gote/shori.png → gote_shori.png} +0 -0
- /data/images/{gote → nomal/gote}/fu.png +0 -0
- /data/images/{gote → nomal/gote}/gin.png +0 -0
- /data/images/{gote → nomal/gote}/gyoku.png +0 -0
- /data/images/{gote → nomal/gote}/hisha.png +0 -0
- /data/images/{gote → nomal/gote}/kaku.png +0 -0
- /data/images/{gote → nomal/gote}/keima.png +0 -0
- /data/images/{gote → nomal/gote}/kin.png +0 -0
- /data/images/{gote → nomal/gote}/kyosha.png +0 -0
- /data/images/{gote → nomal/gote}/narigin.png +0 -0
- /data/images/{gote → nomal/gote}/narikei.png +0 -0
- /data/images/{gote → nomal/gote}/narikyo.png +0 -0
- /data/images/{gote → nomal/gote}/ohsho.png +0 -0
- /data/images/{gote → nomal/gote}/ryu.png +0 -0
- /data/images/{gote → nomal/gote}/tokin.png +0 -0
- /data/images/{gote → nomal/gote}/uma.png +0 -0
- /data/images/{sente → nomal}/nonepiece.png +0 -0
- /data/images/{sente → nomal/sente}/fu.png +0 -0
- /data/images/{sente → nomal/sente}/gin.png +0 -0
- /data/images/{sente → nomal/sente}/gyoku.png +0 -0
- /data/images/{sente → nomal/sente}/hisha.png +0 -0
- /data/images/{sente → nomal/sente}/kaku.png +0 -0
- /data/images/{sente → nomal/sente}/keima.png +0 -0
- /data/images/{sente → nomal/sente}/kin.png +0 -0
- /data/images/{sente → nomal/sente}/kyosha.png +0 -0
- /data/images/{sente → nomal/sente}/narigin.png +0 -0
- /data/images/{sente → nomal/sente}/narikei.png +0 -0
- /data/images/{sente → nomal/sente}/narikyo.png +0 -0
- /data/images/{sente → nomal/sente}/ohsho.png +0 -0
- /data/images/{sente → nomal/sente}/ryu.png +0 -0
- /data/images/{sente → nomal/sente}/tokin.png +0 -0
- /data/images/{sente → nomal/sente}/uma.png +0 -0
- /data/images/{sente/shori.png → sente_shori.png} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: add4a4e51f593521d761a1afe000dfe184f8effe9d4f41d4822807465036a3cb
|
4
|
+
data.tar.gz: dbde9af4607ec797e9bdbea94d1a7ef64d7eb0cdbfbca8c9d5c601696e1f0785
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85e7e5b136cfda4c6a31fa6e1cb9b380b0adfb3162b2f9c2ae154d831a1ee3e7302275c8e94f2da2ce7a2c6695280eedf26fb4df2f0a24b9775b606030d2d0a5
|
7
|
+
data.tar.gz: 5ea91665e1498809b9b59cc282e2ea22ac7c8dbd1ed2b5770f02bd29afbc18cb08c0ab074ef2a8a5b8aaa4e006513ced0f62a4f9b67bff31866a341b46d810b6
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1 +1,20 @@
|
|
1
1
|
# console-shogi
|
2
|
+
|
3
|
+
You can play the Shogi in your terminal ☗☖
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
```
|
8
|
+
gem install console-shogi
|
9
|
+
```
|
10
|
+
|
11
|
+
## Start Game
|
12
|
+
|
13
|
+
```
|
14
|
+
console-shogi
|
15
|
+
```
|
16
|
+
|
17
|
+
## Commands
|
18
|
+
|
19
|
+
* move a cursor : `direction keys` ←↓↑→
|
20
|
+
* select and drop a piece : `Enter`
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/console_shogi/board.rb
CHANGED
@@ -12,6 +12,10 @@ module ConsoleShogi
|
|
12
12
|
@pieces
|
13
13
|
end
|
14
14
|
|
15
|
+
def copy
|
16
|
+
Board.new(pieces: pieces.to_a)
|
17
|
+
end
|
18
|
+
|
15
19
|
def within_range?(x:, y:)
|
16
20
|
case {x: x, y: y}
|
17
21
|
in x: 0..8, y: 0..8
|
@@ -34,16 +38,8 @@ module ConsoleShogi
|
|
34
38
|
end
|
35
39
|
|
36
40
|
def move_piece!(from:, to:)
|
37
|
-
|
41
|
+
@pieces[to[:y], to[:x]] = @pieces[from[:y], from[:x]]
|
38
42
|
@pieces[from[:y], from[:x]] = NonePiece.new
|
39
|
-
|
40
|
-
to_piece = @pieces[to[:y], to[:x]]
|
41
|
-
|
42
|
-
# NOTE 駒を取る、リファクタする
|
43
|
-
# from_piece.player で player 取るの違和感
|
44
|
-
from_piece.player.capture_piece!(to_piece) unless to_piece.none?
|
45
|
-
|
46
|
-
@pieces[to[:y], to[:x]] = from_piece
|
47
43
|
end
|
48
44
|
|
49
45
|
private
|
data/lib/console_shogi/game.rb
CHANGED
@@ -5,13 +5,21 @@ require 'io/console'
|
|
5
5
|
module ConsoleShogi
|
6
6
|
class Game
|
7
7
|
def initialize
|
8
|
-
@sente_player = Player.new(teban:
|
9
|
-
@gote_player = Player.new(teban:
|
10
|
-
@board = NewBoardBuilder.build
|
8
|
+
@sente_player = Player.new(teban: Teban::SENTE)
|
9
|
+
@gote_player = Player.new(teban: Teban::GOTE)
|
10
|
+
@board = NewBoardBuilder.build
|
11
|
+
|
12
|
+
@previous_board = Board.new(pieces: [])
|
13
|
+
@from_cursor = nil
|
14
|
+
@selected_piece = false
|
15
|
+
@teban_player = @sente_player
|
11
16
|
end
|
12
17
|
|
13
18
|
def start
|
14
|
-
|
19
|
+
Terminal::Operator.clear_scrren
|
20
|
+
|
21
|
+
Terminal::Operator.print_diff_board(previous_board: previous_board, board: board, sente_komadai: sente_player.komadai, gote_komadai: gote_player.komadai)
|
22
|
+
Terminal::Operator.print_teban(teban_player.teban)
|
15
23
|
|
16
24
|
while key = STDIN.getch
|
17
25
|
# NOTE Ctrl-C を押したら終了
|
@@ -21,29 +29,80 @@ module ConsoleShogi
|
|
21
29
|
elsif key == "\e" && STDIN.getch == "["
|
22
30
|
key = STDIN.getch
|
23
31
|
|
24
|
-
|
32
|
+
cursor = Terminal::Operator.cursor
|
33
|
+
@previous_cursor_on_square = cursor.dup unless cursor.squares_position.location == :none
|
34
|
+
|
35
|
+
cursor.move(key)
|
36
|
+
|
37
|
+
# TODO 選択したピースは色を変えないようにしている。状態の持ち方を見直したい
|
38
|
+
deactive_piece(previous_cursor_on_square) unless selected_piece && from_cursor.squares_position == previous_cursor_on_square.squares_position
|
39
|
+
focus_piece(cursor) unless selected_piece && from_cursor.squares_position == cursor.squares_position
|
25
40
|
# NOTE Enter を押したら駒を移動
|
26
41
|
elsif key == "\r"
|
27
42
|
# TODO このまま Hash にするかは要検討
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
43
|
+
cursor = Terminal::Operator.cursor
|
44
|
+
|
45
|
+
if selected_piece
|
46
|
+
next if cursor.squares_position.location != :board
|
47
|
+
|
48
|
+
piece_mover =
|
49
|
+
case from_cursor.squares_position.location
|
50
|
+
when :board
|
51
|
+
# TODO 後で index を統一的にどう扱うか整理する
|
52
|
+
PieceMover.new(
|
53
|
+
board: board,
|
54
|
+
player: teban_player,
|
55
|
+
from: from_cursor.squares_position.to_h,
|
56
|
+
to: cursor.squares_position.to_h
|
57
|
+
)
|
58
|
+
when :sente_komadai
|
59
|
+
PieceMoverOnKomadai.new(
|
60
|
+
board: board,
|
61
|
+
komadai: sente_player.komadai,
|
62
|
+
from: from_cursor.squares_position.to_h,
|
63
|
+
to: cursor.squares_position.to_h
|
64
|
+
)
|
65
|
+
when :gote_komadai
|
66
|
+
PieceMoverOnKomadai.new(
|
67
|
+
board: board,
|
68
|
+
komadai: gote_player.komadai,
|
69
|
+
from: from_cursor.squares_position.to_h,
|
70
|
+
to: cursor.squares_position.to_h
|
71
|
+
)
|
72
|
+
end
|
38
73
|
|
39
|
-
|
40
|
-
|
74
|
+
piece_mover.move!
|
75
|
+
|
76
|
+
if piece_mover.moved_piece?
|
77
|
+
Terminal::Operator.print_diff_board(previous_board: previous_board, board: board, sente_komadai: sente_player.komadai, gote_komadai: gote_player.komadai)
|
78
|
+
|
79
|
+
@previous_board = board.copy
|
80
|
+
change_teban!
|
81
|
+
|
82
|
+
Terminal::Operator.print_teban(teban_player.teban)
|
83
|
+
else
|
84
|
+
deactive_piece(from_cursor)
|
85
|
+
end
|
86
|
+
|
87
|
+
@from_cursor = nil
|
88
|
+
@selected_piece = false
|
89
|
+
else
|
90
|
+
# TODO PieceMover の can_move? と分散してしまっている気もする
|
91
|
+
next if cursor.squares_position.location == :none
|
92
|
+
next if teban_player.sente? && cursor.squares_position.location == :gote_komadai
|
93
|
+
next if teban_player.gote? && cursor.squares_position.location == :sente_komadai
|
94
|
+
|
95
|
+
active_piece(cursor)
|
96
|
+
|
97
|
+
@from_cursor = cursor.dup
|
98
|
+
@selected_piece = true
|
99
|
+
end
|
41
100
|
|
42
101
|
# TODO ひとまず動く物を作った。リファクタリングする
|
43
102
|
[sente_player, gote_player].each do |player|
|
44
103
|
next unless player.win?
|
45
104
|
|
46
|
-
|
105
|
+
Terminal::Operator.print_winner(player)
|
47
106
|
exit
|
48
107
|
end
|
49
108
|
end
|
@@ -52,6 +111,46 @@ module ConsoleShogi
|
|
52
111
|
|
53
112
|
private
|
54
113
|
|
55
|
-
attr_reader :board, :sente_player, :gote_player
|
114
|
+
attr_reader :board, :sente_player, :gote_player, :selected_piece, :from_cursor, :teban_player, :previous_board, :previous_cursor_on_square
|
115
|
+
|
116
|
+
def change_teban!
|
117
|
+
@teban_player = teban_player == sente_player ? gote_player : sente_player
|
118
|
+
end
|
119
|
+
|
120
|
+
def active_piece(cursor)
|
121
|
+
# TODO case で指定しないといけないのイケてないのでリファクタしたい
|
122
|
+
case cursor.squares_position.location
|
123
|
+
when :board
|
124
|
+
Terminal::Operator.active_piece(location: board, cursor: cursor)
|
125
|
+
when :sente_komadai
|
126
|
+
Terminal::Operator.active_piece(location: sente_player.komadai, cursor: cursor)
|
127
|
+
when :gote_komadai
|
128
|
+
Terminal::Operator.active_piece(location: gote_player.komadai, cursor: cursor)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def deactive_piece(cursor)
|
133
|
+
# TODO case で指定しないといけないのイケてないのでリファクタしたい
|
134
|
+
case cursor.squares_position.location
|
135
|
+
when :board
|
136
|
+
Terminal::Operator.deactive_piece(location: board, previous_cursor: cursor)
|
137
|
+
when :sente_komadai
|
138
|
+
Terminal::Operator.deactive_piece(location: sente_player.komadai, previous_cursor: cursor)
|
139
|
+
when :gote_komadai
|
140
|
+
Terminal::Operator.deactive_piece(location: gote_player.komadai, previous_cursor: cursor)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def focus_piece(cursor)
|
145
|
+
# TODO case で指定しないといけないのイケてないのでリファクタしたい
|
146
|
+
case cursor.squares_position.location
|
147
|
+
when :board
|
148
|
+
Terminal::Operator.focus_piece(location: board, cursor: cursor)
|
149
|
+
when :sente_komadai
|
150
|
+
Terminal::Operator.focus_piece(location: sente_player.komadai, cursor: cursor)
|
151
|
+
when :gote_komadai
|
152
|
+
Terminal::Operator.focus_piece(location: gote_player.komadai, cursor: cursor)
|
153
|
+
end
|
154
|
+
end
|
56
155
|
end
|
57
156
|
end
|
@@ -12,22 +12,16 @@ module ConsoleShogi
|
|
12
12
|
@pieces = empty_pieces
|
13
13
|
end
|
14
14
|
|
15
|
-
def expand!
|
16
|
-
@pieces = pieces.hstack(empty_pieces)
|
17
|
-
end
|
18
|
-
|
19
|
-
def have_space?
|
20
|
-
pieces.any?(&:none?)
|
21
|
-
end
|
22
|
-
|
23
15
|
def fetch_piece(x:, y:)
|
24
16
|
pieces[y, x]
|
25
17
|
end
|
26
18
|
|
27
19
|
def put(piece:)
|
20
|
+
expand! unless have_space?
|
21
|
+
|
28
22
|
index = pieces.index(&:none?)
|
29
23
|
|
30
|
-
|
24
|
+
piece = piece.original if piece.promoted?
|
31
25
|
|
32
26
|
@pieces[*index] = piece
|
33
27
|
|
@@ -41,6 +35,14 @@ module ConsoleShogi
|
|
41
35
|
|
42
36
|
private
|
43
37
|
|
38
|
+
def expand!
|
39
|
+
@pieces = pieces.hstack(empty_pieces)
|
40
|
+
end
|
41
|
+
|
42
|
+
def have_space?
|
43
|
+
pieces.any?(&:none?)
|
44
|
+
end
|
45
|
+
|
44
46
|
def sort_pieces
|
45
47
|
column_num = pieces.count / 3
|
46
48
|
Matrix.rows(pieces.sort_by {|p| -p.number }.each_slice(column_num).to_a)
|
@@ -3,41 +3,41 @@
|
|
3
3
|
module ConsoleShogi
|
4
4
|
class NewBoardBuilder
|
5
5
|
class << self
|
6
|
-
def build
|
6
|
+
def build
|
7
7
|
Board.new(
|
8
8
|
pieces: [
|
9
9
|
[
|
10
|
-
Kyosha.new(
|
11
|
-
Keima.new(
|
12
|
-
Gin.new(
|
13
|
-
Kin.new(
|
14
|
-
Ohsho.new(
|
15
|
-
Kin.new(
|
16
|
-
Gin.new(
|
17
|
-
Keima.new(
|
18
|
-
Kyosha.new(
|
10
|
+
Kyosha.new(teban: Teban::GOTE),
|
11
|
+
Keima.new(teban: Teban::GOTE),
|
12
|
+
Gin.new(teban: Teban::GOTE),
|
13
|
+
Kin.new(teban: Teban::GOTE),
|
14
|
+
Ohsho.new(teban: Teban::GOTE),
|
15
|
+
Kin.new(teban: Teban::GOTE),
|
16
|
+
Gin.new(teban: Teban::GOTE),
|
17
|
+
Keima.new(teban: Teban::GOTE),
|
18
|
+
Kyosha.new(teban: Teban::GOTE)
|
19
19
|
],
|
20
20
|
[
|
21
21
|
NonePiece.new,
|
22
|
-
Hisha.new(
|
22
|
+
Hisha.new(teban: Teban::GOTE),
|
23
23
|
NonePiece.new,
|
24
24
|
NonePiece.new,
|
25
25
|
NonePiece.new,
|
26
26
|
NonePiece.new,
|
27
27
|
NonePiece.new,
|
28
|
-
Kaku.new(
|
28
|
+
Kaku.new(teban: Teban::GOTE),
|
29
29
|
NonePiece.new
|
30
30
|
],
|
31
31
|
[
|
32
|
-
Fu.new(
|
33
|
-
Fu.new(
|
34
|
-
Fu.new(
|
35
|
-
Fu.new(
|
36
|
-
Fu.new(
|
37
|
-
Fu.new(
|
38
|
-
Fu.new(
|
39
|
-
Fu.new(
|
40
|
-
Fu.new(
|
32
|
+
Fu.new(teban: Teban::GOTE),
|
33
|
+
Fu.new(teban: Teban::GOTE),
|
34
|
+
Fu.new(teban: Teban::GOTE),
|
35
|
+
Fu.new(teban: Teban::GOTE),
|
36
|
+
Fu.new(teban: Teban::GOTE),
|
37
|
+
Fu.new(teban: Teban::GOTE),
|
38
|
+
Fu.new(teban: Teban::GOTE),
|
39
|
+
Fu.new(teban: Teban::GOTE),
|
40
|
+
Fu.new(teban: Teban::GOTE)
|
41
41
|
],
|
42
42
|
[
|
43
43
|
NonePiece.new,
|
@@ -73,37 +73,37 @@ module ConsoleShogi
|
|
73
73
|
NonePiece.new
|
74
74
|
],
|
75
75
|
[
|
76
|
-
Fu.new(
|
77
|
-
Fu.new(
|
78
|
-
Fu.new(
|
79
|
-
Fu.new(
|
80
|
-
Fu.new(
|
81
|
-
Fu.new(
|
82
|
-
Fu.new(
|
83
|
-
Fu.new(
|
84
|
-
Fu.new(
|
76
|
+
Fu.new(teban: Teban::SENTE),
|
77
|
+
Fu.new(teban: Teban::SENTE),
|
78
|
+
Fu.new(teban: Teban::SENTE),
|
79
|
+
Fu.new(teban: Teban::SENTE),
|
80
|
+
Fu.new(teban: Teban::SENTE),
|
81
|
+
Fu.new(teban: Teban::SENTE),
|
82
|
+
Fu.new(teban: Teban::SENTE),
|
83
|
+
Fu.new(teban: Teban::SENTE),
|
84
|
+
Fu.new(teban: Teban::SENTE)
|
85
85
|
],
|
86
86
|
[
|
87
87
|
NonePiece.new,
|
88
|
-
Kaku.new(
|
88
|
+
Kaku.new(teban: Teban::SENTE),
|
89
89
|
NonePiece.new,
|
90
90
|
NonePiece.new,
|
91
91
|
NonePiece.new,
|
92
92
|
NonePiece.new,
|
93
93
|
NonePiece.new,
|
94
|
-
Hisha.new(
|
94
|
+
Hisha.new(teban: Teban::SENTE),
|
95
95
|
NonePiece.new
|
96
96
|
],
|
97
97
|
[
|
98
|
-
Kyosha.new(
|
99
|
-
Keima.new(
|
100
|
-
Gin.new(
|
101
|
-
Kin.new(
|
102
|
-
Ohsho.new(
|
103
|
-
Kin.new(
|
104
|
-
Gin.new(
|
105
|
-
Keima.new(
|
106
|
-
Kyosha.new(
|
98
|
+
Kyosha.new(teban: Teban::SENTE),
|
99
|
+
Keima.new(teban: Teban::SENTE),
|
100
|
+
Gin.new(teban: Teban::SENTE),
|
101
|
+
Kin.new(teban: Teban::SENTE),
|
102
|
+
Ohsho.new(teban: Teban::SENTE),
|
103
|
+
Kin.new(teban: Teban::SENTE),
|
104
|
+
Gin.new(teban: Teban::SENTE),
|
105
|
+
Keima.new(teban: Teban::SENTE),
|
106
|
+
Kyosha.new(teban: Teban::SENTE)
|
107
107
|
]
|
108
108
|
]
|
109
109
|
)
|