0

作为学习 C# 的一种方式,我正在开发一款带有卡牌战斗的小型冒险游戏。不过,我在生成卡片时遇到了一些麻烦。我要做的是为卡片生成一些随机值,实例化它们,然后将新对象分配给一个列表,该列表是玩家被处理的“手”。这就是我到目前为止所拥有的:

        public void generateBattleCards()
    {
        string cardStat;
        string cardName;
        int cardValue;
        string[] stats = { "Power", "Precision", "Allure", "Vitality", "Essence" };
        for (int i = 0; i < 5; i++)
        {
            Random random = new Random();
            cardStat = stats[random.Next(0, stats.Length)];
            cardValue = random.Next(1, 10);
            cardName = cardValue.ToString() + " of " + cardStat;
            Card newCard = new Card(cardName, cardStat, cardValue);
            CardHand.Add(newCard);
        }

        picPlayerCard1.Image = CardHand[0].cardImage;
        picPlayerCard2.Image = CardHand[1].cardImage;
        picPlayerCard3.Image = CardHand[2].cardImage;
        picPlayerCard4.Image = CardHand[3].cardImage;
        picPlayerCard5.Image = CardHand[4].cardImage;
    }

我在将卡片添加到列表中时得到一个空引用。

在为此苦苦挣扎了一段时间之后,我突然想到,假设我让它工作,这可能不是构建它的最优雅的方式。因此,如果有人对如何更好地构建它有意见,我将不胜感激。

作为旁注,我想使用来自玩家类的玩家统计数据作为 cardStat 的最小值和最大值。我还没有想出一个好方法来根据选择的随机统计名称获取正确的统计值。统计信息作为私有 int 存在于玩家类中,具有获取和设置的属性。

在试图自己弄清楚这一点时,我遇到了字典上的信息。我以前从未使用过,但是否值得研究创建所有可能的卡片、存储它们并仅检索我需要的卡片而不是每次都尝试创建它们?

感谢您提供的任何帮助或反馈:)

4

1 回答 1

1

我在将卡片添加到列表中时得到一个空引用。

CardHand没有在该方法中声明,所以无论你做什么,你显然都没有初始化它。

所以在某个地方,你应该有以下内容:

CardHand = new List<Card>();

然后在循环之前,generateBattleCards您应该清除该列表以确保您不保留以前的卡片:

CardHand.Clear();

一般来说,我会将随机卡片生成与您创建玩家手牌的位置分开。这将允许您单独抽牌(这可能对您的游戏有用)。

此外,您还应该将游戏逻辑(绘图卡等)与视觉逻辑(哪个图标显示在哪里)分开。例如,只需让表单控制器访问玩家的卡片,然后完全由它来处理如何显示它们。

// keep the random generator around
private readonly Random rand = new Random();

// keep the stats around; even better: make an Enum with those values
private readonly string[] stats = { "Power", "Precision", "Allure", "Vitality", "Essence" };

private Card DrawNewCard ()
{
    string stat = stats[random.Next(0, stats.Length)];
    int value = GetRandomValueForStat(stat);
    string name = string.Format("{0} of {1}", value, stat);

    return new Card(name, value, stat);
}

public void generateBattleCards()
{
    CardHand.Clear();
    for (int i = 0; i < 5; i++)
    {
        CardHand.Add(DrawNewCard());
    }
}
于 2013-07-07T17:15:03.983 回答