【问题标题】:Ruby Character Creation for text RPG用于文本 RPG 的 Ruby 角色创建
【发布时间】:2016-02-01 10:33:12
【问题描述】:

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

【问题讨论】:

  • 如果您还有其他问题,请将其创建为新问题。如果某个答案解决了您的问题,请将其选为接受的答案。

标签: ruby text


【解决方案1】:

这里有两个问题。首先是你拼错了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 转换为字符串之外,它什么也不做——name.to_s 是一个更好的解决方案,但这是不必要的无论如何,因为我们知道name 已经是一个字符串。 "#{whatever}"总是是不必要的; whatever.to_s 有时是必要的。

您会注意到的另一件事是print player_one 打印出类似的内容:

#<Character:0x007fc23b88bf08>

...这可能不是您所期望的。那是因为 Ruby 不知道如何以人类可读的方式打印 Character 对象。您可以通过定义to_s 方法来告诉它如何操作。例如:

class Character
  # ...

  def to_s
    "#{name} (#{race} - #{desc})"
  end
end

对于您问题中的输入,这将产生以下结果:

puts player_one
# => havatr (elf - i look like me)

(都是小写,因为您在每个输入上都调用了downcase,这可能是您实际想要的行为,也可能不是。)

【讨论】:

  • 感谢您的帮助。我现在唯一遇到的就是将它放在屏幕上#Character(0x21a04b8)。有没有办法转换这个?
  • 感谢您的所有帮助,我在上面发布了我的问题的另一部分。
  • 这超出了您原始问题的范围。请发布一个新问题。
【解决方案2】:

看起来这里有一个简单的错误:

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

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多