Как передать переменные между классами Ruby? - PullRequest
6 голосов
/ 22 февраля 2012

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

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

Используя переменные экземпляра, я не смог сохранить @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

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

используя ваш пример, вы можете сделать это так

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
4 голосов
/ 22 февраля 2012

Вы хотите использовать attr_reader, attr_writer или attr_accessor.Вот как они работают:

  • attr_reader :players_hand: позволяет написать some_player.players_hand, чтобы получить значение переменной экземпляра players_hand этого игрока
  • attr_writer :players_hand: позволяетwrite 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...