2012-10-04 4 views
-1

Je suis en train de faire une simulation Blackjack, ci-dessous est le code ...NoMethodError: méthode non définie 'hit' pour

one_suit = [2,3,4,5,6,7,8,9,10,10,10,10,11]; #the value of the cards for blackjack 
full_deck = one_suit*4; #clubs, diamonds, hearts and spades 
$deck = full_deck; #start off the game with a full deck 

class Player 
    attr_accessor :ace_count 
    attr_accessor :hand_value 

    def initialize(ace_count,hand_value) 
    @ace_count = ace_count; 
    @hand_value = hand_value; 
    end 

    def self.hit 
    choice_of_card = rand($deck.length); #choose a random card out of the deck 
    drawn_card = $deck[choice_of_card]; #draw that random card from the deck 
    if drawn_card != 0 #if there is a card there 
    $deck[choice_of_card] = 0; #remove that card from the deck by making the space blank 
    if drawn_card == 11 #if you draw an ace 
     self.ace_count += 1; 
    end 
    self.hand_value += drawn_card ; 
    else hit; #if there is no card at that space then redraw (recursion) 
    end 
    end 

end 

player1 = Player.new(0,0); 
player1.hit; 

Cependant, quand je le lance-je obtenir la sortie suivante:

NoMethodError: undefined method `hit' for # (root) at C:\Users\Ernst\Documents\JRuby\blackjack.rb:30

Qu'est-ce que je fais mal? La méthode est définie dans la classe.

Répondre

2

hit est une méthode de classe.

Comment pouvez-vous l'appeler avec un objet?

Lorsque vous écrivez self .method, il est défini comme une méthode de classe.

Pour écrire une méthode d'objet ou d'une instance juste

utilisation def method .. end

dans votre cas

def hit 
## remove `self` identifier from the attributes. 
## e.g. ace_count += 1; 
end 

Si vous voulez appeler des méthodes de classe, vous pouvez utiliser

Player.hit et pasplayer_obj.hit

Mais je suppose que votre besoin est d'appeler des méthodes objet/instance, ce que vous pouvez faire en supprimant self identificateur.

+0

Merci beaucoup! –

+0

J'espère que vous avez compris l'erreur. –

Questions connexes