1 # Copyright (c) 2009 Paolo Capriotti <p.capriotti@gmail.com>
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
8 require 'games/state_base'
10 require_bundle 'shogi', 'type'
13 class State < StateBase
14 def initialize(board, pool_factory, move_factory, piece_factory)
15 super(board, move_factory, piece_factory)
16 @pools = to_enum(:each_color).inject({}) do |res, c|
17 res[c] = pool_factory.new
23 def initialize_copy(other)
25 @pools = to_enum(:each_color).inject({}) do |res, c|
26 res[c] = other.pool(c).dup
37 (0...@board.size.x).each do |i|
38 @board[Point.new(i, row(2, color))] = piece_factory.new(color, :pawn)
42 set_piece = lambda do |x, type|
43 @board[Point.new(x, r)] = piece_factory.new(color, type)
56 @board[Point.new(r, r)] = piece_factory.new(color, :rook)
57 @board[Point.new(@board.size.x - r - 1, r)] = piece_factory.new(color, :bishop)
67 color == :black ? @board.size.y - 1 - i : i
71 color == :black ? i : @board.size.x - 1 - i
74 def opposite_color(color)
75 color == :black ? :white : :black
79 Point.new(0, color == :black ? -1 : 1)
84 pool(turn).remove(move.dropped)
85 board[move.dst] = move.dropped
87 captured = basic_move(move)
89 board[move.dst] = promoted(board[move.dst])
93 piece = piece_factory.new(turn,
94 Promoted.demote(captured.type))
102 @turn = opposite_color(@turn)
105 def in_promotion_zone?(p, color)
106 (row(6, color) <=> p.y) != (color == :black ? -1 : 1)
109 def capture_square(move)
116 Promoted.promote(piece.type))
122 class State < Shogi::State
125 each_color do |color|
128 set_piece = lambda do |x, type|
129 @board[Point.new(x, r)] = piece_factory.new(color, type)
131 set_piece[col(0,color), :king]
132 set_piece[col(1,color), :gold]
133 set_piece[col(2,color), :silver]
134 set_piece[col(3,color), :bishop]
135 set_piece[col(4,color), :rook]
138 set_piece[col(0,color), :pawn]
142 def in_promotion_zone?(p, color)
143 (row(4, color) <=> p.y) != (color == :black ? -1 : 1)