2012-02-22 16 views
6

मैं कई कक्षाओं के साथ एक कार्ड गेम बना रहा हूं। वर्तमान में, मैं $shuffled_deck, $players_hand, और $dealers_hand चर रखने के लिए वैश्विक चर का उपयोग कर रहा हूं, लेकिन वैश्विक चर (शायद, अनावश्यक रूप से) का उपयोग करते समय मुझे चिंता है और इंस्टेंस चर का उपयोग करना पसंद करेंगे।मैं रुबी कक्षाओं के बीच चर कैसे पास करूं?

मैं चारों ओर पढ़ रहा हूं, लेकिन वास्तव में कुछ भी क्लिक नहीं कर रहा है। क्या कोई मुझे इस दिशा में सही दिशा में इंगित करने में मदद कर सकता है?

उदाहरण चर का उपयोग करके मैं @players_hand और @dealers_hand को अन्य वर्गों में उपयोग करने में सक्षम होने में सक्षम नहीं हूं। उदाहरण के लिए, मेरे पास Player कक्षा से @players_hand है। मेरे पास Dealer कक्षा एक कार्ड खींचती है, लेकिन मैं @players_hand को Dealer कक्षा में दो साथ जोड़ने के लिए नहीं खींच सकता।

मेरे वर्तमान कोड है:

class Blackjack 

    def initialize 
    @player = Player.new 
    @dealer = Dealer.new 
    end 
end 

class Dealer 

    def initialize 
    @deck = Deck.new 
    $dealers_hand = 0 
    end 

    def hit_dealer 
    @deck.hit_dealer 
    end 

    def hit_player 
    @deck.hit_player 
    end 

    def draw_card 
    @hit = $shuffled_deck 
    end 

    def shuffle 
    @deck.suits 
    end 
end 

class Player 

    def initialize 
    $players_hand = 0 
    end 
end 

class Deck 

def suits 
    #code that shuffled the deck.. 
    $shuffled_deck = @shuffled_deck 
end 

def hit_player 
    @hit = $shuffled_deck.pop 
end 

def hit_dealer 
    @hit = $shuffled_deck.pop 
end 

end 
+0

अच्छा सवाल की तरह कर सकते हैं, लेकिन काफी अवधारणाओं के लिए के माध्यम से जाना का एक बहुत होगा एक पूरा जवाब प्राप्त करें। उम्मीद है कि किसी को एक अच्छा संदर्भ दस्तावेज पता चलेगा, लेकिन आपको निश्चित रूप से ** encapsulation ** पर एक संभाल प्राप्त करने की आवश्यकता होगी, जो कि काम करने का विचार है, जो डेटा का एक टुकड़ा * संबंधित * है, और सामान्य रूप से आपके साथ जोड़ता है अधिक विशिष्ट जिम्मेदारियों के साथ अधिक (छोटे) वर्ग – Gareth

उत्तर

4

आप attr_reader, attr_writer, या attr_accessor उपयोग करना चाहते हैं। ये इस तरह काम करते हैं:

  • attr_reader :players_hand: आप some_player.players_hand लिखने के लिए उस खिलाड़ी के players_hand उदाहरण चर
  • attr_writer :players_hand का मूल्य प्राप्त करने देता है: आप some_player.players_hand = 0 लिखने के लिए 0
  • attr_accessor :players_hand चर सेट करने देता है: की अनुमति देता है आप दोनों को पढ़ने और लिखने के लिए, जैसे कि आप attr_reader और attr_writer दोनों का उपयोग करेंगे।

संयोग से, ये सभी आपके लिए लिखने के तरीके हैं। यदि आप चाहते हैं तो आप इसे मैन्युअल रूप से इस तरह कर सकता है:

class Player 
    def initialize 
    @players_hand = 0 
    end 

    def players_hand 
    @players_hand 
    end 

    def players_hand=(new_value) 
    @players_hand = new_value 
    end 
end 
+0

धन्यवाद @ चक, तो मैं कुछ ऐसा करना चाहता हूं। 'वर्ग प्लेयर attr_accessor: players_hand खिलाड़ियों तरीकों में से #rest end' ' डीईएफ़ डांडा डीईएफ़ @player = Player.new अंत end' और फिर उस खिलाड़ियों हाथ पर लिख ... '@player प्रारंभ .players_hand' – Alekx

5

अपने उदाहरण का उपयोग करते हुए आप इस

class Blackjack 
    attr_reader :player, :dealer 

    def initialize 
    @player = Player.new 
    @dealer = Dealer.new 
    end 
end 

class Dealer 
    def dealers_hand #the long java way of a getter 
    @dealers_hand 
    end 

    #and now the short ruby way 
    attr_reader :dealers_hand #if you only need to read the attribute 
    attr_writer :dealers_hand #if you only need to write the attribute 
    attr_accessor: dealers_hand #if you need both 

    def initialize 
    @deck = Deck.new 
    @dealers_hand = 5 
    end 

    def hit_dealer 
    @deck.hit_dealer 
    end 

    def hit_player 
    @deck.hit_player 
    end 

    def draw_card 
    @hit = $shuffled_deck 
    end 

    def shuffle 
    @deck.suits 
    end 
end 

class Player 
    attr_reader :players_hand 
    def initialize 
    @players_hand = 0 
    end 
end 

class Deck 

def suits 
    attr_reader :shuffled_deck 
    @shuffled_deck = @shuffled_deck 
end 

def hit_player 
    @hit = $shuffled_deck.pop 
end 

def hit_dealer 
    @hit = $shuffled_deck.pop 
end 

end 

game = Blackjack.new 
p game.dealer.dealers_hand 
game.dealer.dealers_hand = 4 
p game.dealer.dealers_hand 
+0

'attr_accessor' और 'attr_reader' दोनों के बजाय डीलर क्लास में' attr_accessor: players_hand' का उपयोग करना बेहतर होगा? – Alekx

+0

बेशक, आप सही हैं, हेवन का उल्लेख किया जाना चाहिए, कुछ स्पष्टीकरण के साथ कक्षा डीलर संपादित – peter

संबंधित मुद्दे