2013-10-04 32 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。