文本RPG的Ruby角色创建

时间:2016-01-29 17:34:57

标签: ruby text

首先,我只是想说明我对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)

2 个答案:

答案 0 :(得分:2)

这里有两个问题。首先是你拼错了initialize。第二,不是保存用户在abc中输入的值,而是将每个值保存在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