- def initial
- PieceKY::new(self, 1, 1, false)
- PieceKE::new(self, 2, 1, false)
- PieceGI::new(self, 3, 1, false)
- PieceKI::new(self, 4, 1, false)
- PieceOU::new(self, 5, 1, false)
- PieceKI::new(self, 6, 1, false)
- PieceGI::new(self, 7, 1, false)
- PieceKE::new(self, 8, 1, false)
- PieceKY::new(self, 9, 1, false)
- PieceKA::new(self, 2, 2, false)
- PieceHI::new(self, 8, 2, false)
- PieceFU::new(self, 1, 3, false)
- PieceFU::new(self, 2, 3, false)
- PieceFU::new(self, 3, 3, false)
- PieceFU::new(self, 4, 3, false)
- PieceFU::new(self, 5, 3, false)
- PieceFU::new(self, 6, 3, false)
- PieceFU::new(self, 7, 3, false)
- PieceFU::new(self, 8, 3, false)
- PieceFU::new(self, 9, 3, false)
-
- PieceKY::new(self, 1, 9, true)
- PieceKE::new(self, 2, 9, true)
- PieceGI::new(self, 3, 9, true)
- PieceKI::new(self, 4, 9, true)
- PieceOU::new(self, 5, 9, true)
- PieceKI::new(self, 6, 9, true)
- PieceGI::new(self, 7, 9, true)
- PieceKE::new(self, 8, 9, true)
- PieceKY::new(self, 9, 9, true)
- PieceKA::new(self, 8, 8, true)
- PieceHI::new(self, 2, 8, true)
- PieceFU::new(self, 1, 7, true)
- PieceFU::new(self, 2, 7, true)
- PieceFU::new(self, 3, 7, true)
- PieceFU::new(self, 4, 7, true)
- PieceFU::new(self, 5, 7, true)
- PieceFU::new(self, 6, 7, true)
- PieceFU::new(self, 7, 7, true)
- PieceFU::new(self, 8, 7, true)
- PieceFU::new(self, 9, 7, true)
- end
-
- def have_piece?(hands, name)
- piece = hands.find { |i|
- i.name == name
- }
- return piece
- end
-
- def move_to(x0, y0, x1, y1, name, sente)
- if (sente)
- hands = @sente_hands
- else
- hands = @gote_hands
- end
-
- if ((x0 == 0) || (y0 == 0))
- piece = have_piece?(hands, name)
- return :illegal if (! piece.move_to?(x1, y1, name))
- piece.move_to(x1, y1)
- else
- return :illegal if (! @array[x0][y0].move_to?(x1, y1, name))
- if (@array[x0][y0].name != name) # promoted ?
- @array[x0][y0].promoted = true
- end
- if (@array[x1][y1])
- if (@array[x1][y1].name == "OU")
- return :outori # return board update
- end
- @array[x1][y1].sente = @array[x0][y0].sente
- @array[x1][y1].move_to(0, 0)
- hands.sort! {|a, b|
- a.name <=> b.name
- }
- end
- @array[x0][y0].move_to(x1, y1)
- end
- return true
- end
-
- def look_for_ou(sente)
- x = 1
- while (x <= 9)
- y = 1
- while (y <= 9)
- if (@array[x][y] &&
- (@array[x][y].name == "OU") &&
- (@array[x][y].sente == sente))
- return @array[x][y]
- end
- y = y + 1
- end
- x = x + 1
- end
- raise "can't find ou"
- end
-
- def checkmated?(sente) # sente is loosing
- ou = look_for_ou(sente)
- x = 1
- while (x <= 9)
- y = 1
- while (y <= 9)
- if (@array[x][y] &&
- (@array[x][y].sente != sente))
- if (@array[x][y].movable_grids.include?([ou.x, ou.y]))
- return true
- end
- end
- y = y + 1
- end
- x = x + 1
- end
- return false
- end
-
- def uchifuzume?(sente)
- rival_ou = look_for_ou(! sente) # rival's ou
- if (sente) # rival is gote
- if ((rival_ou.y != 9) &&
- (@array[rival_ou.x][rival_ou.y + 1]) &&
- (@array[rival_ou.x][rival_ou.y + 1].name == "FU") &&
- (@array[rival_ou.x][rival_ou.y + 1].sente == sente)) # uchifu true
- fu_x = rival_ou.x
- fu_y = rival_ou.y + 1
- else
- return false
- end
- else # gote
- if ((rival_ou.y != 0) &&
- (@array[rival_ou.x][rival_ou.y - 1]) &&
- (@array[rival_ou.x][rival_ou.y - 1].name == "FU") &&
- (@array[rival_ou.x][rival_ou.y - 1].sente == sente)) # uchifu true
- fu_x = rival_ou.x
- fu_y = rival_ou.y - 1
- else
- return false
- end
- end
-
- ## case: rival_ou is moving
- escaped = false
- rival_ou.movable_grids.each do |(cand_x, cand_y)|
- tmp_board = Marshal.load(Marshal.dump(self))
- s = tmp_board.move_to(rival_ou.x, rival_ou.y, cand_x, cand_y, "OU", ! sente)
- raise "internal error" if (s != true)
- if (! tmp_board.checkmated?(! sente)) # good move
- return false
- end