首先,我只是想说明我对Ruby很新。我是Dnd的拥抱迷,我想根据Dnd规则创建一个文本冒险游戏。我遇到的问题(我甚至不知道是否可能)是我正在创建一个字符类,我希望在类外部分配变量。原因是我不希望玩家输入:
character.new("Havatr", "elf", "tall and lean", "etc")
这只是实际创建文件之前的一个实验。这就是我到目前为止所做的:
class Character
attr_reader :name, :race, :description
def initalize (name, race, description)
@name = name
@race = race
@description = description
end
end
def prompt
print "Enter Command >"
end
puts "What is your name?"
prompt; next_move = gets.chomp.downcase
puts "what is your race?"
prompt; next_move = gets.chomp.downcase
puts "What do you look like?"
prompt; next_move = gets.chomp.downcase
player_one = Character.new("#{a}","#{b}","#{c}")
print player_one
如果有办法,我可以获得帮助,如果有更好的方法,那么我正在尝试请告诉我。这背后的想法是尝试将类转储到yaml文件中以创建字符保存。
当我运行代码时,这就是它的样子:
What is your name?
Enter Command > Havatr
What is your race?
Enter Command > Elf
What do you look like?
Enter Command > I look like me
C://core_rules0.0.1/Characters.rb:27:in '': undefined local variable or method 'a' for main:Object (NameError)
答案 0 :(得分:2)
这里有两个问题。首先是你拼错了initialize
。第二,不是保存用户在a
,b
和c
中输入的值,而是将每个值保存在next_move
中。这很容易解决:
puts "What is your name?"
prompt; name = gets.chomp.downcase
puts "What is your race?"
prompt; race = gets.chomp.downcase
puts "What do you look like?"
prompt; desc = gets.chomp.downcase
player_one = Character.new(name, race, desc)
print player_one
您会注意到我Character.new(name, race, desc)
而不是Character.new("#{a}", "#{b}", "#{c}")
。首先,我使用了更多的描述性名称(单字符变量名称几乎总是一个不好的选择,除了像i
这样的众所周知的约定来表示循环中的迭代次数)。其次,我做了name
而不是"#{name}"
,因为后者实际上并没有做任何事情。 #{...}
是Ruby中的字符串插值。这是一种将值放入字符串的方法,例如"Hello #{name}"
。但是当你在字符串中没有其他内容时,就像在"#{name}"
中一样,除了将a
转换为字符串之外,它不会执行任何操作 - {{1}是一个更好的解决方案,无论如何这是不必要的,因为我们知道name.to_s
已经是一个字符串。 name
总是不必要; "#{whatever}"
有时必要。
您注意到的另一件事是whatever.to_s
打印的内容如下:
print player_one
......这可能不是你所期望的。这是因为Ruby不知道如何以人类可读的方式打印您的Character对象。您可以通过定义#<Character:0x007fc23b88bf08>
方法来告诉它如何。例如:
to_s
对于您问题中的输入,这将产生以下结果:
class Character
# ...
def to_s
"#{name} (#{race} - #{desc})"
end
end
(它全是小写的,因为你在每个输入上调用了puts player_one
# => havatr (elf - i look like me)
,这可能是你实际想要的行为,也可能不是。
答案 1 :(得分:0)
看起来这里有一个简单的错误:
class Character
attr_reader :name, :race, :description
def initalize (name, race, description)
@name = name
@race = race
@description = description
end
end
def prompt
print "Enter Command >"
end
puts "What is your name?"
prompt; a = gets.chomp.downcase
puts "what is your race?"
prompt; b = gets.chomp.downcase
puts "What do you look like?"
prompt; c = gets.chomp.downcase
player_one = Character.new("#{a}","#{b}","#{c}")
print player_one
您将提示的结果设置为变量next_move