+ def initialize
+ @sente_hands = Array::new
+ @gote_hands = Array::new
+ @array = [[], [], [], [], [], [], [], [], [], []]
+ end
+ attr_accessor :array, :sente_hands, :gote_hands
+
+ def initial
+ @array[1][1] = Piece::new("KY", false)
+ @array[2][1] = Piece::new("KE", false)
+ @array[3][1] = Piece::new("GI", false)
+ @array[4][1] = Piece::new("KI", false)
+ @array[5][1] = Piece::new("OU", false)
+ @array[6][1] = Piece::new("KI", false)
+ @array[7][1] = Piece::new("GI", false)
+ @array[8][1] = Piece::new("KE", false)
+ @array[9][1] = Piece::new("KY", false)
+ @array[2][2] = Piece::new("KA", false)
+ @array[8][2] = Piece::new("HI", false)
+ @array[1][3] = Piece::new("FU", false)
+ @array[2][3] = Piece::new("FU", false)
+ @array[3][3] = Piece::new("FU", false)
+ @array[4][3] = Piece::new("FU", false)
+ @array[5][3] = Piece::new("FU", false)
+ @array[6][3] = Piece::new("FU", false)
+ @array[7][3] = Piece::new("FU", false)
+ @array[8][3] = Piece::new("FU", false)
+ @array[9][3] = Piece::new("FU", false)
+
+ @array[1][9] = Piece::new("KY", true)
+ @array[2][9] = Piece::new("KE", true)
+ @array[3][9] = Piece::new("GI", true)
+ @array[4][9] = Piece::new("KI", true)
+ @array[5][9] = Piece::new("OU", true)
+ @array[6][9] = Piece::new("KI", true)
+ @array[7][9] = Piece::new("GI", true)
+ @array[8][9] = Piece::new("KE", true)
+ @array[9][9] = Piece::new("KY", true)
+ @array[2][8] = Piece::new("HI", true)
+ @array[8][8] = Piece::new("KA", true)
+ @array[1][7] = Piece::new("FU", true)
+ @array[2][7] = Piece::new("FU", true)
+ @array[3][7] = Piece::new("FU", true)
+ @array[4][7] = Piece::new("FU", true)
+ @array[5][7] = Piece::new("FU", true)
+ @array[6][7] = Piece::new("FU", true)
+ @array[7][7] = Piece::new("FU", true)
+ @array[8][7] = Piece::new("FU", true)
+ @array[9][7] = Piece::new("FU", true)
+ end
+
+ def get_piece_from_hands(hands, name)
+ p = hands.find { |i|
+ i.name == name
+ }
+ if (p)
+ hands.delete(p)
+ end
+ return p
+ end
+
+ def handle_one_move(str)
+ if (str =~ /^([\+\-])(\d)(\d)(\d)(\d)([A-Z]{2})/)
+ p = $1
+ x0 = $2.to_i
+ y0 = $3.to_i
+ x1 = $4.to_i
+ y1 = $5.to_i
+ name = $6
+ elsif (str =~ /^%/)
+ return true
+ else
+ return false # illegal move
+ end
+ if (p == "+")
+ sente = true
+ hands = @sente_hands
+ else
+ sente = false
+ hands = @gote_hands
+ end
+ if (@array[x1][y1])
+ if (@array[x1][y1] == sente) # this is mine
+ return false
+ end
+ hands.push(@array[x1][y1])
+ @array[x1][y1] = nil
+ end
+ if ((x0 == 0) && (y0 == 0))
+ p = get_piece_from_hands(hands, name)
+ return false if (! p) # i don't have this one
+ @array[x1][y1] = p
+ p.sente = sente
+ p.promoted = false
+ else
+ @array[x1][y1] = @array[x0][y0]
+ @array[x0][y0] = nil
+ if (@array[x1][y1].name != name) # promoted ?
+ return false if (@array[x1][y1].promoted_name != name) # can't promote
+ @array[x1][y1].promoted = true
+ end
+ end
+ return true # legal move
+ end
+
+ def to_s
+ a = Array::new
+ y = 1
+ while (y <= 9)
+ a.push(sprintf("P%d", y))
+ x = 9
+ while (x >= 1)
+ piece = @array[x][y]
+ if (piece)
+ s = piece.to_s
+ else
+ s = " * "
+ end
+ a.push(s)
+ x = x - 1
+ end
+ a.push(sprintf("\n"))
+ y = y + 1
+ end
+ if (! sente_hands.empty?)
+ a.push("P+")
+ sente_hands.each do |p|
+ a.push("00" + p.name)
+ end
+ a.push("\n")
+ end
+ if (! gote_hands.empty?)
+ a.push("P-")
+ gote_hands.each do |p|
+ a.push("00" + p.name)
+ end
+ a.push("\n")
+ end
+ return a.join
+ end