Создание симуляции блэкджека в Ruby, изменение переменных между разными экземплярами - PullRequest
0 голосов
/ 01 мая 2018

Это для собеседования. Что я хочу сделать, так это то, что после сдачи карты (снятой с экземпляра колоды дилера) эта карта становится доступной для экземпляра руки игрока.

    class Card
      attr_accessor :suite, :name, :value #specifiy that class attributes are both, readable and writable
      #constructor
      def initialize(suite, name, value) 
        @suite, @name, @value = suite, name, value #this looks odd
      end
    end

    class Deck
      attr_accessor :playable_cards
      SUITES = [:hearts, :diamonds, :spades, :clubs] #constant 
      NAME_VALUES = { 
        :two   => 2,
        :three => 3,
        :four  => 4,
        :five  => 5,
        :six   => 6,
        :seven => 7,
        :eight => 8,
        :nine  => 9,
        :ten   => 10,
        :jack  => 10,
        :queen => 10,
        :king  => 10,
        :ace   => [11, 1]}

      def initialize #initialzing shuffles the deck
        shuffle 
      end

      def deal_card #removes card from deck
        random = rand(@playable_cards.size) #returns an random int greater >= 0 & < max
        @playable_cards.delete_at(random)
      end

      def shuffle
        @playable_cards = [] #array of 52 cards
        SUITES.each do |suite| #iterate over suites
          NAME_VALUES.each do |name, value| #iterate, over card for that suite
            @playable_cards << Card.new(suite, name, value) #add to end of array, new Card
          end
        end
      end
    end

    class Hand
      attr_accessor :cards

      def initialize
        @cards = []
      end
    end

    class Player
      def initialize
        @player_hand = Hand.new
      end

    end

    class Dealer 
      def initialize
        @dealer_hand = Hand.new
        @dealer_deck = Deck.new
      end

      def deal 
        card = @dealer_deck.deal_card
      end
    end


require 'test/unit'

class CardTest < Test::Unit::TestCase
  def setup
    @card = Card.new(:hearts, :ten, 10)
  end

  def test_card_suite_is_correct
    assert_equal @card.suite, :hearts
  end

  def test_card_name_is_correct
    assert_equal @card.name, :ten
  end
  def test_card_value_is_correct
    assert_equal @card.value, 10
  end
end

class DeckTest < Test::Unit::TestCase
  def setup
    @deck = Deck.new
  end

  def test_new_deck_has_52_playable_cards
    assert_equal @deck.playable_cards.size, 52
  end

  def test_dealt_card_should_not_be_included_in_playable_cards
    card = @deck.deal_card
    assert(!@deck.playable_cards.include?(card)) #upon dealing card, card should be removed from deck
  end

  def test_shuffled_deck_has_52_playable_cards
    @deck.shuffle
    assert_equal @deck.playable_cards.size, 52
  end
end

Все, что я сделал, это добавил классы Player и Dealer. Я думаю, что у игрока есть рука, поэтому при инициализации экземпляр руки сохраняется в @player_hand, и то же самое относится и к дилеру. Дилер также имеет свой собственный экземпляр колоды, очевидно. Теперь, когда я звоню Dealer.new.deal, карта удаляется из колоды, как мне добавить эту вновь удаленную карту в Player @player_hand?

Я думал об использовании глобальных переменных, но это плохая практика. Я также не совсем уверен, что это даже правильный подход.

1 Ответ

0 голосов
/ 01 мая 2018

Полагаю, вам нужно место для игрока и дилера. Из этого контекста вы будете иметь возможность передавать карты между дилером и игроком. Также может быть несколько игроков или что-то в этом роде.

Итак, я бы создал класс Game, в котором вы инициализируете игроков и дилера и можете создавать методы для раздачи карт.

class Game
  def initialize
    @dealer = Dealer.new
    @player = Player.new
  end

  def deal_out_to_player
    2.times do
      @player.player_hand.cards << Dealer.deal
    end 
  end
end
...