2014-01-26 2 views
0

Я довольно новичок в Ruby и попытался исследовать эту проблему. Вот код до сих пор. Кажется, у меня нет этой проблемы с вызовом пользовательского объекта (user.deal_one (mydeck.deal_card)), но когда я вызываю его у дилера, я получаю эту ошибку. Объект дилера имеет одинаковые переменные экземпляра и не уверен, почему он вызывает метод '< <'.Проблема с ошибкой Ruby: неопределенный метод `<< 'для nil: NilClass (NoMethodError)

Вот полная ошибка: blackjackOOP.rb: 32: в deal_one': undefined method < < 'для ноль: NilClass (NoMethodError) от blackjackOOP.rb: 106: в `'

class Deck 
    def initialize 
    @deck = [] 
    @suit = ["Clubs", "Diamonds", "Hearts", "Spades"] 
    @value = [2, 3, 4, 5, 6, 7, 8, 9, 10, "Jack", "Queen", "King", "Ace"] 
    @count = 0 

    @value.each do |x| 
     @suit.each do |y| 
     @deck[@count] = [x, y] 
     @count += 1 
     end 
    end 
    @deck.shuffle! 
    end 

    def deal_card 
    @card = [] 
    @card << @deck.pop 
    @card 
    end 

    def show_deck_size 
    puts @deck.size 
    end 
end 

module Hand 
    def deal_one(card) 
    @hand << card 
    end 

    def total 
    @total = 0 
    @hand.each do |card| 
     card.each do |val, suit| 
     if val == "Jack" || val == "Queen" || val == "King" 
      @total += 10 
     elsif val != "Ace" 
      @total += val 
     elsif val == "Ace" 
      if @total > 10 
      @total += 1 
      else 
      @total += 11 
      end 
     end 
     end 
    end 
    end 
end 

class Player 
    include Hand 

    def initialize(name) 
    @name = name 
    @hand = [] 
    end 

    def hit_stay 
    puts "#{@name} has #{show_hand} for a total of #{@total}" 
    end 

    def show_hand 
    @hand.each do |card| 
     card.each do |val, suit| 
     print "#{val} of #{suit} " 
     end 
    end 
    end 
end 

class Dealer 
    include Hand 

    def initalize 
    @name = "Dealer" 
    @hand = [] 
    end 
end 

def say(n) 
    puts "=> #{n}" 
end 



say("Hello would you like to play some blackjack? Great!") 
say("What is your name?") 
name = gets.chomp 

mydeck = Deck.new 
user = Player.new(name) 
dealer = Dealer.new 

say("Welcome #{name}! Let's play!") 


#deal hands to dealer and player 
user.deal_one(mydeck.deal_card) 
user.deal_one(mydeck.deal_card) 
dealer.deal_one(mydeck.deal_card) 
+2

[Примите ответ] (http://stackoverflow.com/questions/21369303/issue-understanding-ruby-error-undefined-method-for-nilnilclass-nomethod/21369424#21369424), если это вам помогло. –

ответ

3

Существует опечатка в вашем классе дилера.

Вы написали def initalize, и это должно быть def initialize.

+0

У вас очень хороший глаз. :) Отличный +1 –

+0

@ArupRakshit. Способ поиска таких вещей - это поместить его в подрезной сеанс и посмотреть, как выглядят объекты. При вызове метода Player.new результирующий объект очень сильно отличается от объекта торговца, который возникает в результате сеанса Dealer.new. Что выделяется, так это то, что dealer.hand не инициализирован. Это оставляет лишь несколько мест, которые могут быть действительной ошибкой. – FlyingFoX

+0

Я никогда не использовал pry .. –

Смежные вопросы