Point#promotable? メソッドの中身を Position::Vpos#promotable? に移動
5x5の盤面対応
Positionのリファクタリング
盤上の駒の全手筋関連のリファクタリング

diff --git a/README.org b/README.org
index b2182bc..172a725 100644
--- a/README.org
+++ b/README.org
@@ -490,6 +490,7 @@

 ** _TODO_

+   - BUG: player._generate_way.soldiers_ways.should == ["1一と成(12)", "3一圭成(23)", "1一圭成(23)"]
    - BUG: ▽6八金不成 ← 金の不成なんてない
    - ▽1八杏成 ではなく 香成
    - +「２三銀直不成」対応+
diff --git a/lib/bushido/board.rb b/lib/bushido/board.rb
index 883823f..d1853f5 100644
--- a/lib/bushido/board.rb
+++ b/lib/bushido/board.rb
@@ -8,6 +8,28 @@ module Bushido
   class Board
     attr_reader :surface

+    # 一時的に盤面のサイズを変更する(テスト用)
+    #
+    #   before do
+    #     @size_save = Board.size_change([3, 5])
+    #   end
+    #   after do
+    #     Board.size_change(@size_save)
+    #   end
+    #
+    def self.size_change(size, &block)
+      size_save = [Position::Hpos.ridge_length, Position::Vpos.ridge_length]
+      Position::Hpos.ridge_length, Position::Vpos.ridge_length = size
+      if block_given?
+        begin
+          yield
+        ensure
+          Position::Hpos.ridge_length, Position::Vpos.ridge_length = size_save
+        end
+      end
+      size_save
+    end
+
     def initialize
       @surface = {}
     end
@@ -39,6 +61,8 @@ module Bushido
       # soldier.double_pawn_validation(self, point)

       @surface[point.to_xy] = soldier
+
+      # ↓これが書き込む前にわからないとだめ
       if soldier.moveable_points(:board_object_collision_skip => true, :point => point).empty?
         # soldier.point = save_point
         # @surface[point.to_xy] = soldier
diff --git a/lib/bushido/piece.rb b/lib/bushido/piece.rb
index efee80d..a07f348 100644
--- a/lib/bushido/piece.rb
+++ b/lib/bushido/piece.rb
@@ -15,14 +15,17 @@ module Bushido
       [:pawn, :bishop, :rook, :lance, :knight, :silver, :gold, :king].collect{|key|create(key)}
     end

+    # Piece["歩"].name # => "歩"
     def [](arg)
       get(arg)
     end

+    # Piece.get("歩").name # => "歩"
     def get(arg)
       basic_get(arg) || promoted_get(arg)
     end

+    # Piece.get!("歩").name # => "歩"
     def get!(arg)
       get(arg) or raise PieceNotFound, "#{arg.inspect} に対応する駒がありません"
     end
diff --git a/lib/bushido/player.rb b/lib/bushido/player.rb
index b22a893..1f79461 100644
--- a/lib/bushido/player.rb
+++ b/lib/bushido/player.rb
@@ -2,17 +2,29 @@

 module Bushido
   class Player
+    # FIXME: deal と pieces がかぶっている
     def self.basic_test(params = {})
       params = {
         :player => :black,
       }.merge(params)
       player = Player.create2(params[:player], Board.new)
+
+      # 最初にくばるオプション
       player.deal(params[:deal])
+
       player.initial_put_on(params[:init])
       if params[:piece_plot]
         player.piece_plot
       end
+
       Array.wrap(params[:exec]).each{|v|player.execute(v)}
+
+      # あとでくばる(というかセットする)
+      if params[:pieces]
+        player.piece_discard
+        player.deal(params[:pieces])
+      end
+
       player
     end

@@ -239,6 +251,10 @@ module Bushido
       end
     end

+    def inspect
+      [("-" * 40), super, board_with_pieces, ("-" * 40)].join("\n")
+    end
+
     # 盤面と持駒(表示用)
     def board_with_pieces
       s = ""
@@ -679,19 +695,24 @@ module Bushido
       list = []

       blank_points = @player.board.blank_points
+
       blank_points.each do |point|
