Module: Chess::ValidMoves
- Included in:
- Game
- Defined in:
- lib/chess/game/valid_moves.rb
Overview
ValidMoves
Instance Method Summary collapse
-
#castling_king_passes_check?(move, piece, fen_code, new_player) ⇒ Boolean
helper method for #invalid_castling_move?.
-
#invalid_castling_move?(move, piece, fen_code, new_player) ⇒ Boolean
Check if given castling move is invalid.
-
#invalid_king_side_castle?(move, piece, fen_code, new_player) ⇒ Boolean
helper method for #invalid_castling_move?.
-
#invalid_normal_move?(move, piece, fen_code, new_player) ⇒ Boolean
check if given move is invalid.
-
#invalid_queen_side_castle?(move, piece, fen_code, new_player) ⇒ Boolean
helper method for #invalid_castling_move?.
-
#king_comes_in_check?(piece, new_board) ⇒ Boolean
Checks if king comes in check.
-
#valid_moves(piece, board) ⇒ Array
find valid_moves for given piece on the given board.
-
#valid_moves_for_king(board, piece, possible_moves, fen_code, new_player) ⇒ Array
find valid_moves for given king on the given board.
-
#valid_moves_from_possible_moves(piece, possible_moves, fen_code, new_player) ⇒ Array
find valid_moves from possible_moves.
Instance Method Details
#castling_king_passes_check?(move, piece, fen_code, new_player) ⇒ Boolean
helper method for #invalid_castling_move?
113 114 115 116 117 118 |
# File 'lib/chess/game/valid_moves.rb', line 113 def castling_king_passes_check?(move, piece, fen_code, new_player) new_board = Chess::Board.new(fen_code) new_player.selected_piece = new_board.piece_at(*piece.pos) new_player.play_move_by_type(new_player.selected_piece, new_board, move, inside_valid_moves_flag: true) king_comes_in_check?(piece, new_board) end |
#invalid_castling_move?(move, piece, fen_code, new_player) ⇒ Boolean
Check if given castling move is invalid
82 83 84 85 86 87 88 89 90 91 |
# File 'lib/chess/game/valid_moves.rb', line 82 def invalid_castling_move?(move, piece, fen_code, new_player) return true if piece.in_check file = move.first if file.downcase == 'c' invalid_queen_side_castle?(move, piece, fen_code, new_player) elsif file.downcase == 'g' invalid_king_side_castle?(move, piece, fen_code, new_player) end end |
#invalid_king_side_castle?(move, piece, fen_code, new_player) ⇒ Boolean
helper method for #invalid_castling_move?
104 105 106 107 108 109 |
# File 'lib/chess/game/valid_moves.rb', line 104 def invalid_king_side_castle?(move, piece, fen_code, new_player) comes_in_check = castling_king_passes_check?(move, piece, fen_code, new_player) move = ['f', move.last] passes_check = castling_king_passes_check?(move, piece, fen_code, new_player) passes_check || comes_in_check end |
#invalid_normal_move?(move, piece, fen_code, new_player) ⇒ Boolean
check if given move is invalid
46 47 48 49 50 51 |
# File 'lib/chess/game/valid_moves.rb', line 46 def invalid_normal_move?(move, piece, fen_code, new_player) new_board = Chess::Board.new(fen_code) new_player.selected_piece = new_board.piece_at(*piece.pos) new_player.play_move_by_type(new_player.selected_piece, new_board, move, inside_valid_moves_flag: true) king_comes_in_check?(piece, new_board) end |
#invalid_queen_side_castle?(move, piece, fen_code, new_player) ⇒ Boolean
helper method for #invalid_castling_move?
95 96 97 98 99 100 |
# File 'lib/chess/game/valid_moves.rb', line 95 def invalid_queen_side_castle?(move, piece, fen_code, new_player) comes_in_check = castling_king_passes_check?(move, piece, fen_code, new_player) move = ['d', move.last] passes_check = castling_king_passes_check?(move, piece, fen_code, new_player) passes_check || comes_in_check end |
#king_comes_in_check?(piece, new_board) ⇒ Boolean
Checks if king comes in check
123 124 125 126 127 128 129 |
# File 'lib/chess/game/valid_moves.rb', line 123 def king_comes_in_check?(piece, new_board) if piece.white? new_board.white_king.in_check?(new_board, new_board.black_pieces) else new_board.black_king.in_check?(new_board, new_board.white_pieces) end end |
#valid_moves(piece, board) ⇒ Array
find valid_moves for given piece on the given board
12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/chess/game/valid_moves.rb', line 12 def valid_moves(piece, board) possible_moves = piece.possible_moves(board) new_player = Player.new fen_code = generate_fen_code(board) if piece.is_a?(Pieces::King) valid_moves_for_king(board, piece, possible_moves, fen_code, new_player) else valid_moves_from_possible_moves(piece, possible_moves, fen_code, new_player) end end |
#valid_moves_for_king(board, piece, possible_moves, fen_code, new_player) ⇒ Array
find valid_moves for given king on the given board
61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/chess/game/valid_moves.rb', line 61 def valid_moves_for_king(board, piece, possible_moves, fen_code, new_player) # rubocop:disable Metrics/MethodLength valid_moves_arr = [] castling_moves = piece.castling_moves(board) invalid = false possible_moves.each do |move| invalid = if castling_moves.include?(move) invalid_castling_move?(move, piece, fen_code, new_player) else invalid_normal_move?(move, piece, fen_code, new_player) end valid_moves_arr << move unless invalid end valid_moves_arr end |
#valid_moves_from_possible_moves(piece, possible_moves, fen_code, new_player) ⇒ Array
find valid_moves from possible_moves
31 32 33 34 35 36 37 38 |
# File 'lib/chess/game/valid_moves.rb', line 31 def valid_moves_from_possible_moves(piece, possible_moves, fen_code, new_player) valid_moves_arr = [] possible_moves.each do |move| invalid = invalid_normal_move?(move, piece, fen_code, new_player) valid_moves_arr << move unless invalid end valid_moves_arr end |