ruby - 在另一个类的方法中使用一个类的方法?

标签 ruby class methods

我为了学习 OOP 而创建了这个游戏,但我在其中的一部分上遇到了麻烦。这是导致我出现问题的原因:

我有两个类(class)。在 Player 类的第 3 行,我有一些代码可能是错误的,但基本上,我想做的是使用盔甲来修改玩家受到的伤害。不过,我遇到了一个错误:“nil:NilClass (NoMethodError) 的未定义方法‘保护’

我的另一个职业是护甲。我认为问题可能与我在 Armor 中提到保护时调用 @armor.protection 并且在 Player 中提到@armor 时调用有关,但我不确定如何解决此问题。我在下面添加了我认为与我的问题相关的所有代码。就像我说的,我在这方面真的很陌生,所以请使用菜鸟可以理解的术语。

class Player
  def equip(armor)
    @armor = armor
  end

  def hit(damage)
    #damage = damage - @armor.protection
    @health -= damage
  end
end  

class Armor
  def initialize(name, protection)
    @protection = protection
  end
end

编辑:添加了额外的代码来显示我为澄清所做的所有事情。 不过,我不希望任何人阅读我所拥有的所有内容。 :S 这可能是可怕的和咆哮起来。 :P

class Player 

  def initialize(name, health) 
    @name = name 
    @health = health 
  end 

  def equip(armor) 
    @armor = armor 
  end 

  def health 
    @health 
  end 

  def health=(value) 
    @health = value 
  end 

  def hit(damage) 
damage = damage - @armor.protection 
    @health -= damage 
  end 

  def dead? 
if @health <= 0 
return true 
elsif @health > 0 
return false 
end 
  end 

  def name 
    @name 
  end 

  def attack(target) 
    damage = rand(30) 
    puts "#{@name} attacks #{target.name}" 
target.hit(damage) 
puts "#{@name} hits #{target.name} for #{damage} damage." 
  end 
end 

class Armor 
  def initialize(name, protection) 
  @protection = protection 
  end 
end 


player1 = Player.new("Melanie", 100) 
player2 = Player.new("a Monster", 200) 
shirt = Armor.new('shirt', 4) 
player1.equip(shirt) 

while player1.dead? == false && player2.dead? == false 
  player1.attack(player2) 
    if player2.health > 0 
      puts "#{player2.name}'s health is at #{player2.health}." 
    elsif player2.health <= 0 
puts "#{player2.name} has no health." 
end 
  player2.attack(player1) 
    if player1.health > 0 
      puts "#{player1.name}'s health is at #{player1.health}." 
    elsif player1.health <= 0 
puts "#{player1.name} has no health." 
end 
end 

if player1.health > player2.health 
  puts "#{player2.name} is dead." 
  puts "#{player1.name} wins." 
elsif player2.health > player1.health 
  puts "#{player1.name} is dead." 
  puts "#{player2.name} wins." 
elsif player2.health == player1.health 
  puts "#{player1.name} and #{player2.name} killed each other." 
end 

最佳答案

如果您的 Armor 类有一个 protection 方法,它就可以正常工作。然而它并没有,所以即使你从 Armor 类中调用它,你也会得到同样的错误。要定义它,您可以使用 attr_readerattr_accessor 或手动定义它。

class Armor
  attr_accessor :protection

  def initialize(name, protection)
    @protection = protection
  end
end

class Armor
  def initialize(name, protection)
    @protection = protection
  end

  def protection
    @protection
  end
end

关于ruby - 在另一个类的方法中使用一个类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4836764/

相关文章:

c# - ViewModel 调用用户控件(Web 浏览器)的方法

java - 如何从 Java 类中的另一个方法调用我的方法?

java - 在一种方法中设置变量的值并在另一种方法中打印

ruby-on-rails - Ruby on Rails 路由 : Namespace with more params

ruby - 从尾部正斜杠中删除所有内容

c++ 纯虚类的前向声明

html - 通过使用 javascript 在类中添加一个词来单击按钮时为菜单添加/删除 [toggle]

C++ typedef 结构与类

ruby - 尝试安装 ruby​​ 1.9.3

ruby-on-rails - 将 ruby​​ 参数合并到字符串中会引发错误的 url 错误