2013-10-04 30 views
1

我试图随机化一个列表,然后将它放到图片框。 “索引超出范围必须为非负值并小于集合的大小”当我做到这一点我得到错误信息将一副纸牌与图像混合

这里是随机的代码:

public class Dealer 
{ 
    public static Random rand = new Random(); 
    public static List<Kort> KortenÄrBlandade = new List<Kort>(); 
    public void Shuffle() 
    { 
     List<Kort> KortenÄrBlandade = new List<Kort>(deckOfCards.OrderBy(_ => rand.Next(0, deckOfCards.Count))); 
    } 
} 

这里是的代码调用该方法

private void button1_Click(object sender, EventArgs e) 
{ 
    Spelare.Dealer deal = new Spelare.Dealer(); 
    deal.Shuffle(); 
    pictureBox1.Image = Spelare.Dealer.KortenÄrBlandade[2].img; 
} 
+0

你能告诉我们初始化deckOfCards的代码吗? – Xaruth

+0

请不要在问题中发布您的答案。答案应该作为答案发布。 –

+0

与Windows一起提供的Card32.dll是否包含所有这些随机播放和绘图功能? – Franck

回答

3

您可以尝试使用费雪耶茨洗牌算法

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

这可能是类似的东西:

public class Dealer { 

    // Fisher-Yates shuffle algorithm with explicit generator 
    private static void CoreShuffle(IList<Kort> list, Random generator) { 
    if (Object.ReferenceEquals(null, list)) 
     throw new ArgumentNullException("list"); 
    else if (Object.ReferenceEquals(null, generator)) 
     throw new ArgumentNullException("generator"); 

    for (int i = list.Count - 1; i >= 0; --i) { 
     int index = generator.Next(i + 1); 

     Kurt h = list[index]; 
     list[index] = list[i]; 
     list[i] = h; 
    } 
    } 

    public static Random rand = new Random(); // <- Be careful: Random is not thread safe; readonly is also a good addition here 

    // Return new shuffled list based on deckOfCards  
    public List<Kort> ShuffledList() { 
    List<Kort> result = new List<Kort>(deckOfCards); // <- Check this line in your code 
    CoreShuffle(result, rand); 

    return result; 
    } 
+0

我打算建议使用现有的洗牌。洗牌比看起来更复杂,不要重新发明轮子。 – Carra

+0

您重新创建了OP所遭受的完全相同的错误。 –

+0

@Hans Passant:谢谢!我纠正了我的错误 –

3

Shuffle方法不洗牌的静态列表,而造成(和忘记)一个变量是本地方法。 所以你的Spelare.Dealer.KortenÄrBlandade永远不会设置为任何真正的cardlist。这意味着索引2不存在,这就是错误信息所说的内容。

A面的话:你的静态cardlist +实例洗牌方法的组合是有点怪......

+0

Hans Kesting指着你直接(冲洗)到了虫子的核心。Shuffle方法洗牌,但洗牌的甲板然后将它扔到地板上 – TDull

2
public void Shuffle() 
{ 
    List<Kort> KortenÄrBlandade = new List<Kort>(...); 
} 

的洗牌方法,使用具有相同的名称作为Dealer.KortenÄrBlandade一个局部变量 。所以在方法返回后,你仍然有一个空的列表。修复:

public void Shuffle() 
{ 
    Dealer.KortenÄrBlandade = new List<Kort>(...); 
} 

请注意,这不是proper shuffle。类设计也不正确,Shuffle()应该是静态的,或者KortenÄrBlandade不应该是静态的。关于变量存储的混淆是你最终写了这个bug。