2014-05-16 1 views
0

루비에 카드 게임 프레임 워크를 쓰고 있는데 문제가 있습니다. 나는 카드를 섞을 셔플 방법을 만들었지 만 잘 작동한다. 그러나 나는 Deck # shuffle 대신에 Deck # shuffle이라고 부릅니다. 그것은 내가 원하지 않는 데크를 섞는다.데크 # 셔플 및 데크 # 셔플!

또한 내가 추가 할 때 : riffle을 인수로 사용하면 셔플은 내가 원하는 데크를 유지하지 않는다는 것을 알게됩니다.

갑판 # 셔플이 갑판을 수정하는 것을 방지하는 방법에 대한 도움을 주시면 감사하겠습니다. 감사!

가 여기 내 코드 (사람이 너무 저를 필요로하는 경우도 그것의 일부, 나는 나머지를 게시 할 수 있습니다) :

class Deck 

    def initialize 
     @cards = [] 
     (1..4).each { |suit| 
      (1..13).each { |rank| 
       @cards << Card.new(rank, suit) 
      } 
     } 
    end 

    def size 
     @deck.length 
    end 

    def shuffle!(type = :random, precision = 100) 
     case type 
     when :random 
      @cards.shuffle! 
     when :riffle, :farro 
      i = 0 
      first, second = cut 
      @cards = [] 
      while size != 52 
       pile = (i.even? ? first : second) 
       if pile.empty? 
         pile = (pile == first ? second : first) 
       end 
       add_card(pile.pop) 
       i += 1 if (1..precision) === rand(1..100) 
      end 
     else 
      warn "Invalid shuffle method." 
     end 
    end 

    def shuffle(type = :random, precision = 100) 
     dup.shuffle!(type, precision) 
    end 

    def add_card(card) 
     @cards << card 
    end 

end 

deck = Deck.new 
deck.shuffle 

p deck.cards.map(&:to_a) 

답변

2

귀하의 Deck 클래스는 인스턴스 변수가 - @cards - 카드를 누릅니다. @cards은 실제로 카드 배열에 대한 참조입니다.

Deck#dup을 사용할 때 얕은 복사본을 사용하는 Object#dup을 사용합니다. 모든 인스턴스 변수를 참조로 복사합니다. 인스턴스 변수를 복제하지 않습니다!

이것은 dup ED Deck원래 Deck@cards 같은 배열을 말한다 다른@cards 변수를 보유하고 있다는 것을 의미한다. shuffle 일 때 동일한 배열이 셔플됩니다. 다른 참조 변수를 통해 액세스 할 수 있지만 여전히 동일한 배열입니다.

당신이 :riffle 또는 :farro가 새로운 배열에 @cards을 설정하면 @cards = []을이 셔플 유형의 사람들 때문에 원래 객체에 영향을 미치지 않습니다 셔플 시도하십시오. 예전의 새로운 @cards의 분리가 shuffle!에 있으면 안하기 때문에 - -

그래도, 난 당신이 :random 유형을 가지고 있지 않은 경우에도 구현이 여전히 잘못된 것이라고 말하고 싶지만 그것이 dup에 있어야 !

따라서 dup 메서드를 재정의하고 @cards을 복제해야하는 것은 무엇입니까? 또한이 기능을 지원하는 initialize을 변경할 수 있습니다 :

def initialize(cards = nil) 
    if cards 
     @cards = cards 
    else 
     @cards = [] 
     (1..4).each { |suit| 
      (1..13).each { |rank| 
       @cards << Card.new(rank, suit) 
      } 
     } 
    end 
end 

def dup 
    Deck.new(@cards.dup) 
end  
0

이 줄 ...

dup.shuffle!(type, precision) 

은 ... 갑판 개체의 단순 복사본을 만드는 것입니다.

인스턴스 변수 @cards이 있지만 인스턴스 변수는 실제로 원래 개체의 인스턴스 변수와 동일한 개체를 참조합니다.