2012-02-22 22 views
6

我正在創建一個有多個班級的紙牌遊戲。目前,我使用全局變量來保存$shuffled_deck,$players_hand$dealers_hand變量,但是我擔心使用全局變量(可能是不必要的)並且更願意使用實例變量。如何在Ruby類之間傳遞變量?

我一直在閱讀,但沒有什麼是真正的點擊。任何人都可以幫助我指出正確的方向嗎?

使用實例變量我無法保存@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

好問題,但會有相當多的概念,要經過得到一個完整的答案。希望有人會知道一個好的參考文檔,但是你肯定需要得到一個處理**封裝**這是一個想出一個數據*屬於哪個對象的想法,並且通常最終會添加更多(更小)的班級更具體的責任 – Gareth 2012-02-22 16:47:41

回答

4

你想用attr_readerattr_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_readerattr_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

謝謝@Chuck,所以我想要做類似的事情。 '類球員 attr_accessor:players_hand #rest玩家方法 end' '高清酒杯 高清初始化 @player = Player.new 結束 end' ,然後寫信給玩家的手...'@player .players_hand' – Alekx 2012-02-22 17:13:14

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

在Dealer類中使用'attr_accessor:players_hand'而不是'attr_writer'和'attr_reader'會更好嗎? – Alekx 2012-02-22 18:12:29

+0

當然,你是對的,應該提到,編輯類經銷商與一些解釋 – peter 2012-02-23 17:18:29