Как установить переменную в качестве ключа при вызове моего хеш-значения? - PullRequest
0 голосов
/ 11 мая 2019

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

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

  cards[rand(13)]
end

def score
  card_value = {
  two: 2,
  three: 3,
  four: 4,
  five: 5,
  six: 6,
  seven: 7,
  eight: 8,
  nine: 9,
  ten: 10,
  jack: 10,
  queen: 10,
  king: 10,
  ace: 11,
}
puts "point #{card_value[:card]}"
end

def move
  while true
    puts '"hit" or "stick"'
    input = gets.chomp
    if input == "hit"
      puts card = random_card
      score
    end
    break if input == "stick"
  end
end

Когда пользователь вводит «хит», на выходе должна быть случайная карта и точка, которая назначается этой карте, например, три точки 3

Ответы [ 3 ]

2 голосов
/ 11 мая 2019

Самое простое - просто обновить

puts "point #{card_value[:card]}"

до

puts "point #{card_value[random_card.to_sym]}"

Причина в том, что card_value[:card] пытается получить из хеша card_value ключ карты, который неСуществовать.

Ваша функция random_card возвращает "случайное" строковое значение из массива cards, определенного в его теле, и, будучи строкой, вы получите ту же ошибку, что и ключи в card_value:символов, поэтому вам нужно преобразовать этот результат в символ.



Ответ на красивое дополнение dx7.

Вы можете просто объявить хеш CARD_VALUES, содержащий имена карт иточек, которые вы можете затем набрать с помощью Array#sample, чтобы избежать добавления бесполезной переменной экземпляра для карты и необходимости передавать ее в качестве аргумента метода при вызове random_card:

CARD_VALUES = { two: 2, three: 3, four: 4, five: 5, six: 6, seven: 7, eight: 8, nine: 9, ten: 10,
               jack: 10, queen: 10, king: 10, ace: 11 }

def random_card
  CARD_VALUES.to_a.sample
end

def move
  loop do
    puts '"hit" or "stick"'
    input = gets.chomp
    if input == 'hit'
      card, point = random_card
      puts "card: #{card}"
      puts "point: #{point}"
    end
    break if input == 'stick'
  end
end

move
0 голосов
/ 12 мая 2019

Я постараюсь ответить вам без изменения вашего алгоритма.

Проблема в puts "point #{card_value[:card]}".У вас нет этого ключа :card на хэш card_value.Учитывая, что вы хотите получить оценку по ранее полученной случайной карте, вам нужно передать эту карту методу оценки, а затем получить оценку.

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

  cards[rand(13)]
end

def score(card)
  card_value = {
  two: 2,
  three: 3,
  four: 4,
  five: 5,
  six: 6,
  seven: 7,
  eight: 8,
  nine: 9,
  ten: 10,
  jack: 10,
  queen: 10,
  king: 10,
  ace: 11,
}
puts "point #{card_value[card.to_sym]}"
end

def move
  while true
    puts '"hit" or "stick"'
    input = gets.chomp
    if input == "hit"
      puts card = random_card
      score(card)
    end
    break if input == "stick"
  end
end

move

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

0 голосов
/ 12 мая 2019

Вы также можете определить константу со всеми картами, построить колоду с ключами и перетасовать колоду, подбрасывая карту: это позволяет избежать получения карты дважды.

CARDS = {two: 2,three: 3,four: 4,five: 5,six: 6,seven: 7,eight: 8,nine: 9,ten: 10,jack: 10,queen: 10,king: 10,ace: 11}

deck = CARDS.keys # it's an array with all the keys
# score = 0 # just in case
loop do
  puts '"hit" or "stick"'
  input = gets.chomp
  if input == "hit"
    puts card = deck.shuffle!.pop # so you are removing the card from the deck
    puts value = CARDS[card]
    # puts score += value # just in case
  end
  break if input == "stick"
end
# puts score # just in case
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...