我为了学习 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_reader
或 attr_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/