Изготовление ролика для игры в кости для D & D;почему Ruby дает мне ошибку NameError? - PullRequest
0 голосов
/ 05 ноября 2019

Я очень новичок в кодировании и пытаюсь улучшить игру в кости для D & D, которую я нашел здесь . У меня есть переменная, которая определяет, является ли модификатор броска положительным или отрицательным, но по какой-то причине Ruby дает мне NameError (неопределенная локальная переменная или метод pos_or_neg для main: Object). Буду также признателен за общие советы по улучшению кода.

def roll(amount = 0, sides = 0)
  #For every die(amount), randomly generate a result limited to sides, then add all results together.
  amount.to_i.times.sum { |t| rand(1..sides.to_i) }
end

puts "Gimme some dice to roll! (e.g. 2d4, 1d12-1, etc.)"
loop do
  input = gets.chomp.to_s

  abort("May your rolls be ever natural.") if input == "exit"
  next puts "Please specify the number of dice!" if input.start_with?("d")

  #Check if modifier is positive or negative.
  pos_or_neg == true if input.include? "+"; pos_or_neg == false if input.include? "-"

  #Replace everything but numbers with spaces in input, then split.
  amount, sides, mod = input.tr("^0-9", " ").split

  #Calculate final result using pos_or_neg to determine modifier.
  pos_or_neg == true ? fin = roll(amount, sides) + mod.to_i : roll(amount, sides) - mod.to_i
  puts fin

end

Я прошу прощения, если такие вещи часто спрашивают.

1 Ответ

1 голос
/ 05 ноября 2019

Что Юрий сказал в комментарии к вашему вопросу, вы сравниваете (==) вместо присваивания значения (=).

Но также, если нет ни '+', ни '-'в input, тогда pos_or_neg не будет определено. Вы можете изменить строку:

 pos_or_neg == true if input.include? "+"; pos_or_neg == false if input.include? "-"

с помощью:

 pos_or_neg = !input.include?('-')

(при условии, что случай, когда нет ни «+», ни «-», принимается как положительный)

И (я думаю) было бы более читабельным, если вы измените эту строку:

pos_or_neg == true ? fin = roll(amount, sides) + mod.to_i : roll(amount, sides) - mod.to_i

с

  fin = roll(amount, sides) + mod.to_i * (pos_or_neg ? 1 : -1)
...