class Sokoban::Game

Public Class Methods

new() click to toggle source
# File lib/sokoban.rb, line 30
def initialize
  @level = Level.new
  parse_opts
  # --level and --resume opts may change lnum
  @lnum = @level.lnum
  play
end

Private Instance Methods

log_moves() click to toggle source
# File lib/sokoban.rb, line 57
def log_moves
  @logger.debug @level.inspect if @options[:debug]
end
parse_opts() click to toggle source
# File lib/sokoban.rb, line 61
def parse_opts
  @options = {}
  @optparse = OptionParser.new do |opts|
    opts.banner = "Usage: #{BASENAME} [options]\n"
    opts.banner << "Controls:
 wasd, hjkl, number pad          Move
 ^C                              Quit without save
 b                               Toggle batch mode
 r                               Restart
 u                               Undo
 q                               Quit\n"
    opts.banner << "Options:"

    opts.on("-h", "--help", "Display help") do
      puts opts
      exit
    end

    opts.on("-v", "--version", "Print version number") do
      puts "#{BASENAME} #{VERSION}"
      exit
    end

    opts.on("-b", "--batch", "Batch input mode") do
      $batch = true
    end

    opts.on("-d", "--debug", "Enable debug log") do
      @logger = Logger.new LOG_FILE
      @logger.level = Logger::DEBUG
      @logger.debug "Created logger"
      @logger.debug "#{BASENAME} #{VERSION}"
      @logger.debug "#{$0} --debug #{ARGV.join(" ")}"
      @options[:debug] = true
    end

    opts.on("-l N", "--level N", Integer, "Start at level N") do |n|
      @level = Level.new(n)
      @options[:level] = true
    end
    
    opts.on("-r", "--resume", "Resume saved game") do
      @level.load_game
      @options[:resume] = true
    end

    opts.on("-x") do
      $hax = true
    end
  end

  begin
    @optparse.parse!
    if @options[:level] && @options[:resume]
      raise ArgumentError, "Can't set --level and --resume. Choose one."
    end
  rescue OptionParser::InvalidOption,
         OptionParser::InvalidArgument,
         OptionParser::MissingArgument,
         RangeError, ArgumentError
    puts "#{@optparse}\n"
    puts "ERROR: #{$!}"
    exit
  end
end
play() click to toggle source
# File lib/sokoban.rb, line 40
def play
  loop do
    begin
      @lnum += 1 if @level.play
    rescue RuntimeError
      # Write log in case of quit
      log_moves
      exit
    end
    log_moves
    break if @lnum > 50
    @level.restart(@lnum)
  end
  puts "You won Sokoban!"
  puts "やったね!"
end