Как заставить мою игру работать правильно (система боя)? - PullRequest
0 голосов
/ 07 июня 2018

Будучи новичком в обучении программированию, очень полезно иметь такое поддерживающее сообщество!

У меня проблемы с работой этой «типовой» игры.Я пытаюсь разработать боевую систему, в которой игрок сталкивается с противниками по мере прохождения через несколько комнат.По какой-то причине, когда я запускаю его в командной строке, он просто отображает «ты умер», а затем завершается.Я не уверен, куда идти отсюда.

Любая помощь будет принята с благодарностью.

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 голосов
/ 07 июня 2018

Итак, создается впечатление, что у вас сложилось впечатление, что код на верхнем уровне класса запускается при создании экземпляра класса (Class.new).Это не вариант!Все на верхнем уровне класса запускается так, как оно определено.

Простейшим решением этой проблемы было бы добавить весь код на верхнем уровне каждого класса в метод с именем initialize thisэто то, что запускается, когда создается экземпляр класса.

Кроме того, вы используете свой класс Death, как если бы это был метод.Вы можете изменить его с class Death на def death или изменить свои вызовы на Death.new после перемещения кода в метод initialize (это не обычный шаблон, но будет работать).

0 голосов
/ 07 июня 2018

Это ломается, потому что Смерть - это класс, и весь код в нем находится в теле класса.Это означает, что этот код будет выполняться, когда класс определен, а не во время вызова 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, вам также понадобится определить метод смерти врага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...