Автономный метод вызывает другой метод сам по себе

Хорошо, я серьезно отстой при передаче метода в методы всякий раз, когда я хочу вернуть что-то из метода. Не могли бы вы, ребята, объяснить, как мне пройти его. Вот мой хеш

$choosen_gun = {}
$Weapon = {
    :Bazoka => ["Bazoka",5],
    :Machine_gun => ["Machine_gun",1000],
    :Hand_gun => ["Hand_gun",24,2],
    :Double_Hand_gun => ["Double_Hand_gun",24,4],
    :Sniper => ["Sniper",12,1],
    :Shot_gun => ["Shot_gun",8,2]
}

Вот мой код для метода оружия

    def Weapon
        puts "Now it's time to select your weapon."
        puts "Please choose a weapon that is good throughout the game."
        puts "Whenever you are shortage of bullets, please reload it."
        puts "Please avoid last minute of reloading of weapon."
        puts "Now choose your weapon based on your own preferences."
        print  "\n"

        puts "Type 1"
        puts "Gun Name: Bazoka"
        puts "Description: A powerful gun that is strong with only 5 bullets."
        puts "Rating: ★ ★ ★ ★"
        num = gets.chomp.to_i

       case num 
          when 1 
          puts "Selection of Bazoka is chosen"
          puts "Loaded 5 bullets only"
          $choosen_gun[num] = $Weapon[:Bazoka]
       end      
     return num
end

После вызова метода. Пользователь выберет свое оружие и добавит его в хеш $ choosen_gun со своим номером, а он вернет число, которое пользователь вводит

Вот мой код для метода ZombieRoom

    def ZombieRoom(w)
    zombie = {
        :Construcied => [5],
        :Invader => [5],
        :Damned => [5],
        :Steampunk => [5],
        :Stoner => [5],
        :Wasted => [5],
        :Romero => [5]
    }
             puts "Welcome to the worst night mare of Zombie Room"
             puts "You will be fighting with a random zombie"


             while true 
             puts ".........."
             puts "Selecting a random zombie"
             puts "Selecting your prefered gun...."
             case w 
                   when 1 
                   $choosen_gun[1]
                   puts "Your selected gun is #{$choosen_gun[1][0]}"
                   #values = zombie.values
                   #puts values[rand(values.size)]
                   #random_zombie = zombie.keys.sample(1)
                   #puts random_zombie[   
                    random_zombie = zombie.to_a.sample(1).to_h
                    random_zombie.each do |key,value|
                    puts "Your random zombie is #{key}"
                    puts "With a health value of #{value[0]}"


                    puts "Time to take down that zombie now."
                    while true
                    puts "Type Shoot to knock it down or quit."
                    choice = gets.chomp
                    if $choosen_gun[1][1] >= 1
                        health = value[0] -= 1
                        $choosen_gun[1][1] -= 1 
                    puts "#{key} health now is #{health}"
                    else
                    puts "Please reload your gun"
                    puts "Reloading......"
                    $choosen_gun[1][1] += 5  
                    end 

                    if health == 0 
                        puts "You have defeated #{key}"
                        puts "Congrats!!!"
                        puts "We are happy for you"
                        puts "Lets begins to collect your prize"
                         CollectPrize()
                     else
                        puts "You did not defeat the #{key} yet"
                    end

                    end

                    end
       end
     end
   end

Вот мой код для метода CollectPrize

def CollectPrize
      puts "Congratulations on defeating"
      puts "We would now like to give you some case prizes"

      print "\n"

      puts "Please choose only 1 prize for yourself"
      print "\n"
      puts "Type 1"
      puts "$50,000"
      print "\n"
      puts "Type 2"
      puts "$25,000"
      print "\n"
      puts "Type 3"
      puts "$55,000"
      hoho = gets.chomp.to_f


      if hoho == 1
            puts "hehe"
      end
end

Вот как я называю мой метод

ZombieRoom(Weapon())
CollectPrize()

Теперь проблема в том, что всякий раз, когда вызывается метод CollectPrize, и я набираю свой ввод, чтобы собрать пример выигрыша 1, он выводит "$50,000". вместо того, чтобы закончить проблему, он вернулся к ZombieRoom и продолжает цикл "Тип Shoot, чтобы сбить его или выйти". Может кто-нибудь сказать мне, по крайней мере, правильный способ решить эту проблему или также как другой способ передать метод?

2 ответа

Решение

Ваш код в большом while true петля. Поскольку true всегда true, оно никогда не закончится, поэтому после вызова CollectPrize() оно просто возвращается к while заявление.

Вы можете выйти из этого, вставив break линия после CollectPrize() но есть еще один while true петля вокруг этого.

Я думаю, что вам нужно обратить более пристальное внимание на то, как вы хотите выйти из цикла.

puts "Time to take down that zombie now."
while true # <---------------- this is ALWAYS going to loop, without end
  puts "Type Shoot to knock it down or quit."
  choice = gets.chomp
  if $choosen_gun[1][1] >= 1
    health = value[0] -= 1
    $choosen_gun[1][1] -= 1 
    puts "#{key} health now is #{health}"
  else
    puts "Please reload your gun"
    puts "Reloading......"
    $choosen_gun[1][1] += 5  
  end 
  if health == 0 
    puts "You have defeated #{key}"
    puts "Congrats!!!"
    puts "We are happy for you"
    puts "Lets begins to collect your prize"
    CollectPrize()
  else
    puts "You did not defeat the #{key} yet"
  end
end

В рубине константы начинаются с заглавной буквы. Методы всегда определяются в нижнем регистре.

Попробуйте это в IRB

irb(main):001:0> def Weapon
irb(main):002:1> end
=> :Weapon
irb(main):003:0> Weapon
NameError: uninitialized constant Weapon

Чтобы решить ваши методы имени проблемы, используя правила именования ruby:
zombie_room, collect_prize и т.п.

Тогда этот код будет работать:
zombie_room(weapon())

То, что вы делаете там, на самом деле не передает метод оружия в комнату зомби. Что действительно происходит, так это то, что метод оружия выполняется, затем он возвращает значение, и результат этого значения передается методу zombie_room.

Я думаю, это то, что вы хотели.

Если вам нужно передать метод, ознакомьтесь с документацией для proc а также lambda или просто используйте блоки.

Другие вопросы по тегам