-class Board
- 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 =~ /^%KACHI/)
- return "kachi"
- elsif (str =~ /^%TORYO/)
- return "toryo"
- 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 "illegal"
- elsif (@array[x1][y1].name == "OU")
- return "ootori"
- end
- hands.push(@array[x1][y1])
- @array[x1][y1] = nil
- end
- if ((x0 == 0) && (y0 == 0))
- p = get_piece_from_hands(hands, name)
- return "illegal" 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 "illegal" if (@array[x1][y1].promoted_name != name) # can't promote
- @array[x1][y1].promoted = true
- end
- end
- return "normal" # 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