class Bchess::Board
Attributes
castles[RW]
en_passant[RW]
fen[RW]
halfmove_clock[RW]
move_number[RW]
pieces[RW]
to_move[RW]
Public Class Methods
new(fen = Bchess::START_FEN, to_move = Bchess::WHITE)
click to toggle source
# File lib/bchess/board.rb, line 11 def initialize(fen = Bchess::START_FEN, to_move = Bchess::WHITE) @fen = fen @to_move = to_move @move_number = 0 @halfmove_clock = 0 @pieces = [] @en_passant = '-' @castles = '-' end
Public Instance Methods
at(column, row)
click to toggle source
# File lib/bchess/board.rb, line 73 def at(column, row) pieces.select { |p| p.row == row && p.column == column }.first end
change_to_move()
click to toggle source
# File lib/bchess/board.rb, line 98 def change_to_move @to_move = to_move == Bchess::WHITE ? Bchess::BLACK : Bchess::WHITE end
execute_promotion(piece, column, row, promoted_piece)
click to toggle source
# File lib/bchess/board.rb, line 60 def execute_promotion(piece, column, row, promoted_piece) raise 'Promotion Not Specified' if promoted_piece.nil? || !(promoted_piece < Bchess::Piece) pieces.delete(piece) promoted = promoted_piece.new(piece.color, column, row) promoted.moved = true if promoted_piece == Bchess::Rook pieces << promoted end
get_possible_pieces(info)
click to toggle source
# File lib/bchess/board.rb, line 48 def get_possible_pieces(info) @pieces.select { |p| p.can_make_move?(info, self) } end
king(color)
click to toggle source
# File lib/bchess/board.rb, line 94 def king(color) @pieces.select { |p| p.class == Bchess::King && p.color == color }.first end
move(piece, column, row, promoted_piece = nil)
click to toggle source
# File lib/bchess/board.rb, line 21 def move(piece, column, row, promoted_piece = nil) return false if invalid_data?(piece, column, row) @en_passant = '-' unless en_passant_detected?(piece, column, row) if castle_detected?(piece, column) castle(piece, column, row) elsif promotion_detected?(piece, row) execute_promotion(piece, column, row, promoted_piece) elsif en_passant_detected?(piece, column, row) validate_en_passant(piece, column, row) && execute_en_passant(piece, column, row) elsif pawn_long_move_detected?(piece, row) long_pawn_move(piece, column, row) elsif piece.can_move_to_field?(column, row) piece.move(column, row) elsif piece.can_take_on_field?(column, row) piece.move(column, row) else return false end update_info(piece, column, row) validate_move rescue RuntimeError false end
print()
click to toggle source
# File lib/bchess/board.rb, line 87 def print puts 'Pieces WHITE: ' puts _pieces(Bchess::WHITE).map(&:to_s).join(', ') puts 'Pieces BLACK: ' puts _pieces(Bchess::BLACK).map(&:to_s).join(', ') end
read_fen()
click to toggle source
# File lib/bchess/board.rb, line 77 def read_fen fen_pieces, fen_colors, fen_castles, fen_en_passant, fen_halfmove_clock, fen_move_number = fen.strip.split(' ') set_pieces(fen_pieces) set_to_move(fen_colors) set_castles(fen_castles) set_en_passant(fen_en_passant) set_halfmove_clock(fen_halfmove_clock) set_move_number(fen_move_number) end
transform_field(field)
click to toggle source
# File lib/bchess/board.rb, line 69 def transform_field(field) [field.chars.first.ord - 97, field.chars.last.to_i - 1] end
update_info(piece, column, row)
click to toggle source
# File lib/bchess/board.rb, line 52 def update_info(piece, column, row) update_castles_after_move(piece) if piece.moved change_halfmove_clock(piece) change_to_move change_move_number if piece.color == Bchess::BLACK remove_old_piece(column, row, piece.color) if !!at(column, row) end
Private Instance Methods
_other_pieces(color)
click to toggle source
# File lib/bchess/board.rb, line 129 def _other_pieces(color) @pieces.reject { |p| p.color == color } end
_pieces(color)
click to toggle source
# File lib/bchess/board.rb, line 125 def _pieces(color) @pieces.select { |p| p.color == color } end
attacks?(piece, king)
click to toggle source
# File lib/bchess/board.rb, line 120 def attacks?(piece, king) piece.can_take_on_field?(king.column, king.row) && piece.fields_between(king.column, king.row).none? { |f| at(*f) } end
just_moved()
click to toggle source
# File lib/bchess/board.rb, line 109 def just_moved to_move == Bchess::WHITE ? Bchess::BLACK : Bchess::WHITE end
king_attacked(color)
click to toggle source
# File lib/bchess/board.rb, line 113 def king_attacked(color) _king = king(color) _pieces = _other_pieces(color) _pieces.any? { |p| attacks?(p, _king) } end
remove_old_piece(column, row, color)
click to toggle source
# File lib/bchess/board.rb, line 104 def remove_old_piece(column, row, color) taken_piece = _other_pieces(color).select { |p| p.row == row && p.column == column }.first pieces.delete(taken_piece) end