2012-02-22 10 views
6

Estoy creando un juego de cartas con múltiples clases. Actualmente, estoy usando variables globales para contener las variables $shuffled_deck, $players_hand y $dealers_hand, pero me preocupa usar variables globales (quizás, innecesariamente) y preferiría usar variables de instancia.¿Cómo paso las variables entre las clases de Ruby?

He estado leyendo, pero nada está realmente haciendo clic. ¿Alguien puede ayudarme a orientarme en la dirección correcta con esto?

Usando variables de instancia No he podido guardar el @players_hand y @dealers_hand para poder usarlos en otras clases. Por ejemplo, tengo @players_hand de la clase Player. Tengo la clase Dealer roba una carta, pero no puedo sacar esa @players_hand en la clase Dealer para sumar las dos.

Mi código actual es:

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

Buena pregunta, pero no habrá un buen montón de conceptos que pasar para obtener una respuesta completa. Con suerte, alguien sabrá un buen documento de referencia, pero definitivamente tendrá que manejar ** la encapsulación **, que es la idea de determinar a qué objeto pertenece una pieza de datos * y normalmente termina agregando más (más pequeñas) clases con responsabilidades más específicas – Gareth

Respuesta

4

que desea utilizar attr_reader, attr_writer, o attr_accessor. He aquí cómo funcionan:

  • attr_reader :players_hand: le permite escribir some_player.players_hand para obtener el valor de la instancia de ese jugador players_hand variables
  • attr_writer :players_hand: le permite escribir some_player.players_hand = 0 para establecer la variable a 0
  • attr_accessor :players_hand: Permite puedes leer y escribir, como si hubieras usado attr_reader y attr_writer.

Por cierto, todo lo que debes hacer es escribir métodos para ti. Si quisieras, podrías hacerlo manualmente como esto:

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

Gracias @Chuck, así que me gustaría hacer algo como. 'jugador de clase attr_accessor: players_hand #rest de métodos jugadores end' ' def Blackjack def initialize @player = Player.new final end' y luego escribir a mano ... que los jugadores '@player .players_hand' – Alekx

5

la utilización de su ejemplo, puede hacerlo de esta manera

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

¿sería mejor usar 'attr_accessor: players_hand' en la clase Dealer en lugar de' attr_writer' y 'attr_reader'? – Alekx

+0

, por supuesto, tienes razón, deberías haber mencionado eso, editado el distribuidor de la clase con alguna explicación – peter

Cuestiones relacionadas