Module: Chess::Save::FenCodeFromBoard

Included in:
Pieces::King, Chess::Save
Defined in:
lib/chess/save/fen_from_board.rb

Overview

Fen code from Board

Instance Method Summary collapse

Instance Method Details

#fen_piece_placement(board_data) ⇒ String

create fen piece placement for given board_data

Parameters:

  • board_data (Hash)

Returns:

  • (String)

    piece_placement



25
26
27
28
29
30
31
32
# File 'lib/chess/save/fen_from_board.rb', line 25

def fen_piece_placement(board_data)
  string = ''
  (0..7).reverse_each do |rank|
    string += fen_piece_placement_by_rank(board_data, rank)
    string += '/' unless rank.zero?
  end
  string
end

#fen_piece_placement_by_rank(board_data, rank) ⇒ String

helper method for #fen_piece_placement

Parameters:

  • board_data (Hash)
  • rank (Integer)

Returns:

  • (String)

    piece_placement_part



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/chess/save/fen_from_board.rb', line 38

def fen_piece_placement_by_rank(board_data, rank) # rubocop:disable Metrics/MethodLength
  string = ''
  empty_space = 0
  ('a'..'h').each do |file|
    piece = board_data[file][rank]
    if piece == ''
      empty_space += 1
      string += empty_space.to_s if file == 'h'
    else
      string += empty_space.to_s unless empty_space.zero?
      string += letter_of(piece)
      empty_space = 0
    end
  end
  string
end

#generate_fen_code(board) ⇒ Object

generate FEN code from given board

Parameters:



11
12
13
14
15
16
17
18
19
20
# File 'lib/chess/save/fen_from_board.rb', line 11

def generate_fen_code(board)
  piece_placement = fen_piece_placement(board.data)
  current_player = board.current_player
  castling_rights = board.castling_rights
  en_passant = board.possible_en_passant_target
  half_move = board.half_move
  full_move = board.full_move

  "#{piece_placement} #{current_player} #{castling_rights} #{en_passant} #{half_move} #{full_move}"
end

#letter_of(piece) ⇒ String

return letter of piece

Parameters:

Returns:

  • (String)

    piece_letter



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/chess/save/fen_from_board.rb', line 59

def letter_of(piece) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
  letter = case piece
           when Pieces::King
             'k'
           when Pieces::Bishop
             'b'
           when Pieces::Rook
             'r'
           when Pieces::Pawn
             'p'
           when Pieces::Queen
             'q'
           when Pieces::Knight
             'n'
           end
  if piece.white?
    letter.upcase
  else
    letter
  end
end