我正在用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
答案 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