2012-02-22 5 views
6

Я создаю карточную игру с несколькими классами. В настоящее время я использую глобальные переменные для хранения переменных , $players_hand и $dealers_hand, но я беспокоюсь при использовании глобальных переменных (возможно, без необходимости) и предпочитаю использовать переменные экземпляра.Как передать переменные между классами Ruby?

Я читал, но ничего не нажимает. Может ли кто-нибудь помочь указать мне в правильном направлении?

Использование переменных экземпляра Я не смог сохранить @players_hand и @dealers_hand, чтобы использовать их в других классах. Например, у меня есть @players_hand из класса Player. У меня есть 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

ответ

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

Спасибо @Chuck, поэтому я хотел бы сделать что-то вроде. класса 'Игрок attr_accessor: players_hand #rest методов игроков end' определение функции Blackjack Защиту инициализация @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: players_hand' в классе Дилера вместо' attr_writer' и 'attr_reader'? – Alekx

+0

, конечно, вы правы, если бы гавань упоминала об этом, отредактировал дилера класса с некоторым объяснением – peter

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