class ConsoleTetris

Constants

BLOCK_TYPES
VERSION

Public Class Methods

start() click to toggle source
# File lib/console_tetris.rb, line 9
def self.start
  @background_board = BackgroundBoard.new

  @tetrimino = Tetrimino.new(block_type: "type_#{BLOCK_TYPES.sample}")
  next_tetrimino = Tetrimino.new(block_type: "type_#{BLOCK_TYPES.sample}")

  @background_board.print_next_block(next_tetrimino)
  @background_board.print_block(@tetrimino)

  Thread.new do
    catch :gameover do
      loop do
        loop.with_index do |_, i|
          @tetrimino.down

          @background_board.print_block(@tetrimino) unless @background_board.overlap?(@tetrimino)

          sleep 0.1

          if @tetrimino.bottom_edge? || @background_board.overlap?(@tetrimino)
            throw :gameover if i == 0

            @tetrimino.back_vertically if @background_board.overlap?(@tetrimino)

            break
          end
        end

        @background_board.stack!(@tetrimino)
        @background_board.remove_filled_line!

        @background_board.print_block(@tetrimino)

        @tetrimino = next_tetrimino
        next_tetrimino = Tetrimino.new(block_type: "type_#{BLOCK_TYPES.sample}")

        @background_board.print_next_block(next_tetrimino)
      end
    end

    @background_board.print_gameover

    exit
  end

  while (str = STDIN.getch) != "\C-c"
    case str
    when '.'
      next if @tetrimino.right_edge?

      @tetrimino.move_right
      @tetrimino.back_horizontally if @background_board.overlap?(@tetrimino)
    when 'z'
      next if @tetrimino.left_edge?

      @tetrimino.move_left
      @tetrimino.back_horizontally if @background_board.overlap?(@tetrimino)
    when "\r"
      @tetrimino.rotate

      loop do
        if @background_board.overlap?(@tetrimino)
          @tetrimino.up
        else
          break
        end
      end
    end

    @background_board.print_block(@tetrimino)
  end
end