在内部重启Ruby程序

时间:2015-01-17 20:24:47

标签: ruby application-restart

我正在用Ruby编写一个非常简单的地下城冒险游戏(为newb练习)。我希望在整个过程中按名称来说明玩家,所以我很自然地想确保如果玩家将空名称传递给我的玩家初始化方法,如果告诉他们他们不能这样做,然后提示他们重试。

class Player
    attr_accessor :name, :location

    def initialize(name)
        if name.empty? == false
            @name = name
        else
            puts "You did not enter your name! Try again, please"
            load 'game.rb'
        end
    end
end

文件名是' game.rb'因此,每当玩家决定不输入他们的名字时,我就会在这里重新加载整个文件。这是愚蠢的......

它有效,但最糟糕的方式......我必须是聪明的'关于我退出程序的地方,以便玩家可以避免这样的事实:我基本上对所有人都进行了所有的启动,并且每当玩家开始新游戏并且忽略输入他们的名字时在游戏中启动游戏。例如,如果他们没有注意到他们需要输入他们的名字3次,因为他们没有注意,我实际上有4个游戏正在运行(原始,3则是由于没有输入他们的名字而提示并且当他们厌倦了比赛时他们要么结束每一场比赛,否则我必须基本上在一个关键词上退出整个比赛。

我的问题是:有没有办法写出我的错误"你没有输入......"退出当前的游戏会话,并重新启动游戏?我真正想要做的就是确保空字符串不会传递给我的初始化方法,可能是通过引发异常,然后在脚本开头重新开始而不需要游戏中的游戏。

以下链接指向完整代码,以获取更多信息:http://repl.it/8QY

3 个答案:

答案 0 :(得分:3)

如果没有看到整个游戏结构,很难知道,但主文件看起来像

game_initialized = false
while ! game_initialized
  begin
    # here, initialize the game, including initialization
    game_initialized = true
  rescue NoNameError
    # do nothing, but it will restart the game
  end
end
# now play the game

在构造函数中,添加

class NoNameError < Exception
end

class Player
  attr_accessor :name, :location

  def initialize(name)
    if name.empty? == false
      @name = name
    else
      puts "You did not enter your name! Try again, please"
      raise NoNameError
    end
  end
end

这应该让你去。

答案 1 :(得分:2)

我认为文森特的答案很好,它肯定比我的更好,但一个简单的方法就是在游戏开始时做这样的事情:

print "Welcome!  "
in_name = ""
while true
  puts "What is your name?"
  in_name = gets.chomp
  in_name.empty? ? (puts "You must enter a name before continuing") : break
end

示例:

Welcome!  What is your name?

You must enter a name before continuing
What is your name?
Anthony

答案 2 :(得分:1)

如果你想让你的逻辑在播放器中,你可以尝试这样的事情:

class Player
  attr_accessor :name, :location

  def initialize(name)
    @name = keep_asking_for_name_if_not_already_entered(name)
  end

  def keep_asking_for_name_if_not_already_entered(name)
    return name unless name.empty?
    loop do
      puts 'You did not enter your name! Enter a name, please:'
      name = gets.chomp
      break(name) unless name.empty?
    end
  end
end