Передача массива в качестве аргумента методу приводит либо к ошибке 0 для 1, либо к пустому массиву - PullRequest
0 голосов
/ 22 января 2019

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

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

  cards[rand(13)]
end

hand = ["four", "queen", "ace", "seven"]

def score(hand)
  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
  }

  p hand

  final_score = 0
  i = 0

  while i < hand.length
    hand[i] = values[hand[i]]
    i += 1
  end

  hand.each do |card|
    final_score += card
  end
  if final_score <= 21
    puts "You scored: " + final_score.to_s
  else
    puts "You busted with: " + final_score.to_s
  end
end

Проблема заключается в передаче массива методу;он работает, когда он локальный, но передача массива в качестве аргумента либо дает 0 для 1 ArgumentError , либо, если я использую опцию splat, пустой массив.

hand необходимобыть глобальным, чтобы другие методы могли получить к нему доступ, например, метод random_card, который в конечном итоге будет генерировать руку.

Когда hand находится внутри score, p hand показывает полный массив, аоценка 32.Там, где он есть, отображается пустой массив, и результат равен 0.

Как передать массив и сохранить сохраненные значения?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Проблема может заключаться в изменении массива - действительно, массив hand является изменяемым, поэтому, когда вы переназначаете значения в строке hand[i] = values[hand[i]], вы в конечном итоге уничтожаете исходную руку.Последующий вызов того же метода score больше не будет работать.

Вы не должны изменять его, а просто повторяете его:

VALUES = {
  'two' => 2,
  ...
}

def score(hand)
  VALUES.values_at(*hand).reduce(0, &:+)
end

def busted?(score)
  score > 21
end

def print_score(score)
  puts "You #{busted?(score) ? 'busted with' : 'scored'}: #{score}"
end

def random_card
  VALUES.keys.sample
end

hand = Array.new(4) { random_card }
# => ["four", "queen", "ace", "seven"]

your_score = score(hand)
# => 32

print_score(your_score)
# "You busted with: 32"
0 голосов
/ 22 января 2019

Проблема называется переменная область действия .Когда вы обращаетесь к переменной hand внутри метода Score, вы обращаетесь к локальной переменной, которая была передана в качестве аргумента.Но вы хотите получить доступ к переменной класса hand.

Вы можете вызвать self.hand при доступе к нему (я не рекомендую, потому что это делает ваш код еще более пахнущим.), Или реорганизовать оценку метода, чтобы вернуть массив оценок и обработать его за пределамиметод.

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