2012-02-22 23 views
6

Tôi đang tạo một trò chơi bài có nhiều lớp. Hiện tại, tôi đang sử dụng các biến toàn cầu để giữ các biến số $shuffled_deck, $players_hand$dealers_hand, nhưng tôi lo lắng khi sử dụng các biến toàn cục (có lẽ, không cần thiết) và muốn sử dụng các biến mẫu.Làm cách nào để chuyển các biến giữa các lớp Ruby?

Tôi đã đọc xung quanh, nhưng không có gì thực sự nhấp vào. Bất cứ ai có thể giúp chỉ cho tôi đi đúng hướng với điều này?

Sử dụng các biến mẫu Tôi chưa thể lưu @players_hand@dealers_hand để có thể sử dụng chúng trong các lớp khác. Ví dụ: tôi có @players_hand từ lớp Player. Tôi có lớp Dealer vẽ một thẻ, nhưng tôi không thể kéo @players_hand đó vào lớp Dealer để thêm hai thẻ lại với nhau.

mã hiện tại của tôi là:

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

Tốt câu hỏi này, nhưng sẽ có khá nhiều khái niệm phải đi qua để có được một câu trả lời hoàn chỉnh. Hy vọng rằng ai đó sẽ biết một tài liệu tham khảo tốt, nhưng bạn chắc chắn sẽ cần phải có một xử lý trên ** đóng gói ** đó là ý tưởng làm việc ra một đối tượng một phần dữ liệu * thuộc *, và thường kết thúc với bạn thêm nhiều hơn (nhỏ hơn) các lớp học với trách nhiệm cụ thể hơn – Gareth

Trả lời

4

Bạn muốn sử dụng attr_reader, attr_writer, hoặc attr_accessor. Dưới đây là cách họ làm việc:

  • attr_reader :players_hand: Cho phép bạn viết some_player.players_hand để có được giá trị của players_hand dụ của người chơi rằng biến
  • attr_writer :players_hand: Cho phép bạn viết some_player.players_hand = 0 để đặt biến 0
  • attr_accessor :players_hand: Cho phép cả bạn đọc và viết, như thể bạn đã sử dụng cả hai attr_readerattr_writer.

Ngẫu nhiên, tất cả những việc này là viết các phương pháp cho bạn. Nếu bạn muốn, bạn có thể làm nó bằng tay như thế này:

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

Cảm ơn @Chuck, vì vậy tôi sẽ muốn làm một cái gì đó như thế nào. lớp 'Chơi attr_accessor: players_hand #rest các phương pháp chơi end' 'def Blackjack def khởi @player = Player.new cuối end' và sau đó ghi vào mà người chơi tay ...' @player .players_hand' – Alekx

5

sử dụng ví dụ của bạn, bạn có thể làm điều đó như

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

sẽ tốt hơn nếu sử dụng 'attr_accessor: players_hand' trong lớp Dealer thay vì' attr_writer' và 'attr_reader'? – Alekx

+0

tất nhiên, bạn là đúng, nên thiên đường đề cập rằng, chỉnh sửa các đại lý lớp với một số lời giải thích – peter

Các vấn đề liên quan