+        # p [point, @player.pieces]
         @player.pieces.each do |piece|
           # 二歩のチェックが難しいのであとで
           str = [point.name, piece.name, "打"].join
+          # p str
           begin
             # 打てるかテスト
             @player.safe_put_on(str)
-          rescue Bushido::NotPutInPlaceNotBeMoved => error
-            # 行き止まりだった
-          rescue Bushido::DoublePawn => error
-            p error
+          # rescue Bushido::NotPutInPlaceNotBeMoved => error
+          #   # 行き止まりだった
+          # rescue Bushido::DoublePawn => error
+          rescue => error
+            # p error
             # 二歩じゃん
           else
+            # p str
             list << str
           end
         end
diff --git a/spec/player_spec.rb b/spec/player_spec.rb
index 440efde..8225061 100644
--- a/spec/player_spec.rb
+++ b/spec/player_spec.rb
@@ -430,14 +430,27 @@ EOT
     end

     context "GenerateWay" do
-      it "盤上の駒の全手筋" do
-        player = Player.basic_test(:piece_plot => true)
-        # player._generate_way.soldiers_ways.should == ["9六歩(97)", "8六歩(87)", "7六歩(77)", "6六歩(67)", "5六歩(57)", "4六歩(47)", "3六歩(37)", "2六歩(27)", "1六歩(17)", "3八飛(28)", "4八飛(28)", "5八飛(28)", "6八飛(28)", "7八飛(28)", "1八飛(28)", "9八香(99)", "7八銀(79)", "6八銀(79)", "7八金(69)", "6八金(69)", "5八金(69)", "6八玉(59)", "5八玉(59)", "4八玉(59)", "5八金(49)", "4八金(49)", "3八金(49)", "4八銀(39)", "3八銀(39)", "1八香(19)"]
+      before do
+        @save_size = Board.size_change([3, 3])
       end
