class Board

Constants

HEIGHT
SCORE_MULTIPLIER
STARTING_POINT
WIDTH

Attributes

completed_lines[R]

Public Class Methods

new() click to toggle source
# File lib/board.rb, line 14
def initialize
  @grid, @over, @completed_lines = Array.new(HEIGHT) { Array.new(WIDTH) }, false, 0
  @start_time, @time_limit, @line_limit = Time.now, nil, nil
  @level =  0, 0
end

Public Instance Methods

[](coord) click to toggle source
# File lib/board.rb, line 20
def [](coord)
  @grid[coord.first][coord.last]
end
[]=(coord, val) click to toggle source
# File lib/board.rb, line 24
def []=(coord, val)
  @grid[coord.first][coord.last] = val
end
add_block() click to toggle source
# File lib/board.rb, line 78
def add_block
  block = Block.random(STARTING_POINT)
  spaces = block.spaces_occupied
  return false if any_filled?(spaces)
  add_to_spaces(block, spaces)
  @selected.upper_left = nil unless @selected.nil?
  @selected = block
  true
end
add_to_spaces(block, spaces) click to toggle source
# File lib/board.rb, line 66
def add_to_spaces(block, spaces)
  spaces.each do |space| 
    self[space] = block
  end
end
all_filled?(spaces) click to toggle source
# File lib/board.rb, line 62
def all_filled?(spaces)
  spaces.all?{ |space| filled?(space) }
end
any_filled?(spaces) click to toggle source
# File lib/board.rb, line 58
def any_filled?(spaces)
  spaces.any?{ |space| filled?(space) }
end
change_direction(block, options = {}) click to toggle source
# File lib/board.rb, line 95
def change_direction(block, options = {})
  i, j, turn = options[:i], options[:j], options[:turn]
  new_upper_left = (i && j) ? [block.upper_left.first + i, block.upper_left.last + j] : block.upper_left
  new_rotation = (turn) ? block.rotation + turn : block.rotation
  old_spaces = block.spaces_occupied
  new_spaces = block.spaces_occupied(pos: new_upper_left, rotation: new_rotation)
  return false unless check_spaces(old_spaces, new_spaces)
  remove_from_spaces(old_spaces)
  add_to_spaces(block, new_spaces)
  block.upper_left, block.rotation = new_upper_left, new_rotation
  true 
end
check_spaces(old_spaces, new_spaces) click to toggle source
# File lib/board.rb, line 88
def check_spaces(old_spaces, new_spaces)
  new_territory = new_spaces - old_spaces
  return false unless new_spaces.all? { |coord| on_board?(coord) }
  return false if any_filled?(new_territory)
  true
end
filled?(space) click to toggle source
# File lib/board.rb, line 54
def filled?(space)
  !self[space].nil?
end
level() click to toggle source
# File lib/board.rb, line 50
def level
  @completed_lines / 10
end
move_selected_down() click to toggle source
# File lib/board.rb, line 125
def move_selected_down
  unless change_direction(@selected, i: 1, j: 0)
    remove_completed_line_and_increase_score
    @over = !add_block
    return false
  end
  true
end
move_selected_left() click to toggle source
# File lib/board.rb, line 134
def move_selected_left
  change_direction(@selected, i: 0, j: -1)
end
move_selected_right() click to toggle source
# File lib/board.rb, line 138
def move_selected_right
  change_direction(@selected, i: 0, j: 1)
end
move_to_bottom() click to toggle source
# File lib/board.rb, line 116
def move_to_bottom
  while change_direction(@selected, i: 1, j: 0)
    old_spaces = @selected.spaces_occupied
    new_upper_left = [@selected.upper_left.first + 1, @selected.upper_left.last]
    new_spaces = @selected.spaces_occupied(pos: new_upper_left, rotation: @selected.rotation)
    break unless check_spaces(old_spaces, new_spaces)
  end
end
on_board?(space) click to toggle source
# File lib/board.rb, line 108
def on_board?(space)
  space.first.between?(0, HEIGHT - 1) && space.last.between?(0, WIDTH - 1)
end
over?() click to toggle source
# File lib/board.rb, line 175
def over?
  @over
end
push_selected_down() click to toggle source
# File lib/board.rb, line 112
def push_selected_down
  move_selected_down unless change_direction(@selected, i: 5, j: 0)
end
remove_and_shift(row_num) click to toggle source
# File lib/board.rb, line 150
def remove_and_shift(row_num)
  @grid[row_num] = Array.new(WIDTH)
  until @grid[row_num - 1].all?(&:nil?)
    @grid[row_num] = @grid[row_num -= 1]
    @grid[row_num] = Array.new(WIDTH)
  end
end
remove_completed_line_and_increase_score() click to toggle source
# File lib/board.rb, line 158
def remove_completed_line_and_increase_score
  lines = 0
  i = HEIGHT - 1
  until i == 0
    p i
    spaces_on_row = [i].product((0...WIDTH).to_a)
    
    if all_filled?(spaces_on_row)
      remove_and_shift(i)
      lines += 1
    else
      i -= 1
    end
  end
  @completed_lines += lines
end
remove_from_spaces(spaces) click to toggle source
# File lib/board.rb, line 72
def remove_from_spaces(spaces)
  spaces.each do |space|
    self[space] = nil
  end
end
render() click to toggle source
# File lib/board.rb, line 28
def render
  str = ""
  @grid.each_with_index do |row, i|
    row.each do |pos|
       str += pos.nil? ? "  " : "[]".colorize(pos.pattern.color)
    end
    str+= "*"
    if i == 1
      str += " WASD to move. '[' and ']' to rotate."
    elsif i == 2
      str += "    #{summary_s}"
    end
    str += "\n"
  end
  str = "  " * (WIDTH + 1) + "\n" + str + "- " * (WIDTH + 1) + "\n"
  puts str
end
rotate_selected_left() click to toggle source
# File lib/board.rb, line 142
def rotate_selected_left
  change_direction(@selected, turn: -1)
end
rotate_selected_right() click to toggle source
# File lib/board.rb, line 146
def rotate_selected_right
  change_direction(@selected, turn: 1)
end
summary_s() click to toggle source
# File lib/board.rb, line 46
def summary_s
  "LINES: #{@completed_lines}  LEVEL: #{level}"
end