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.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +19 -0
  4. data/images/active/gote/fu.png +0 -0
  5. data/images/active/gote/gin.png +0 -0
  6. data/images/active/gote/gyoku.png +0 -0
  7. data/images/active/gote/hisha.png +0 -0
  8. data/images/active/gote/kaku.png +0 -0
  9. data/images/active/gote/keima.png +0 -0
  10. data/images/active/gote/kin.png +0 -0
  11. data/images/active/gote/kyosha.png +0 -0
  12. data/images/active/gote/narigin.png +0 -0
  13. data/images/active/gote/narikei.png +0 -0
  14. data/images/active/gote/narikyo.png +0 -0
  15. data/images/active/gote/ohsho.png +0 -0
  16. data/images/active/gote/ryu.png +0 -0
  17. data/images/active/gote/tokin.png +0 -0
  18. data/images/active/gote/uma.png +0 -0
  19. data/images/active/nonepiece.png +0 -0
  20. data/images/active/sente/fu.png +0 -0
  21. data/images/active/sente/gin.png +0 -0
  22. data/images/active/sente/gyoku.png +0 -0
  23. data/images/active/sente/hisha.png +0 -0
  24. data/images/active/sente/kaku.png +0 -0
  25. data/images/active/sente/keima.png +0 -0
  26. data/images/active/sente/kin.png +0 -0
  27. data/images/active/sente/kyosha.png +0 -0
  28. data/images/active/sente/narigin.png +0 -0
  29. data/images/active/sente/narikei.png +0 -0
  30. data/images/active/sente/narikyo.png +0 -0
  31. data/images/active/sente/ohsho.png +0 -0
  32. data/images/active/sente/ryu.png +0 -0
  33. data/images/active/sente/tokin.png +0 -0
  34. data/images/active/sente/uma.png +0 -0
  35. data/images/focused/gote/fu.png +0 -0
  36. data/images/focused/gote/gin.png +0 -0
  37. data/images/focused/gote/gyoku.png +0 -0
  38. data/images/focused/gote/hisha.png +0 -0
  39. data/images/focused/gote/kaku.png +0 -0
  40. data/images/focused/gote/keima.png +0 -0
  41. data/images/focused/gote/kin.png +0 -0
  42. data/images/focused/gote/kyosha.png +0 -0
  43. data/images/focused/gote/narigin.png +0 -0
  44. data/images/focused/gote/narikei.png +0 -0
  45. data/images/focused/gote/narikyo.png +0 -0
  46. data/images/focused/gote/ohsho.png +0 -0
  47. data/images/focused/gote/ryu.png +0 -0
  48. data/images/focused/gote/tokin.png +0 -0
  49. data/images/focused/gote/uma.png +0 -0
  50. data/images/focused/nonepiece.png +0 -0
  51. data/images/focused/sente/fu.png +0 -0
  52. data/images/focused/sente/gin.png +0 -0
  53. data/images/focused/sente/gyoku.png +0 -0
  54. data/images/focused/sente/hisha.png +0 -0
  55. data/images/focused/sente/kaku.png +0 -0
  56. data/images/focused/sente/keima.png +0 -0
  57. data/images/focused/sente/kin.png +0 -0
  58. data/images/focused/sente/kyosha.png +0 -0
  59. data/images/focused/sente/narigin.png +0 -0
  60. data/images/focused/sente/narikei.png +0 -0
  61. data/images/focused/sente/narikyo.png +0 -0
  62. data/images/focused/sente/ohsho.png +0 -0
  63. data/images/focused/sente/ryu.png +0 -0
  64. data/images/focused/sente/tokin.png +0 -0
  65. data/images/focused/sente/uma.png +0 -0
  66. data/lib/console_shogi/board.rb +5 -9
  67. data/lib/console_shogi/game.rb +118 -19
  68. data/lib/console_shogi/komadai.rb +11 -9
  69. data/lib/console_shogi/new_board_builder.rb +41 -41
  70. data/lib/console_shogi/piece.rb +34 -23
  71. data/lib/console_shogi/piece_movement_checker.rb +46 -0
  72. data/lib/console_shogi/piece_mover.rb +31 -48
  73. data/lib/console_shogi/piece_mover_on_komadai.rb +30 -36
  74. data/lib/console_shogi/player.rb +5 -13
  75. data/lib/console_shogi/teban.rb +8 -0
  76. data/lib/console_shogi/terminal/cursor.rb +80 -0
  77. data/lib/console_shogi/terminal/display_area.rb +30 -0
  78. data/lib/console_shogi/terminal/operator.rb +209 -0
  79. data/lib/console_shogi/version.rb +1 -1
  80. data/lib/console_shogi.rb +6 -1
  81. metadata +102 -37
  82. data/images/gote/nonepiece.png +0 -0
  83. data/lib/console_shogi/terminal_operator.rb +0 -211
  84. /data/images/{gote/shori.png → gote_shori.png} +0 -0
  85. /data/images/{gote → nomal/gote}/fu.png +0 -0
  86. /data/images/{gote → nomal/gote}/gin.png +0 -0
  87. /data/images/{gote → nomal/gote}/gyoku.png +0 -0
  88. /data/images/{gote → nomal/gote}/hisha.png +0 -0
  89. /data/images/{gote → nomal/gote}/kaku.png +0 -0
  90. /data/images/{gote → nomal/gote}/keima.png +0 -0
  91. /data/images/{gote → nomal/gote}/kin.png +0 -0
  92. /data/images/{gote → nomal/gote}/kyosha.png +0 -0
  93. /data/images/{gote → nomal/gote}/narigin.png +0 -0
  94. /data/images/{gote → nomal/gote}/narikei.png +0 -0
  95. /data/images/{gote → nomal/gote}/narikyo.png +0 -0
  96. /data/images/{gote → nomal/gote}/ohsho.png +0 -0
  97. /data/images/{gote → nomal/gote}/ryu.png +0 -0
  98. /data/images/{gote → nomal/gote}/tokin.png +0 -0
  99. /data/images/{gote → nomal/gote}/uma.png +0 -0
  100. /data/images/{sente → nomal}/nonepiece.png +0 -0
  101. /data/images/{sente → nomal/sente}/fu.png +0 -0
  102. /data/images/{sente → nomal/sente}/gin.png +0 -0
  103. /data/images/{sente → nomal/sente}/gyoku.png +0 -0
  104. /data/images/{sente → nomal/sente}/hisha.png +0 -0
  105. /data/images/{sente → nomal/sente}/kaku.png +0 -0
  106. /data/images/{sente → nomal/sente}/keima.png +0 -0
  107. /data/images/{sente → nomal/sente}/kin.png +0 -0
  108. /data/images/{sente → nomal/sente}/kyosha.png +0 -0
  109. /data/images/{sente → nomal/sente}/narigin.png +0 -0
  110. /data/images/{sente → nomal/sente}/narikei.png +0 -0
  111. /data/images/{sente → nomal/sente}/narikyo.png +0 -0
  112. /data/images/{sente → nomal/sente}/ohsho.png +0 -0
  113. /data/images/{sente → nomal/sente}/ryu.png +0 -0
  114. /data/images/{sente → nomal/sente}/tokin.png +0 -0
  115. /data/images/{sente → nomal/sente}/uma.png +0 -0
  116. /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: 44d942e8d1dbffb2bfae8c29d4154ea7b148484eaaa976d38e51a7c20779ea2a
