Skip to content

Instantly share code, notes, and snippets.

@alyraz
Created February 4, 2013 19:34
Show Gist options
  • Save alyraz/4708993 to your computer and use it in GitHub Desktop.
Save alyraz/4708993 to your computer and use it in GitHub Desktop.
class Die
def initialize(sides = 6)
@sides = sides
end
# Remember: rand(N) randomly returns one of N consecutive integers, starting at 0
# So rand(N) returns a random integer in (0..N-1)
# And 1 + rand(N) returns a random integer in (1..N)
# See: http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-rand
def roll
1 + rand(@sides)
end
end
# Use "reputs" to print over a previously printed line,
# assuming the cursor is positioned appropriately.
def reputs(str = '')
puts "\e[0K" + str
end
# Clear the screen
def clear_screen!
print "\e[2J"
end
# Moves cursor to the top left of the terminal
def move_to_home!
print "\e[H"
end
# Flushes the STDOUT buffer.
# By default STDOUT is only flushed when it encounters a newline (\n) character
def flush!
$stdout.flush
end
require_relative 'racer_utils'
class RubyRacer
attr_reader :players, :length
def initialize(players, length = 30)
@players = players
@length = length
@player_positions = {players[0] => 0, players[1] => 0}
end
# Returns +true+ if one of the players has reached
# the finish line, +false+ otherwise
def finished?
@player_positions[players[0]] >= length || @player_positions[players[1]] >= length
end
# Returns the winner if there is one, +nil+ otherwise
def winner
return players[0] if @player_positions[players[0]] >= length
return players[1] if @player_positions[players[1]] >= length
return nil
end
# Rolls the dice and advances +player+ accordingly
def advance_player!(player)
@player_positions[player] += Die.new.roll
end
# TODO: Print the board.
# The board should have the same dimensions each time
# and you should use the "reputs" helper to print over
# the previous board
def print_board
puts @player_positions
# reputs " |" * @player_positions[players[0]] + " #{players[0]} |" + " |" * (@length - @player_positions[players[0]])
# reputs " |" * @player_positions[players[1]] + " #{players[1]} |" + " |" * (@length - @player_positions[players[1]])
end
end
players = ['a', 'b']
game = RubyRacer.new(players)
# This clears the screen, so the fun can begin
clear_screen!
until game.finished?
players.each do |player|
# This moves the cursor back to the upper-left of the screen
move_to_home!
# We print the board first so we see the initial, starting board
game.print_board
game.advance_player!(player)
# We need to sleep a little, otherwise the game will blow right past us.
# See http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-sleep
sleep(0.5)
end
end
# The game is over, so we need to print the "winning" board
game.print_board
puts "Player '#{game.winner}' has won!"
require_relative 'racer_utils'
class RubyRacer
attr_reader :players, :length
def initialize(players, length = 30)
@players = players
@length = length
@player_positions = Hash.new
players.each_with_index do |player, index|
@player_positions[players[index]] = 0
end
end
def finished?
@player_positions[players[0]] >= length || @player_positions[players[1]] >= length
end
def winner
@player_positions.each do |player_symbol, position|
return player_symbol if position >= @length
end
end
def advance_player!(player)
@player_positions[player] = [ @player_positions[player] + Die.new.roll, @length ].min
end
def print_board
clear_screen!
move_to_home!
@player_positions.each do |player_symbol, position|
reputs " |" * position + "#{player_symbol}|" + " |" * (@length - position)
end
end
def play
until self.finished?
players.each do |player|
self.print_board
self.advance_player!(player)
sleep(0.3)
end
end
self.print_board
puts "Player '#{self.winner}' has won!"
puts "BOOYAKASHAAAW!!!" if @players.length > 2
end
end
players = ['a', 'b']
game = RubyRacer.new(players)
game.play
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment