Как я могу получить случайное число в Ruby (v2.6.3) - PullRequest
2 голосов
/ 04 февраля 2020

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

def random_card
  cards = ["two", "three", "four", "five", "six", "seven",
           "eight", "nine", "ten",
           "jack", "queen", "king", "ace"]

  cards[rand(13)]
end

И я попытался создать метод, который добавляет карты в руку игроков, вызывая random_card метод каждый раз:

def move(random_card)
  player_hand = []
  while true do
    puts "Make a move. Enter 'hit' or 'stick' "
    choice = gets.chomp
    if choice == "stick"
      break
    elsif choice == "hit"
      # this is currently giving me the same card for each "hit"
      # but a different one each time I run the code.
      player_hand.push(random_card)
    end
  end
  # TODO change this to return
  puts player_hand
end

Каждый раз, когда я "бью" одну и ту же карту, добавляется в руку, мой вопрос состоит в том, как предотвратить это и как метод возвращает "новую" случайную карту каждый раз, когда мы бежим через l oop.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 04 февраля 2020

Вы использовали имя random_card для двух разных вещей: 1) метод, данный вам вашим инструктором; и 2) имя аргумента вашего move метода.

Второе использование определяет локальную переменную, которая маскирует (или скрывает) имя метода. Другими словами, в методе move random_card относится к любому значению, которое вы передали, когда вызывали move. Он не вызывает метод.

Вот простая иллюстрация:

def foo
  %w(hi hey howdy)[rand 3]
end

def bar1
  puts foo
end

def bar2(foo)
  puts foo
end

5.times { bar1 }  # produces a random selection of hi's, hey's, and howdy's
puts
5.times { bar2 "Help!  I'm stuck!" }  # prints the passed message 5 times
puts
5.times { srand 12345; bar1 }  # produces "howdy" 5 times

Учитывая то, что вы показали, вы, вероятно, не Тебе не нужен аргумент move. Если да, дайте ему свое имя. Также убедитесь, что вы не возитесь с srand где-то еще в вашей программе.


Еще один вариант - указать, что вы хотите использовать метод, а не аргумент с тем же именем, используя скобки. В приведенном выше примере измените bar2 на:

def bar2(foo)
  puts foo()
end

Пустые скобки проясняют, что это вызов метода foo, а не ссылка на (теперь не использованный) аргумент foo .

1 голос
/ 05 февраля 2020

вот простое решение вашей проблемы

def random_card
  cards = ["two", "three", "four", "five", "six", "seven",
           "eight", "nine", "ten",
           "jack", "queen", "king", "ace"]

  cards[rand(13)]
end

def move(callback)
  player_hand = []
  while true do
    puts "Make a move. Enter 'hit' or 'stick' "
    choice = gets.chomp
    if choice == "stick"
      break
    elsif choice == "hit"
      player_hand.push(callback.call)
    end
  end
  puts player_hand
end

, и вы можете вызвать этот метод как

move(method(:random_card))

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