Module: Chess::ValidMoves

Included in:
Game
Defined in:
lib/chess/game/valid_moves.rb

Overview

ValidMoves

Instance Method Summary collapse

Instance Method Details

#castling_king_passes_check?(move, piece, fen_code, new_player) ⇒ Boolean

helper method for #invalid_castling_move?

Parameters:

Returns:

  • (Boolean)


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

Parameters:

Returns:

  • (Boolean)


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?

Parameters:

Returns:

  • (Boolean)


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

Parameters:

Returns:

  • (Boolean)


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?

Parameters:

Returns:

  • (Boolean)


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

Parameters:

  • piece

    any subclass of Pieces::Piece

  • new_board

    new board obj of [Chess::Board]

Returns:

  • (Boolean)


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

Parameters:

Returns:

  • (Array)

    valid_moves_arr



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

Parameters:

Returns:

  • (Array)

    valid_moves_arr



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

Parameters:

Returns:

  • (Array)

    valid_moves_arr



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