class Checkers::Board

Attributes

board[R]
jumped[R]
last_move[R]

Public Class Methods

generate_boards(board_object, player) click to toggle source
# File lib/checkers/board.rb, line 22
def generate_boards(board_object, player)
  moves = board_object.find_moves_for_player(player: player)
  moves.map do |move|
    make_move(board_object, move)
  end
end
make_move(board_object, move) click to toggle source
# File lib/checkers/board.rb, line 29
def make_move(board_object, move)
  new_board = board_object.board.dup
  jumped = false

  new_board[*move.end_square] = if move.end_square[0].zero? && new_board[*move.start_square] == HUMAN_PIECE
                                  HUMAN_KING
                                elsif move.end_square[0] == 7 && new_board[*move.start_square] == AI_PIECE
                                  AI_KING
                                else
                                  new_board[*move.start_square]
                                end
  new_board[*move.start_square] = 0

  if move.is_a?(JumpMove)
    new_board[*move.jump_over_square] = 0
    jumped = true
  end
  Board.new(board: new_board, jumped: jumped, last_move: move)
end
new(board: nil, jumped: false, last_move: nil) click to toggle source
# File lib/checkers/board.rb, line 50
def initialize(board: nil, jumped: false, last_move: nil)
  @board = board || set_board
  @jumped = jumped
  @last_move = last_move
end

Public Instance Methods

any_jump_moves?(player:) click to toggle source
# File lib/checkers/board.rb, line 79
def any_jump_moves?(player:)
  find_moves_for_player(player: player).one? { |move| move.is_a?(JumpMove) }
end
calculate_score(player:) click to toggle source
# File lib/checkers/board.rb, line 56
def calculate_score(player:)
  number_of_pieces(player: player) +
    number_of_pieces_on_opponets_side(player: player) +
    3 * movable_pieces(player: player) +
    4 * number_of_unoccupied_promotion_squares(player: player)
end
count_pieces(player:) click to toggle source
# File lib/checkers/board.rb, line 63
def count_pieces(player:)
  board.count { |piece| player_pieces(player).include?(piece) }
end
find_moves_for_player(player:) click to toggle source
# File lib/checkers/board.rb, line 67
def find_moves_for_player(player:)
  found_moves = []
  @board.each_with_index do |e, row, col|
    next unless player_pieces(player).include?(e)

    moves = find_available_moves(row: row, col: col, player: player)
    found_moves += moves
    break found_moves = moves if moves.any? { |move| move.is_a?(JumpMove) }
  end
  found_moves
end

Protected Instance Methods

adjacent_squares(row:, col:, player:) click to toggle source
# File lib/checkers/board.rb, line 89
def adjacent_squares(row:, col:, player:)
  possible_squares(row: row, col: col, player: player) do |squares|
    squares.select { |square| within_board?(row: square[0], col: square[1]) }
  end
end
movable_squares(row:, col:, player:) click to toggle source
# File lib/checkers/board.rb, line 95
def movable_squares(row:, col:, player:)
  possible_squares(row: row, col: col, player: player) do |squares|
    squares.select { |square| move?(row: square[0], col: square[1]) }
  end
end
player_pieces(player) click to toggle source
# File lib/checkers/board.rb, line 85
def player_pieces(player)
  player == :human ? HUMAN_PIECES : AI_PIECES
end
possible_squares(row:, col:, player:) { |move_up| ... } click to toggle source
# File lib/checkers/board.rb, line 101
def possible_squares(row:, col:, player:)
  move_up = [[row - 1, col + 1], [row - 1, col - 1]]
  move_down = [[row + 1, col + 1], [row + 1, col - 1]]
  if player == :human
    if @board[row, col] == HUMAN_PIECE
      yield move_up
    else
      yield(move_up + move_down)
    end
  else
    if @board[row, col] == AI_PIECE
      yield move_down
    else
      yield(move_down + move_up)
    end
  end
end

Private Instance Methods

move?(row:, col:) click to toggle source
# File lib/checkers/board.rb, line 121
def move?(row:, col:)
  within_board?(row: row, col: col) && square_empty?(row: row, col: col)
end
set_board() click to toggle source
# File lib/checkers/board.rb, line 133
def set_board
  Matrix[
    [0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 1, 0, 1, 0],
    [0, 1, 0, 1, 0, 1, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [-1, 0, -1, 0, -1, 0, -1, 0],
    [0, -1, 0, -1, 0, -1, 0, -1],
    [-1, 0, -1, 0, -1, 0, -1, 0]
  ]
end
square_empty?(row:, col:) click to toggle source
# File lib/checkers/board.rb, line 129
def square_empty?(row:, col:)
  @board[row, col].zero?
end
within_board?(row:, col:) click to toggle source
# File lib/checkers/board.rb, line 125
def within_board?(row:, col:)
  row <= 7 && row >= 0 && col <= 7 && col >= 0
end