0

我正在尝试从牌组(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;
}
4

4 回答 4

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;
}
于 2013-11-27T07:01:29.167 回答
0

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

else if声明中,我猜你尝试画另一张牌,这不是检查inPlay属性。

解决方案是创建一种新方法来查找具有inPlay == false. 在这种方法中,你应该循环直到拿到那张牌或牌组中的牌。

于 2013-11-12T08:29:21.293 回答
0

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

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?

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

您可以在此处此处查看改组,或者仅搜索 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)];
}

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

:)

于 2013-11-12T08:30:10.297 回答
0

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

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;
}
于 2013-11-12T08:51:48.467 回答