class Game

Constants

INVISIBLE_CURSOR

Attributes

snake[R]
window[R]

Public Class Methods

new() click to toggle source
# File lib/snake_game/game.rb, line 8
def initialize
  @window = TermWindow.new
  @snake = Snake.new([[4,10], [4,9], [4,8]])
end

Public Instance Methods

create() click to toggle source
# File lib/snake_game/game.rb, line 13
def create
  Curses.init_screen()
  Curses.cbreak()
  Curses.noecho
  Curses.curs_set(INVISIBLE_CURSOR)

  run
end

Private Instance Methods

run() click to toggle source
# File lib/snake_game/game.rb, line 23
def run
  key = Curses::KEY_RIGHT
  score = 0

  food = Food.new(window)
  food.relocate_without_conflict!(@snake)

  window.paint_food(food)

  while (key != 27)
    window.setpos(0, (window.width / 2) - 10)
    window.addstr(" Score: #{score.to_s} ")
    window.timeout = 150

    prev_key = key
    event = window.getch()
    key = event == -1 ? key : event

    key = prev_key unless [Curses::KEY_DOWN, Curses::KEY_UP, Curses::KEY_RIGHT, Curses::KEY_LEFT, 27].include?(key)

    case key
    when Curses::KEY_DOWN
      @snake.insert(0, [@snake[0][0], @snake[0][1] + 1])
    when Curses::KEY_UP
      @snake.insert(0, [@snake[0][0], @snake[0][1] - 1])
    when Curses::KEY_LEFT
      @snake.insert(0, [@snake[0][0] - 1, @snake[0][1]])
    when Curses::KEY_RIGHT
      @snake.insert(0, [@snake[0][0] + 1, @snake[0][1]])
    end

    @snake[0][0] = (window.width.to_i - 2) if @snake[0][0] == 0
    @snake[0][1] = (window.height.to_i - 2) if @snake[0][1] == 0
    @snake[0][0] = 1 if @snake[0][0] == window.width - 1
    @snake[0][1] = 1 if @snake[0][1] == window.height - 1

    if snake.crashed?
      break
    end

    if food.has_been_eaten_by?(@snake)
      score += food.points
      food = Food.new(window)
      food.relocate_without_conflict!(@snake)
      window.paint_food(food)
    else
      last_part = @snake.pop
      window.setpos(last_part[1], last_part[0])
      window.addstr(' ')
    end

    window.paint_snake(@snake)
  end
  
  window.close
  Curses.close_screen

  puts("----- GAME OVER -----")
  puts("----- Score: #{score} -----")
end