作为一名学习编程的初学者,在那里建立这样一个支持性的社区是非常有帮助的!
我无法获得此样本'示例'游戏工作。我正在努力开发一种战斗系统,当玩家进入许多房间时,玩家会碰到对手。出于某种原因,当我在命令提示符下运行它时,它只显示"你死了#34;然后退出。我不知道从哪里开始。
非常感谢任何帮助。
class Player
attr_accessor :hit_points, :attack_power
def initialize(hit_points, attack_power)
@hit_points = hit_points
@attack_power = attack_power
end
def alive?
@hit_points < 1
death
end
def hurt
@hit_points -= Opponent.attack_power
end
def print_status
puts "*" * 80
puts "HP: #{hit_points}/#{MAX_HIT_POINTS}"
puts "*" * 80
end
end
class Death
puts "You died"
exit(1)
end
class Opponent
def initialize (hit_points, attack_power)
@hit_points = hit_points
@attack_power = attack_power
puts "you come across this awful opponent"
end
def alive?
@hit_points < 1
death
end
def hurt
@hit_points -= player.attack_power
end
def interact(player)
while player.alive?
hurt
break if @hit_points < 1
alive?
end
if player.alive?
print "You took #{player_damage_taken} damage and dealt #{player_damage_done} damage, killing your opponent."
room
else
death
end
end
end
class Room
puts "you are now in the scary room, and you see an opponent!"
puts "You come accross a weaker opponent. It is a fish."
puts "Do you want to (F)ight or (L)eave?"
action = $stdin.gets.chomp
if action.downcase == "f"
fish = Opponent.new(2, 1)
fish.interact
else
death
end
end
Player.new(200, 1)
Room.new
class Engine
end
答案 0 :(得分:2)
这是破坏因为死亡是一个类,其中的所有代码都在类的 body 中。这意味着在定义类时将执行此代码,而不是在调用death
时执行。
您尚未定义名为death
的方法。
因为Death
类很小,所以在其中命名一个停止游戏的方法会很尴尬(Death.death,Death.die,Death.run,Death.execute ......不是很好),并且您不需要类的任何优点(例如存储在实例变量中的多个实例或属性),我建议您将death
操作作为Player
类的一部分。
class Player
# ...
def die
puts "You died"
exit(1)
end
end
然后当您调用death
(当前未定义的方法)时将其替换为player.die
。
正如@Kennycoc所指出的那样,你也需要为敌人的死亡定义一种方法。
答案 1 :(得分:0)
所以,似乎你的印象是在实例化类(Class.new
)时运行类顶级代码。不是这种情况!该类顶层的所有内容都按照定义运行。
使这个运行的最简单的解决方法是在名为initialize
的方法下添加每个类顶层的所有代码。这是在实例化类时运行的。
此外,您正在使用Death
类,就像它是一种方法一样。您可以将其从class Death
更改为def death
,也可以在将代码移至Death.new
方法后将调用更改为initialize
(这不是正常模式,但可以正常工作)。