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