0

かなり詳しい方です。ポーカー ハンドのランクの決定。次のクラスを作成しました: Card:

class Card
  attr_accessor :suite, :rank, :value
  def initialize(suite, rank, value)
    @suite = suite
    @rank = rank
    @value = value
  end
  def to_s
    puts "#{@value}, #{@suite}, #{@rank}"
  end
end

Deck:

class Deck
  def initialize()
    @cardsInDeck = 52
    @deck = Array.new()
  end
  def add_card(card)
    @deck.push(card)
  end
  def deck_size
    @deck.length
  end
  def to_s
    @deck.each do |card|
      "#{card.rank}, #{card.suite}"
    end
  end
  def shuffle_cards
    @deck.shuffle!
  end
  def deal_cards
    #Here I create a new hand object, and when popping cards from the deck             
    # stack I insert the card into the hand. However, when I want to print 
    # the cards added to the hand I get the following error:
    #     : undefined method `each' for #<Hand:0x007fa51c02fd50> (NoMethodError)from   
    #       driver.rb:36:in `<main>'
    @hand = Hand.new
    for i in 0..51 do
      card = @deck.pop
      @cardsInDeck -= 1
      puts "#{card.value}, #{card.rank}, #{card.suite}"
      @hand.add_cards(card)
    end
    @hand.each do |index|
      "#{index.value}, #{index.rank}, #{index.suite}"
    end
    puts "Cards In Deck: #{@cardsInDeck}"
  end
end

Hand

require_relative 'deck'
require_relative 'card'

class Hand
  def initialize()
    @hand = Array.new()
  end
  def to_s
    count = 0
    @hand.each do |card|
      "#{card.value}, #{card.rank}, #{card.suite}"
      count += 1
    end
  end
  def add_cards(card)
    @hand.push(card)
  end
  def hand_size()
    @hand.length
  end
end

およびドライバー ファイル:

require 'logger'
require_relative 'card'
require_relative 'deck'
require_relative 'hand'

suite = ["Hearts", "Diamonds", "Clubs", "Spades"]
rank = ["Ace", 2, 3, 4, 5, 6, 7, 8, 9, 10, "Jack", "Queen", "King"]
deck = Deck.new()
suite.each do |i|
  v = 1
  rank.each do |j|
    deck.add_card(Card.new(i, j, v))
    v += 1
  end
end

Deckクラス、メソッドdeal_cardで、配列のループでメソッド エラーが発生する理由がわかりません

@hand.each do |index|
  "#{index.value}, #{index.rank}, #{index.suite}"
end
puts "Cards In Deck: #{@cardsInDeck}"
4

2 に答える 2

0

私の答えはエラーについてあまり直接的ではありませんが、この場合に役立つことを願っています.

  1. あなたのメソッドdeal_cardsは、依存性注入がその役割を果たすことができる場所です。元の設計では、どれが良くなく、テストが難しいかにDeck大きく依存しています。Hand次のように変更する必要があります

    def deal_cards(hand=nil)
      @hand = hand || Hand.new
      # Others
    end
    

    これにより、誰かが足でカードをプレイできる限りHand、の外でインスタンスを受け入れることができます! FootHand クラスをまったく記述せずに、このメソッドを単体テストすることもできます。

  2. 手動でチェックする代わりに、クラスを単体テストする方がよいでしょう。そうすれば、テスト中に好きなインスタンスをこのメソッドに挿入できます。

于 2013-10-12T03:57:53.390 に答える
0

@handは のインスタンスであり、 に対してHandインスタンス メソッドがeach定義されていないHandため、 はエラー@hand.eachを生成しundefined methodます。

于 2013-10-12T02:06:49.207 に答える