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