【问题标题】:Argument out of range - Card Shuffle参数超出范围 - 洗牌
【发布时间】:2013-03-17 17:36:31
【问题描述】:

我正在尝试通过从一副牌中随机取牌并将它们放入另一副牌来洗牌,以避免在将它们添加到新列表后将它们从原始列表中删除,从而获得重复的牌,这似乎导致参数超出范围错误,尽管我努力减少随机数的范围。请给点建议?

List<Card> shuffledDeck = new List<Card> ();

    for (int i = 0; i <= 51; ++i) 
    {
        int c = myDeck.Count + 1;
        int n = rNumber.Next (1, c);
        shuffledDeck.Add(myDeck[n]);
        myDeck.Remove(myDeck[n]);
    }

【问题讨论】:

  • 第一:51是什么幻数?二、为什么是myDeck.Count + 1rNumber.Next(1, c)?列表索引是从零开始的,看起来您经常会产生“减一”错误。
  • 另外,你试过这个 oneliner List&lt;Card&gt; shuffledDeck = myDeck.Orderby(_ =&gt; rNumber.Next()).ToList(); 吗? SO充满了这种类型的答案。

标签: c# game-engine shuffle


【解决方案1】:
   List<Card> shuffledDeck = new List<Card> ();

   while (myDeck.Count > 0)
   {
      int c = myDeck.Count;

      int n = rNumber.Next (0, c);
      var value = myDeck[n];
      shuffledDeck.Add(value);
      myDeck.Remove(value);

   }

您需要确保索引不超过实际数组对象的数量。

【讨论】:

  • 当我进行更改时,我收到此消息:错误 CS1955:成员 `System.Collections.Generic.List.Count' 不能用作方法或委托 (CS1955) (BlackJackGameX)
  • 它说由于它的保护级别而无法访问?
  • Count是一个属性,所以去掉()
  • var 将在编译时转换为列表/数组中的元素类型。如果有帮助,接受和投票将是很好的答案。
  • 使用此链接:msdn.microsoft.com/en-us/library/bb383973.aspx 了解 var
猜你喜欢
  • 2014-01-25
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多