-      it "持駒の全手筋" do
-        player = Player.basic_test
-        # player._generate_way.pieces_ways.should == ["9一角打", "9一銀打", "9一金打", "9一玉打", "9一銀打", "9一玉打", "9一銀打", "9一銀打", "8一飛打", "8一金打", "8一金打", "8一玉打", "8一銀打", "8一金打", "8一金打", "8一銀打", "8一金打", "8一金打", "7一飛打", "7一玉打", "7一銀打", "7一金打", "7一玉打", "7一金打", "7一玉打", "7一玉打", "6一角打", "6一銀打", "6一玉打", "6一銀打", "6一玉打", "6一銀打", "6一銀打", "5一飛打", "5一金打", "5一玉打", "5一銀打", "5一金打", "5一銀打", "4一角打", "4一飛打", "4一銀打", "4一銀打", "4一飛打", "4一銀打", "4一銀打", "4一銀打", "3一金打", "3一玉打", "3一角打", "3一銀打", "3一玉打", "3一銀打", "2一金打", "2一銀打", "2一銀打", "2一銀打", "2一銀打", "2一銀打", "1一飛打", "1一角打", "1一銀打", "1一角打", "1一銀打", "9二金打", "9二金打", "9二飛打", "9二銀打", "9二銀打", "9二金打", "9二銀打", "9二銀打", "9二銀打", "8二玉打", "8二香打", "8二金打", "8二銀打", "8二香打", "8二銀打", "7二角打", "7二金打", "7二香打", "7二銀打", "7二銀打", "7二金打", "7二銀打", "7二銀打", "7二銀打", "6二飛打", "6二香打", "6二金打", "6二銀打", "6二香打", "6二銀打", "5二玉打", "5二金打", "5二香打", "5二銀打", "5二銀打", "5二金打", "5二銀打", "5二銀打", "5二銀打", "4二角打", "4二香打", "4二金打", "4二銀打", "4二香打", "4二銀打", "3二飛打", "3二金打", "3二香打", "3二銀打", "3二銀打", "3二金打", "3二銀打", "3二銀打", "3二銀打", "2二玉打", "2二香打", "2二金打", "2二銀打", "2二香打", "2二銀打", "1二角打", "1二金打", "1二香打", "1二銀打", "1二銀打", "1二金打", "1二銀打", "1二銀打", "1二銀打", "9三飛打", "9三香打", "9三金打", "9三桂打", "9三桂打", "9三銀打", "9三香打", "9三桂打", "9三銀打", "9三桂打", "9三桂打", "8三玉打", "8三金打", "8三香打", "8三銀打", "8三銀打", "8三桂打", "8三金打", "8三銀打", "8三桂打", "8三銀打", "8三銀打", "7三角打", "7三香打", "7三金打", "7三桂打", "7三桂打", "7三銀打", "7三香打", "7三桂打", "7三銀打", "7三桂打", "7三桂打", "6三飛打", "6三金打", "6三香打", "6三銀打", "6三銀打", "6三桂打", "6三金打", "6三銀打", "6三桂打", "6三銀打", "6三銀打", "5三玉打", "5三香打", "5三金打", "5三桂打", "5三桂打", "5三銀打", "5三香打", "5三桂打", "5三銀打", "5三桂打", "5三桂打", "4三角打", "4三金打", "4三香打", "4三銀打", "4三銀打", "4三桂打", "4三金打", "4三銀打", "4三桂打", "4三銀打", "4三銀打", "3三飛打", "3三香打", "3三金打", "3三桂打", "3三桂打", "3三銀打", "3三香打", "3三桂打", "3三銀打", "3三桂打", "3三桂打", "2三玉打", "2三金打", "2三香打", "2三銀打", "2三銀打", "2三桂打", "2三金打", "2三銀打", "2三桂打", "2三銀打", "2三銀打", "1三角打", "1三香打", "1三金打", "1三桂打", "1三桂打", "1三銀打", "1三香打", "1三桂打", "1三銀打", "1三桂打", "1三桂打", "9四飛打", "9四金打", "9四香打", "9四銀打", "9四銀打", "9四桂打", "9四金打", "9四銀打", "9四桂打", "9四銀打", "9四銀打", "8四玉打", "8四香打", "8四金打", "8四桂打", "8四桂打", "8四銀打", "8四香打", "8四桂打", "8四銀打", "8四桂打", "8四桂打", "7四角打", "7四金打", "7四香打", "7四銀打", "7四銀打", "7四桂打", "7四金打", "7四銀打", "7四桂打", "7四銀打", "7四銀打", "6四飛打", "6四香打", "6四金打", "6四桂打", "6四桂打", "6四銀打", "6四香打", "6四桂打", "6四銀打", "6四桂打", "6四桂打", "5四玉打", "5四金打", "5四香打", "5四銀打", "5四銀打", "5四桂打", "5四金打", "5四銀打", "5四桂打", "5四銀打", "5四銀打", "4四角打", "4四香打", "4四金打", "4四桂打", "4四桂打", "4四銀打", "4四香打", "4四桂打", "4四銀打", "4四桂打", "4四桂打", "3四飛打", "3四金打", "3四香打", "3四銀打", "3四銀打", "3四桂打", "3四金打", "3四銀打", "3四桂打", "3四銀打", "3四銀打", "2四玉打", "2四香打", "2四金打", "2四桂打", "2四桂打", "2四銀打", "2四香打", "2四桂打", "2四銀打", "2四桂打", "2四桂打", "1四角打", "1四金打", "1四香打", "1四銀打", "1四銀打", "1四桂打", "1四金打", "1四銀打", "1四桂打", "1四銀打", "1四銀打", "9五飛打", "9五香打", "9五金打", "9五桂打", "9五桂打", "9五銀打", "9五香打", "9五桂打", "9五銀打", "9五桂打", "9五桂打", "8五玉打", "8五金打", "8五香打", "8五銀打", "8五銀打", "8五桂打", "8五金打", "8五銀打", "8五桂打", "8五銀打", "8五銀打", "7五角打", "7五香打", "7五金打", "7五桂打", "7五桂打", "7五銀打", "7五香打", "7五桂打", "7五銀打", "7五桂打", "7五桂打", "6五飛打", "6五金打", "6五香打", "6五銀打", "6五銀打", "6五桂打", "6五金打", "6五銀打", "6五桂打", "6五銀打", "6五銀打", "5五玉打", "5五香打", "5五金打", "5五桂打", "5五桂打", "5五銀打", "5五香打", "5五桂打", "5五銀打", "5五桂打", "5五桂打", "4五角打", "4五金打", "4五香打", "4五銀打", "4五銀打", "4五桂打", "4五金打", "4五銀打", "4五桂打", "4五銀打", "4五銀打", "3五飛打", "3五香打", "3五金打", "3五桂打", "3五桂打", "3五銀打", "3五香打", "3五桂打", "3五銀打", "3五桂打", "3五桂打", "2五玉打", "2五金打", "2五香打", "2五銀打", "2五銀打", "2五桂打", "2五金打", "2五銀打", "2五桂打", "2五銀打", "2五銀打", "1五角打", "1五香打", "1五金打", "1五桂打", "1五桂打", "1五銀打", "1五香打", "1五桂打", "1五銀打", "1五桂打", "1五桂打", "9六飛打", "9六金打", "9六香打", "9六銀打", "9六銀打", "9六桂打", "9六金打", "9六銀打", "9六桂打", "9六銀打", "9六銀打", "8六玉打", "8六香打", "8六金打", "8六桂打", "8六桂打", "8六銀打", "8六香打", "8六桂打", "8六銀打", "8六桂打", "8六桂打", "7六角打", "7六金打", "7六香打", "7六銀打", "7六銀打", "7六桂打", "7六金打", "7六銀打", "7六桂打", "7六銀打", "7六銀打", "6六飛打", "6六香打", "6六金打", "6六桂打", "6六桂打", "6六銀打", "6六香打", "6六桂打", "6六銀打", "6六桂打", "6六桂打", "5六玉打", "5六金打", "5六香打", "5六銀打", "5六銀打", "5六桂打", "5六金打", "5六銀打", "5六桂打", "5六銀打", "5六銀打", "4六角打", "4六香打", "4六金打", "4六桂打", "4六桂打", "4六銀打", "4六香打", "4六桂打", "4六銀打", "4六桂打", "4六桂打", "3六飛打", "3六金打", "3六香打", "3六銀打", "3六銀打", "3六桂打", "3六金打", "3六銀打", "3六桂打", "3六銀打", "3六銀打", "2六玉打", "2六香打", "2六金打", "2六桂打", "2六桂打", "2六銀打", "2六香打", "2六桂打", "2六銀打", "2六桂打", "2六桂打", "1六角打", "1六金打", "1六香打", "1六銀打", "1六銀打", "1六桂打", "1六金打", "1六銀打", "1六桂打", "1六銀打", "1六銀打", "9七飛打", "9七香打", "9七金打", "9七桂打", "9七桂打", "9七銀打", "9七香打", "9七桂打", "9七銀打", "9七桂打", "9七桂打", "8七玉打", "8七金打", "8七香打", "8七銀打", "8七銀打", "8七桂打", "8七金打", "8七銀打", "8七桂打", "8七銀打", "8七銀打", "7七角打", "7七香打", "7七金打", "7七桂打", "7七桂打", "7七銀打", "7七香打", "7七桂打", "7七銀打", "7七桂打", "7七桂打", "6七飛打", "6七金打", "6七香打", "6七銀打", "6七銀打", "6七桂打", "6七金打", "6七銀打", "6七桂打", "6七銀打", "6七銀打", "5七玉打", "5七香打", "5七金打", "5七桂打", "5七桂打", "5七銀打", "5七香打", "5七桂打", "5七銀打", "5七桂打", "5七桂打", "4七角打", "4七金打", "4七香打", "4七銀打", "4七銀打", "4七桂打", "4七金打", "4七銀打", "4七桂打", "4七銀打", "4七銀打", "3七飛打", "3七香打", "3七金打", "3七桂打", "3七桂打", "3七銀打", "3七香打", "3七桂打", "3七銀打", "3七桂打", "3七桂打", "2七玉打", "2七金打", "2七香打", "2七銀打", "2七銀打", "2七桂打", "2七金打", "2七銀打", "2七桂打", "2七銀打", "2七銀打", "1七角打", "1七香打", "1七金打", "1七桂打", "1七桂打", "1七銀打", "1七香打", "1七桂打", "1七銀打", "1七桂打", "1七桂打", "9八飛打", "9八金打", "9八香打", "9八銀打", "9八銀打", "9八桂打", "9八金打", "9八銀打", "9八桂打", "9八銀打", "9八銀打", "8八玉打", "8八香打", "8八金打", "8八桂打", "8八桂打", "8八銀打", "8八香打", "8八桂打", "8八銀打", "8八桂打", "8八桂打", "7八角打", "7八金打", "7八香打", "7八銀打", "7八銀打", "7八桂打", "7八金打", "7八銀打", "7八桂打", "7八銀打", "7八銀打", "6八飛打", "6八香打", "6八金打", "6八桂打", "6八桂打", "6八銀打", "6八香打", "6八桂打", "6八銀打", "6八桂打", "6八桂打", "5八玉打", "5八金打", "5八香打", "5八銀打", "5八銀打", "5八桂打", "5八金打", "5八銀打", "5八桂打", "5八銀打", "5八銀打", "4八角打", "4八香打", "4八金打", "4八桂打", "4八桂打", "4八銀打", "4八香打", "4八桂打", "4八銀打", "4八桂打", "4八桂打", "3八飛打", "3八金打", "3八香打", "3八銀打", "3八銀打", "3八桂打", "3八金打", "3八銀打", "3八桂打", "3八銀打", "3八銀打", "2八玉打", "2八香打", "2八金打", "2八桂打", "2八桂打", "2八銀打", "2八香打", "2八桂打", "2八銀打", "2八桂打", "2八桂打", "1八角打", "1八金打", "1八香打", "1八銀打", "1八銀打", "1八桂打", "1八金打", "1八銀打", "1八桂打", "1八銀打", "1八銀打", "9九飛打", "9九香打", "9九金打", "9九桂打", "9九桂打", "9九銀打", "9九香打", "9九桂打", "9九銀打", "9九桂打", "9九桂打", "8九玉打", "8九金打", "8九香打", "8九銀打", "8九銀打", "8九桂打", "8九金打", "8九銀打", "8九桂打", "8九銀打", "8九銀打", "7九角打", "7九香打", "7九金打", "7九桂打", "7九桂打", "7九銀打", "7九香打", "7九桂打", "7九銀打", "7九桂打", "7九桂打", "6九飛打", "6九金打", "6九香打", "6九銀打", "6九銀打", "6九桂打", "6九金打", "6九銀打", "6九桂打", "6九銀打", "6九銀打", "5九玉打", "5九香打", "5九金打", "5九桂打", "5九桂打", "5九銀打", "5九香打", "5九桂打", "5九銀打", "5九桂打", "5九桂打", "4九角打", "4九金打", "4九香打", "4九銀打", "4九銀打", "4九桂打", "4九金打", "4九銀打", "4九桂打", "4九銀打", "4九銀打", "3九飛打", "3九香打", "3九金打", "3九桂打", "3九桂打", "3九銀打", "3九香打", "3九桂打", "3九銀打", "3九桂打", "3九桂打", "2九玉打", "2九金打", "2九香打", "2九銀打", "2九銀打", "2九桂打", "2九金打", "2九銀打", "2九桂打", "2九銀打", "2九銀打", "1九角打", "1九香打", "1九金打", "1九桂打", "1九桂打", "1九銀打", "1九香打", "1九桂打", "1九銀打", "1九桂打", "1九桂打"]
+
+      after do
+        if @save_size
+          Board.size_change(@save_size)
+        end
       end
+
+      it "盤上の駒の全手筋" do
+        player = Player.basic_test(:init => ["1二歩", "2三桂"])
+        player._generate_way.soldiers_ways.should == ["1一と成(12)", "3一圭成(23)", "1一圭成(23)"]
+      end
+
+      # it "持駒の全手筋" do
+      #   @save_size = Board.size_change([3, 3])
+      #   player = Player.basic_test(:pieces => "歩")
+      #   # p player
+      #   player._generate_way.pieces_ways
+      # end
     end

     context "一時的に置いてみた状態にする" do