无法使用循环创建列表对象,并寻找良好的结构实践

时间:2013-07-07 17:11:40

标签: c# list

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

在尝试自己解决这个问题时,我遇到了关于词典的信息。我之前从未使用过,但是有必要考虑创建所有可能的卡片,存储它们,并且只检索我需要的卡片,而不是每次都尝试创建它们吗?

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

1 个答案:

答案 0 :(得分: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());
    }
}