2014-09-19 22 views
0

我正在嘗試在卡牌清單上做Fisher Yates隨機卡牌。我已經沖刷論壇和費舍爾耶茨的唯一實現與正常人一樣INT陣列下面Fisher Yates隨機卡牌清單

for (int i = length - 1; i > 0; i--) 
{ 
    int j = random.Next(i + 1); 
    int temp = array[i]; 
    array[i] = array[j]; 
    array[j] = temp; 
} 

這是合理的就好了,我的問題是我實在不明白如何在邏輯轉換的方式我有東西,任何幫助完成此將不勝感激。相關代碼如下:

public struct Card : IComparable<Card> 
{ 
    public Rank Rank { get; private set; } 
    public Suit Suit { get; private set; } 

    public Card(Rank rank, Suit suit) : this() 
    { 
    Rank = rank; 
    Suit = suit; 
    } 

    public override string ToString() 
    { 
    return string.Format("{0:x} {1}", (char) Suit, Rank); 
    } 
} 
public enum Suit { Spades = 9824, Clubs = 9827, Hearts = 9829, Diamonds = 9830 } 
public enum Rank { Ace, Deuce, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King } 

public class Deck 
{ 
    public List<Card> Cards { get; private set; } 

    public Deck() 
    { 
    foreach (Rank rank in Enum.GetValues(typeof(Rank))) 
    { 
     foreach (Suit suit in Enum.GetValues(typeof(Suit))) 
     { 
     Card card = new Card(rank, suit); 
     Cards.Add(card); 
     } 
    } 
    } 
    public Deck(List<Card> cardDeck) 
    { 
    Cards = cardDeck; 
    } 
    public void Shuffle() 
    { //???? I don't know how I would apply the Fisher Yates logic to here 
    //since all other programs just use normal int arrays 
    . . . 

感謝您的任何和所有幫助。

+1

你的代碼有幾個編程錯誤,你永遠不會初始化'Cards',也不會執行'IComparable ' – Lukazoid 2014-09-19 22:44:46

+0

我只是在Shuffle問題上發佈了相關的代碼,這兩個代碼都在其他地方討論過。 – user3066571 2014-09-19 22:53:02

回答

1

已經真正做到了這一點之前(雖然用自己的洗牌,仍然是基於整數),我這樣做:

  1. 添加一個構造函數的卡類,帶有一個int。將卡組的52張卡片映射到數字0-51非常容易,所以我會把它留給你。 注意:如果您將套裝映射到0-3而不是您選擇的看似隨機的數字,這將變得更容易lot

  2. 使用for循環創建一個開始的「卡組」,以生成全部52張卡片。

  3. 在這個創建的列表上運行shuffle。

+0

表面上的隨機數字是十六進制數字,因此西裝實際上顯示了西裝的實際角色。 – user3066571 2014-09-19 22:53:38

+0

@ user3066571好的。它會以任何方式工作。正如另一個答案所說,你已經可以做到這一點,因爲你已經生成了套牌。 – BradleyDotNET 2014-09-19 22:58:08

4

當然,邏輯是完全一樣的嗎?唯一不同的是,你從你的收藏閱讀Card而非int,即

for (int i = Cards.Count - 1; i > 0; i--) 
{ 
    int j = random.Next(i + 1); 
    Card temp = Cards[i]; // Notice the change on this line 
    Cards[i] = Cards[j]; 
    Cards[j] = temp; 
} 

固定了在註釋中提到的編程錯誤後,這個實現似乎爲我工作。