1

私はRailsを初めて使っているので、質問のタイトルを謝っています。どのようにフレーズがあるのか​​わかりませんでした。それを自由に変更してください。私はすべてのプレイヤーにランダムなカードを対処しようとすると、すべてのカードはシングルプレイヤーで終わるRails 3.1:すべてのデットカードが1人のプレーヤーに結ばれるのはなぜですか?

class Game < ActiveRecord::Base 
    has_many :players, :dependent => :destroy 
    has_many :community_cards, :class_name => "Card", :dependent => :destroy, :conditions => { :is_community_card => true } 
    has_many :used_cards, :class_name => "Card", :dependent => :destroy, :conditions => { :is_community_card => false } 
    attr_accessible :pot, :name, :status 

class Player < ActiveRecord::Base 
    belongs_to :game 
    has_many :cards, :dependent => :destroy 
    attr_accessible :chip_count, :position, :fb_id 
end 

class Card < ActiveRecord::Base 
    belongs_to :player 
    belongs_to :game 
    attr_accessible :face, :suit, :is_community_card 
end 

...私はレールを学ぶためにポーカーゲームを構築していると私は、次の関連付けを持っています.. 。

def deal_players_hole_cards 
    players.all.each do |p| 
     if(p.cards.count < 2) 
      first_card = deal_card() 
      second_card = deal_card() 
      p.cards << first_card 
      p.cards << second_card 
     end 
    end 
end 

ここで取引カード方式だ...

def deal_card 
    card_was_found = false 
    while(!card_was_found) do 
     card_was_found = true 
     random_suit = (0..3).to_a.sample 
     random_face = (1..13).to_a.sample 

     used_cards.all.each do |used_card| 
      if(random_suit == used_card.suit and random_face == used_card.face) 
       card_was_found = false 
      end 
     end 
    end 

    new_card = Card.create(:suit => random_suit, :face => random_face, :is_community_card => false) 
    used_cards << new_card 
end 

は2人の選手がありますし、各プレイヤーはカードを2枚持っていなければならないが、その代わりに、一人のプレイヤーは、すべての4枚のカード...

01を持っています
ruby-1.9.2-p290 :001 > Game.last.players.last.cards.count 
    Game Load (0.1ms) SELECT "games".* FROM "games" ORDER BY "games"."id" DESC LIMIT 1 
    Player Load (0.1ms) SELECT "players".* FROM "players" WHERE "players"."game_id" = 2 ORDER BY "players"."id" DESC LIMIT 1 
    (0.2ms) SELECT COUNT(*) FROM "cards" WHERE "cards"."player_id" = 6 
=> 4 
ruby-1.9.2-p290 :002 > Game.last.players.first.cards.count 
    Game Load (0.4ms) SELECT "games".* FROM "games" ORDER BY "games"."id" DESC LIMIT 1 
    Player Load (0.3ms) SELECT "players".* FROM "players" WHERE "players"."game_id" = 2 LIMIT 1 
    (0.2ms) SELECT COUNT(*) FROM "cards" WHERE "cards"."player_id" = 5 
=> 0 

すべてのあなたの知恵のためにあまり前もってありがとう!

+0

deal_cardメソッドも含めることができますか? – mynameiscoffey

+0

'deal_card'についてはわかりません。さらに、あなたが私たちに示すコードは良いと思われ、私はそれに間違いは見られません。たぶんエラーはどこか他の場所ですか? – Cydonia7

+0

が取引カード方式で更新されました。私もゲームモデルを追加しました。両方のメソッド、deal_players_hole_cardsとdeal_cardはゲームモデルのメンバーです。あなたの助けをありがとう、すべて! – BeachRunnerFred

答えて

0

私は...取引カード方法にプレイヤオブジェクトを渡し、ビルド方法を使って、プレイヤーに新たに作成されたカードを装着することで、これを固定

#################################################################### 
    # Deals each player their two hole cards 
    #################################################################### 
    def deal_players_hole_cards 
     players.all.each do |p| 
      if(p.cards.count < 2) 
       deal_card(p) 
       deal_card(p) 
      end 
     end 
    end 

    #################################################################### 
    # returns a random, unused card 
    #################################################################### 
    def deal_card(p) 
     card_was_found = false 
     while(!card_was_found) do 
      card_was_found = true 
      random_suit = (0..3).to_a.sample 
      random_face = (1..13).to_a.sample 

      used_cards.all.each do |used_card| 
       if(random_suit == used_card.suit and random_face == used_card.face) 
        card_was_found = false 
       end 
      end 
     end 

     new_card = p.cards.build(:suit => random_suit, :face => random_face, :is_community_card => false) 
     used_cards << new_card 
    end 

結果...

を終わりました
ruby-1.9.2-p290 :005 > Game.last.players.first.cards.count 
    Game Load (0.3ms) SELECT "games".* FROM "games" ORDER BY "games"."id" DESC LIMIT 1 
    Player Load (0.4ms) SELECT "players".* FROM "players" WHERE "players"."game_id" = 2 LIMIT 1 
    (0.3ms) SELECT COUNT(*) FROM "cards" WHERE "cards"."player_id" = 5 
=> 2 
ruby-1.9.2-p290 :006 > Game.last.players.last.cards.count 
    Game Load (0.4ms) SELECT "games".* FROM "games" ORDER BY "games"."id" DESC LIMIT 1 
    Player Load (0.4ms) SELECT "players".* FROM "players" WHERE "players"."game_id" = 2 ORDER BY "players"."id" DESC LIMIT 1 
    (0.2ms) SELECT COUNT(*) FROM "cards" WHERE "cards"."player_id" = 6 
=> 2 

私の古いコードが機能しない理由はまだ不思議です。

関連する問題