class Game
Constants
- BOTTOM
- LEFT
- RIGHT
- TOP
Public Class Methods
new()
click to toggle source
# File lib/ruby-snake/game.rb, line 12 def initialize Curses.init_screen Curses.noecho # Don't show typed key. Curses.stdscr.keypad(true) # colors Curses.start_color Curses.init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLUE) # Color of boders Curses.init_pair(COLOR_RED, COLOR_RED, COLOR_RED) Curses.init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK) Curses.init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_YELLOW) setup end
Public Instance Methods
start()
click to toggle source
# File lib/ruby-snake/game.rb, line 28 def start # Create a thread to montior key events key_listener = Thread.new do loop {Thread.current[:key] = Curses.getch} end while true handle_key key_listener[:key] if !@pause if @dead_snake # erase dead snake @dead_snake.body.each {|pos| erase pos} erase @dead_snake.food @dead_snake = false end tail = @snake.goto @direction if @snake.alive? draw_snake draw_food erase tail @speed += 1 if @snake.score / 100 > @speed - 1 else @dead_snake = @snake.dup setup @message = "You die! Press 'S' to restart the game." @pause = true end draw_ui Curses.refresh sleep(0.2 * (0.8 ** (@speed - 1))) end end end
Private Instance Methods
draw_food()
click to toggle source
# File lib/ruby-snake/game.rb, line 104 def draw_food Curses.setpos(@snake.food.y, (@snake.food.x - 1) * 2) Curses.attron(color_pair(COLOR_YELLOW)|A_NORMAL) {Curses.addstr " "} end
draw_snake()
click to toggle source
# File lib/ruby-snake/game.rb, line 97 def draw_snake @snake.body.each do |pos| Curses.setpos(pos.y, (pos.x - 1) * 2) Curses.attron(color_pair(COLOR_RED)|A_NORMAL) {Curses.addstr " "} end end
draw_ui()
click to toggle source
# File lib/ruby-snake/game.rb, line 78 def draw_ui # top border Curses.setpos(TOP, LEFT) Curses.attron(color_pair(COLOR_BLUE)|A_NORMAL) {Curses.addstr(' ' * RIGHT)} # bottom border Curses.setpos(BOTTOM, LEFT) Curses.attron(color_pair(COLOR_BLUE)|A_NORMAL) {Curses.addstr(' ' * RIGHT)} Curses.addstr(' ' * RIGHT) # left boder & right boder Curses.attron(color_pair(COLOR_BLUE)|A_NORMAL) do TOP.upto(BOTTOM) do |i| Curses.setpos(i, LEFT); Curses.addstr " " Curses.setpos(i, RIGHT); Curses.addstr " " end end Curses.setpos(BOTTOM + 1, LEFT) Curses.addstr("Score: #{@snake.score} Speed: #{@speed}, #{@message}") end
erase(pos)
click to toggle source
# File lib/ruby-snake/game.rb, line 109 def erase pos Curses.setpos(pos.y, (pos.x - 1) * 2) Curses.attron(color_pair(COLOR_BLACK)|A_NORMAL) {Curses.addstr " "} end
handle_key(key)
click to toggle source
# File lib/ruby-snake/game.rb, line 114 def handle_key key case key when 'q', 'Q' exit when 'p', 'P' @message = "Press 'S' to start, Press 'Q' to quit." @pause = true draw_ui Curses.refresh when 's', 'S' @message = "Press 'P' to pause, Press 'Q' to quit." @pause = false when Curses::Key::UP @direction = Snake::UP when Curses::Key::DOWN @direction = Snake::DOWN when Curses::Key::LEFT @direction = Snake::LEFT when Curses::Key::RIGHT @direction = Snake::RIGHT end end
setup()
click to toggle source
# File lib/ruby-snake/game.rb, line 69 def setup @snake = Snake.new(RIGHT / 2 - 1, BOTTOM - 1) @score = 0 @speed = 1 @pause = false @direction = Snake::RIGHT @message = "Press 'P' to pause, Press 'Q' to quit." end