【问题标题】:Trouble creating list objects with a loop, and looking for good structure practices无法使用循环创建列表对象,并寻找良好的结构实践
【发布时间】:2013-07-07 17:11:39
【问题描述】:

作为学习 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 存在于 player 类中,具有 get 和 set 属性。

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

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

【问题讨论】:

  • CardHand 可能为空;确保在尝试使用它之前对其进行初始化。
  • 另外,您应该将Random random = new Random(); 放在循环之外,否则您可能每次都选择相同的值...
  • Thomas 说的很好,谢谢。

标签: c# list


【解决方案1】:

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

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

所以在某个地方,你应该有以下几点:

CardHand = new List<Card>();

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

CardHand.Clear();

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

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

// 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());
    }
}

【讨论】:

  • 啊,我不敢相信我错过了!哈哈,非常感谢指出,现在完美运行!
  • 再次,超级有帮助!这清理了很多东西,谢谢。
猜你喜欢
  • 2012-01-14
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2018-06-23
  • 2014-12-08
相关资源
最近更新 更多