+class PieceKY < Piece
+ def initialize(*arg)
+ @point = 1
+ @normal_moves = []
+ @promoted_moves = [[0, +1], [+1, +1], [-1, +1], [+1, +0], [-1, +0], [0, -1]]
+ @name = "KY"
+ @promoted_name = "NY"
+ super
+ end
+ def room_of_head?(x, y, name)
+ if (name == "KY")
+ if (@sente)
+ return false if (y == 1)
+ else
+ return false if (y == 9)
+ end
+ end
+ return true
+ end
+ def far_movable_grids
+ grids = Array::new
+ if (@promoted)
+ return []
+ else
+ if (@sente) # up
+ cand_x = @x
+ cand_y = @y - 1
+ while (jump_to?(cand_x, cand_y))
+ grids.push([cand_x, cand_y])
+ break if (! put_to?(cand_x, cand_y))
+ cand_y = cand_y - 1
+ end
+ else # down
+ cand_x = @x
+ cand_y = @y + 1
+ while (jump_to?(cand_x, cand_y))
+ grids.push([cand_x, cand_y])
+ break if (! put_to?(cand_x, cand_y))
+ cand_y = cand_y + 1
+ end
+ end
+ return grids
+ end
+ end
+end
+class PieceKE < Piece
+ def initialize(*arg)
+ @point = 1
+ @normal_moves = [[+1, +2], [-1, +2]]
+ @promoted_moves = [[0, +1], [+1, +1], [-1, +1], [+1, +0], [-1, +0], [0, -1]]
+ @name = "KE"
+ @promoted_name = "NK"
+ super
+ end
+ def room_of_head?(x, y, name)
+ if (name == "KE")
+ if (@sente)
+ return false if ((y == 1) || (y == 2))
+ else
+ return false if ((y == 9) || (y == 8))
+ end
+ end
+ return true
+ end
+end
+class PieceGI < Piece
+ def initialize(*arg)
+ @point = 1
+ @normal_moves = [[0, +1], [+1, +1], [-1, +1], [+1, -1], [-1, -1]]
+ @promoted_moves = [[0, +1], [+1, +1], [-1, +1], [+1, +0], [-1, +0], [0, -1]]
+ @name = "GI"
+ @promoted_name = "NG"
+ super
+ end
+end
+class PieceKI < Piece
+ def initialize(*arg)
+ @point = 1
+ @normal_moves = [[0, +1], [+1, +1], [-1, +1], [+1, +0], [-1, +0], [0, -1]]
+ @promoted_moves = []
+ @name = "KI"
+ @promoted_name = nil
+ super
+ end
+end
+class PieceKA < Piece
+ def initialize(*arg)
+ @point = 5
+ @normal_moves = []
+ @promoted_moves = [[0, +1], [+1, 0], [-1, 0], [0, -1]]
+ @name = "KA"
+ @promoted_name = "UM"
+ super
+ end
+ def far_movable_grids
+ grids = Array::new
+ ## up right
+ cand_x = @x - 1
+ cand_y = @y - 1
+ while (jump_to?(cand_x, cand_y))
+ grids.push([cand_x, cand_y])
+ break if (! put_to?(cand_x, cand_y))
+ cand_x = cand_x - 1
+ cand_y = cand_y - 1
+ end
+ ## down right
+ cand_x = @x - 1
+ cand_y = @y + 1
+ while (jump_to?(cand_x, cand_y))
+ grids.push([cand_x, cand_y])
+ break if (! put_to?(cand_x, cand_y))
+ cand_x = cand_x - 1
+ cand_y = cand_y + 1
+ end
+ ## up left
+ cand_x = @x + 1
+ cand_y = @y - 1
+ while (jump_to?(cand_x, cand_y))
+ grids.push([cand_x, cand_y])
+ break if (! put_to?(cand_x, cand_y))
+ cand_x = cand_x + 1
+ cand_y = cand_y - 1
+ end
+ ## down left
+ cand_x = @x + 1
+ cand_y = @y + 1
+ while (jump_to?(cand_x, cand_y))
+ grids.push([cand_x, cand_y])
+ break if (! put_to?(cand_x, cand_y))
+ cand_x = cand_x + 1
+ cand_y = cand_y + 1
+ end
+ return grids
+ end
+end
+class PieceHI < Piece
+ def initialize(*arg)
+ @point = 5
+ @normal_moves = []
+ @promoted_moves = [[+1, +1], [-1, +1], [+1, -1], [-1, -1]]
+ @name = "HI"
+ @promoted_name = "RY"
+ super
+ end
+ def far_movable_grids
+ grids = Array::new
+ ## up
+ cand_x = @x
+ cand_y = @y - 1
+ while (jump_to?(cand_x, cand_y))
+ grids.push([cand_x, cand_y])
+ break if (! put_to?(cand_x, cand_y))
+ cand_y = cand_y - 1
+ end
+ ## down
+ cand_x = @x
+ cand_y = @y + 1
+ while (jump_to?(cand_x, cand_y))
+ grids.push([cand_x, cand_y])
+ break if (! put_to?(cand_x, cand_y))
+ cand_y = cand_y + 1
+ end
+ ## right
+ cand_x = @x - 1
+ cand_y = @y
+ while (jump_to?(cand_x, cand_y))
+ grids.push([cand_x, cand_y])
+ break if (! put_to?(cand_x, cand_y))
+ cand_x = cand_x - 1
+ end
+ ## down
+ cand_x = @x + 1
+ cand_y = @y
+ while (jump_to?(cand_x, cand_y))
+ grids.push([cand_x, cand_y])
+ break if (! put_to?(cand_x, cand_y))
+ cand_x = cand_x + 1
+ end
+ return grids
+ end
+end
+class PieceOU < Piece
+ def initialize(*arg)
+ @point = 0
+ @normal_moves = [[0, +1], [+1, +1], [-1, +1], [+1, +0], [-1, +0], [0, -1], [+1, -1], [-1, -1]]
+ @promoted_moves = []
+ @name = "OU"
+ @promoted_name = nil
+ super
+ end
+end