【问题标题】:detecting a property of an item before placing it in array在将项目放入数组之前检测项目的属性
【发布时间】:2013-11-24 07:12:40
【问题描述】:

我正在尝试从牌组 (cardArray) 中将一张牌添加到手牌中,并且不允许重复。在 SuperCard 类中,我创建了一个名为 inPlay 的 bool 属性。当 Program.cs 启动时,有一个“shuffle”方法将所有卡片 inPlay bool 设置为 false。我试图弄清楚如何避免绘制同一张卡片,我正在尝试 if/else if 但那不起作用。当我离开 else if 时,它会遇到“无对象实例”异常。这是代码。任何帮助都会很棒。谢谢!

public SuperCard[] GetCards(int number)
{ 
    SuperCard[] hand = new SuperCard[number];
    for (int i = 0; i < number; i++)
    {
        int x = myRandom.Next(0, 51);
        if (cardArray[x].inPlay == false)
        {
            hand[i] = cardArray[myRandom.Next(0, 51)];
            cardArray[x].inPlay = true;
        }
        else if (cardArray[x].inPlay == true) 
        {
            hand[i] = cardArray[myRandom.Next(0, 51)];

        }
    }
    return hand;
}

【问题讨论】:

  • 当你抽到一张牌时,只需将其从牌组中移除即可。
  • @Muctadir 我不完全确定该怎么做:\ 另外,我是否必须在每个“回合”中重新创建套牌?
  • 只需从甲板数组中删除绘制的元素。并重新创建甲板实例化一个新甲板。
  • 看看我的答案链接......其中一个直接处理洗牌一副牌......
  • @Muctadir & Noctis:为了这个程序,我试图将它保存在数组而不是列表中。我需要更好地理解数组及其行为。

标签: c# arrays object boolean conditional


【解决方案1】:

用这个

public SuperCard[] GetCards(int number)
{

    SuperCard[] hand = new SuperCard[number];
    int index;

    for (int i = 0; i < number; i++)  // 5 cards
    {
        index = myRandom.Next(0, 51);
        hand[i] = cardArray[index];
        while (hand[i].inplay == true)
        {  
            index = myRandom.Next(0, 51);
            hand[i] = cardArray[index];

        }
        hand[i].inplay = true;    
    }

    return hand;
}

【讨论】:

    【解决方案2】:

    首先,我已将您的代码更改为:

    public SuperCard[] GetCards(int cards_to_get)
    { 
        SuperCard[] hand = new SuperCard[cards_to_get];
        for (int i = 0; i < cards_to_get; i++)
        {
            int x = myRandom.Next(0, 51);
    
            if (cardArray[x].inPlay)
                hand[i] = cardArray[myRandom.Next(0, 51)];  
            else {
                hand[i] = cardArray[myRandom.Next(0, 51)];
                cardArray[x].inPlay = true;
            }
        }
        return hand;
    }
    

    第二,你是如何在何时何地初始化cardArray的?

    第三,正如评论所暗示的,您可以只拥有一张卡片列表,将列表洗牌,然后使用ListName.Take(cards_to_get)first cards_to_get 为例。

    您可以查看改组 herehere,或者只搜索 SO 以改组列表。

    编辑:
    好的......这就是你要做的......你在这里得到一张随机卡片:int x = myRandom.Next(0, 51);

    然后你说,如果它不在游戏中(应该添加)让我们添加它......只是......你添加一张随机卡:

     hand[i] = cardArray[myRandom.Next(0, 51)];
            cardArray[x].inPlay = true;
    

    您应该添加了 cardArray[x] 。这应该可以解决您的问题。

    另一个问题,在下一点,你说:否则,添加一张新的随机卡

    else if (cardArray[x].inPlay == true) 
    {
            hand[i] = cardArray[myRandom.Next(0, 51)];
    }
    

    但在这里你会添加一张新的随机牌,而不检查它是否在游戏中。

    :)

    【讨论】:

    • 我在 CardSet 构造函数中初始化 cardArray(这个 GetCards 方法所在的位置)。看起来像这样:public CardSet() { cardArray = new SuperCard[52]; for (int i = 0; i &lt; 13; i++) { cardArray[i] = new CardClubs((Rank)i + 1); cardArray[i + 13] = new CardDiamond((Rank)i+1); cardArray[i + 26] = new CardHeart((Rank)i + 1); ; cardArray[i + 39] = new CardSpades((Rank)i + 1); ; } } 您编辑的代码仍然出现重复的卡片。 :\
    • 我编辑的代码是关于你的风格,而不是关于正确性。为此,您有 第三个 ...我将在几分钟内查看此新代码
    【解决方案3】:

    最简单的方法是从牌组中取出卡片。毕竟这就是你正在建模的世界中发生的事情。当对现实世界进行密切建模时,这些问题往往会消失。但是,您可以对代码进行简单的修复,然后它就可以工作了

    public SuperCard[] GetCards(int number)
    { 
        SuperCard[] hand = new SuperCard[number];
        while(number>0)
        {
            int x = myRandom.Next(0, 51);
            if (cardArray[x].inPlay == false)
            {
                hand[hand.Length - number] = cardArray[myRandom.Next(0, 51)];
                cardArray[x].inPlay = true;
                number--;
            }
        }
        return hand;
    }
    

    【讨论】:

    • 如果我们去掉 for 循环,我们将把 i in hand[i] 改成什么?手[数字]?
    【解决方案4】:

    我认为问题是您使用x 来检查inPlay 属性,但在第一个if 语句中再次使用myRandom.Next(0, 51) 来绘制卡片。

    else if 语句中,我猜你尝试抽另一张牌,没有检查inPlay 属性。

    解决方案是创建一个新方法来查找具有inPlay == false 的新卡。在这种方法中,您应该循环直到获得该卡或从您的牌组中取出卡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      相关资源
      最近更新 更多