当我调用哈希值时,如何将变量设置为键



当用户输入" hit"时,它们将被分配给一个值。我已经将卡设置为钥匙,并将其定义为哈希值的值,每次我尝试称呼它时,都不会放任何东西!

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

最简单的只是更新

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

to

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

原因是 card_value[:card]试图从card_value哈希hash它们卡键中获取。

您的random_card函数从其体内定义的卡数组中返回一个"随机"字符串值,是字符串,您会遇到相同的错误,因为card_value中的键是符号,因此您需要转换该结果符号。



回答DX7不错的添加。

您可以只声明一个卡_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

您还可以用所有卡定义一个常数,用钥匙构建一个甲板并洗牌甲板,弹出一张卡片:这避免了两次卡片。

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

我会尝试在不更改算法的情况下回答您。

问题是puts "point #{card_value[:card]}"。您在哈希card_value上没有该 :card键。考虑到您想从先前获得随机卡中获得分数,您需要将该卡传递给分数方法,然后获得分数。

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将字符串转换为符号。

最新更新