4
- data.tar.gz: 0c6fb8f9f65961284023eb6b5312a0df1240b1c3af0b3aa4d8de08e5640dbeea
3
+ metadata.gz: add4a4e51f593521d761a1afe000dfe184f8effe9d4f41d4822807465036a3cb
4
+ data.tar.gz: dbde9af4607ec797e9bdbea94d1a7ef64d7eb0cdbfbca8c9d5c601696e1f0785
5
5
  SHA512:
6
- metadata.gz: a1c70713c4b868e5308f3643128b8a34579956cb5ba7aadf0170ed3142f2416efa40a4a69bb7f3939324a133c348a578a3c26a77ded659f59d6133cbe653a4a3
7
- data.tar.gz: 95c8b78de329d1e66ec81f3c25a2efe281ad89733027b778d00c5b7ac59d726229634d2e5ca083d8783d7827700a70858abc2fec506000912cd2548f5ffb7079
6
+ metadata.gz: 85e7e5b136cfda4c6a31fa6e1cb9b380b0adfb3162b2f9c2ae154d831a1ee3e7302275c8e94f2da2ce7a2c6695280eedf26fb4df2f0a24b9775b606030d2d0a5
7
+ data.tar.gz: 5ea91665e1498809b9b59cc282e2ea22ac7c8dbd1ed2b5770f02bd29afbc18cb08c0ab074ef2a8a5b8aaa4e006513ced0f62a4f9b67bff31866a341b46d810b6
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- console-shogi (0.1.0)
4
+ console-shogi (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
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
@@ -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
- from_piece = @pieces[from[:y], from[:x]]
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
@@ -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: Player::Teban::SENTE)
9
- @gote_player = Player.new(teban: Player::Teban::GOTE)
10
- @board = NewBoardBuilder.build(sente_player: @sente_player, gote_player: @gote_player)
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
- TerminalOperator.print_board(board: board, sente_komadai: sente_player.komadai, gote_komadai: gote_player.komadai)
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
- TerminalOperator.move_cursor(key)
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
- index = TerminalOperator.squares_index
29
-
30
- case index[:location]
31
- when :board
32
- PieceMover.new(board: board, from: index).move!
33
- when :sente_komadai
34
- PieceMoverOnKomadai.new(board: board, komadai: sente_player.komadai, from: index).drop!
35
- when :gote_komadai
36
- PieceMoverOnKomadai.new(board: board, komadai: gote_player.komadai, from: index).drop!
37
- end
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
- # TODO 描写に時間がかかるので、差分のみ表示できる様にする
40
- TerminalOperator.print_board(board: board, sente_komadai: sente_player.komadai, gote_komadai: gote_player.komadai)
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
- TerminalOperator.print_winner(player.teban)
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
- raise NoSpaceError if index.nil?
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(sente_player: , gote_player:)
6
+ def build
7
7
  Board.new(
8
8
  pieces: [
9
9
  [
10
- Kyosha.new(player: gote_player),
11
- Keima.new(player: gote_player),
12
- Gin.new(player: gote_player),
13
- Kin.new(player: gote_player),
14
- Ohsho.new(player: gote_player),
15
- Kin.new(player: gote_player),
16
- Gin.new(player: gote_player),
17
- Keima.new(player: gote_player),
18
- Kyosha.new(player: gote_player)
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(player: gote_player),
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(player: gote_player),
28
+ Kaku.new(teban: Teban::GOTE),
29
29
  NonePiece.new
30
30
  ],
31
31
  [
32
- Fu.new(player: gote_player),
33
- Fu.new(player: gote_player),
34
- Fu.new(player: gote_player),
35
- Fu.new(player: gote_player),
36
- Fu.new(player: gote_player),
37
- Fu.new(player: gote_player),
38
- Fu.new(player: gote_player),
39
- Fu.new(player: gote_player),
40
- Fu.new(player: gote_player)
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(player: sente_player),
77
- Fu.new(player: sente_player),
78
- Fu.new(player: sente_player),
79
- Fu.new(player: sente_player),
80
- Fu.new(player: sente_player),
81
- Fu.new(player: sente_player),
82
- Fu.new(player: sente_player),
83
- Fu.new(player: sente_player),
84
- Fu.new(player: sente_player)
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(player: sente_player),
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(player: sente_player),
94
+ Hisha.new(teban: Teban::SENTE),
95
95
  NonePiece.new
96
96
  ],
97
97
  [
98
- Kyosha.new(player: sente_player),
99
- Keima.new(player: sente_player),
100
- Gin.new(player: sente_player),
101
- Kin.new(player: sente_player),
102
- Ohsho.new(player: sente_player),
103
- Kin.new(player: sente_player),
104
- Gin.new(player: sente_player),
105
- Keima.new(player: sente_player),
106
- Kyosha.new(player: sente_player)
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
  )