2014-09-19 51 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; 
} 

固定了在注释中提到的编程错误后,这个实现似乎为我工作。