如何让我的游戏正常运行(战斗系统)?

时间:2018-06-07 15:30:04

标签: ruby

作为一名学习编程的初学者,在那里建立这样一个支持性的社区是非常有帮助的!

我无法获得此样本'示例'游戏工作。我正在努力开发一种战斗系统,当玩家进入许多房间时,玩家会碰到对手。出于某种原因,当我在命令提示符下运行它时,它只显示"你死了#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

2 个答案:

答案 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(这不是正常模式,但可以正常工作)。