Программа Ruby возвращает ошибку «неявное преобразование строки в целое число (TypeError)» - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь создать копию Go Fish, чтобы помочь мне узнать больше о массивах и хешах, а также о том, как структурировать данные.Я на второй день, и у меня есть то, что выглядит намного ближе к конечной цели.Имейте в виду, я новичок в этом.В любом случае, вот проблема, с которой я сталкиваюсь:

=> gofish.rb: 21: в `player_turn ': нет неявного преобразования String в Integer (TypeError)

Я понимаю, почему я получаю ошибку, но я не могу понять, как использовать метод .shift без указания номера индекса.Я хотел бы выбрать объект для смещения вместо этого на основе значения.Итак, если я правильно угадаю, есть ли у вас «туз пик», карта удаляется из массива cpu_hand и добавляется в массив my_hand.С учетом сказанного, я просто хотел бы узнать, как лучше всего это сделать.

Вот мой сценарий:

card_values = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven',
 'eight', 'nine', 'ten', 'jack', 'queen', 'king']
suits = ['spades', 'diamonds', 'hearts', 'clubs']

# creates array objects with every value and suit possible (full deck)
card_deck = card_values.product(suits).collect{|card, suit| "#{card} of #{suit}"}

def print_hand
  puts "Your hand: #{@my_hand.join(', ')}."
end

def player_turn
  puts "You go first!"
  puts "Do you have a..."
  puts @cpu_hand.join(', ')
  print "> "
  @card = $stdin.gets.chomp.downcase
  # if cpu has the card requested give it to the player and add to their array
    if @cpu_hand.include?(@card)
      puts "Ahhh...you got me. Here you go!"
      @my_hand.shift(@cpu_hand[@card]) # ****Here's the error(line:21) 
      print_hand
    else
      puts "Go fish!"
      @my_hand.shift(@card_deck[1])
      print_hand
    end
end


puts "There are #{card_deck.length} cards in this deck."
puts "Welcome to Go-Fish."
print "Your name please: "
player_name = $stdin.gets.chomp.capitalize

puts "Ok #{player_name}, lets get this deck shuffled..."
#sleep(1)
# shuffles card_deck using .shuffle method
card_deck = card_deck.shuffle
puts "Cards are perfectly shuffled!"
#sleep(1)
puts "Dealing cards..."
#sleep(1)
# assigns first 7 cards to user, removes from card_deck
@my_hand = Array.new
@my_hand = card_deck.shift(7)
# assigns next 7 cards to CPU, removes from card_deck
@cpu_hand = Array.new
@cpu_hand = card_deck.shift(7)

print_hand

until card_deck.length < 1 || @cpu_hand.length < 1 || @my_hand.length < 1
  player_turn
end

puts "GAME OVER!"

1 Ответ

0 голосов
/ 24 ноября 2018

В вашей строке ошибки,

@my_hand.shift(@cpu_hand[@card])

ваш сбой вызван попыткой индексации в массив @cpu_hand строкой (@card).Вторая проблема - попытка вызова shift с использованием строки в качестве параметра.Оба из них должны быть целыми числами.shift удаляет первый элемент (или первые n элементы, если указан целочисленный параметр);это кажется подходящим для получения элемента из card_deck, но вы бы хотели, чтобы push, unshift или << добавили элемент к @my_hand.Вам также понадобится метод для удаления указанной карты из @cpu_hand, delete:

if @cpu_hand.include?(@card)
  puts "Ahhh...you got me. Here you go!"
  @my_hand << @cpu_hand.delete(@card) # transfer a card from CPU to my hand
  print_hand
else
  puts "Go fish!"
  @my_hand << card_deck.shift # take the first card from the deck (could also be pop?)
  print_hand
end

Однако card_deck не является глобальным, как другие ваши переменные, поэтому вам необходимопередайте его в функцию и измените заголовок функции на def player_turn card_deck или сделайте его глобальным.Но создание всего глобального, как правило, считается плохим дизайном, потому что данные могут быть видоизменены из любого места, что приводит к трудным для поиска ошибкам.Подумайте о написании классов, таких как Hand и GoFish (например), которые инкапсулируют всю логику, необходимую для представления повторно используемых частей вашей игры.

Я рекомендую прочитать документы array .Вы обязательно найдете несколько классных методов и выучите несколько лакомых кусочков.

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