C# 创建带有循环的列表对象以及寻找良好的结构实践时遇到问题

C# 创建带有循环的列表对象以及寻找良好的结构实践时遇到问题,c#,list,C#,List,作为学习C#的一种方式,我正在开发一款带有纸牌大战的小型冒险游戏。不过,我在生成卡片时遇到了一点小麻烦。我要做的是为牌生成一些随机值,实例化它们,然后将新对象分配给一个列表,该列表就是玩家发牌的“牌”。这就是我到目前为止所做的: public void generateBattleCards() { string cardStat; string cardName; int cardValue; string

作为学习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;
    }
public void generateBattleCards()
{
字符串cardStat;
字符串cardName;
积分值;
string[]stats={“力量”、“精准”、“诱惑”、“活力”、“精华”};
对于(int i=0;i<5;i++)
{
随机=新随机();
cardStat=stats[random.Next(0,stats.Length)];
cardValue=random.Next(1,10);
cardName=cardValue.ToString()+“of”+cardStat;
新卡=新卡(cardName、cardStat、cardValue);
添加(新卡);
}
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的最小值和最大值。我还没有找到一个好方法来根据随机选择的统计名称获取正确的统计值。这些属性在player类中以私有int的形式存在,具有get和set属性

当我自己试图弄明白这一点时,我偶然发现了字典上的信息。我以前从未使用过一张卡,但是否值得研究创建所有可能的卡,存储它们,只检索我需要的卡,而不是每次都尝试创建它们

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

我得到了一个空引用,我把卡添加到列表中

CardHand
没有在该方法中声明,因此无论您在何处执行该操作,都显然没有对其进行初始化

因此,在某些地方,您应该具备以下条件:

CardHand = new List<Card>();

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

此外,您还应该将游戏逻辑(绘制卡片等)与视觉逻辑(显示位置的图标)分开。例如,只需让表单控制器访问玩家的卡片,并让其完全掌握如何显示它们

// 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());
    }
}
//保持随机生成器在附近
private readonly rand=new Random();
//保持周围的统计数据;更好的方法是:使用这些值创建一个枚举
私有只读字符串[]stats={“力量”、“精准”、“诱惑”、“活力”、“精华”};
私人卡提款新卡()
{
string stat=stats[random.Next(0,stats.Length)];
int value=GetRandomValueForStat(stat);
string name=string.Format({1}中的{0}),value,stat);
返回新卡(名称、值、状态);
}
公共无效生成策略卡()
{
CardHand.Clear();
对于(int i=0;i<5;i++)
{
添加(DrawNewCard());
}
}

CardHand可能为空;在尝试使用它之前,请确保对其进行初始化。此外,还应将
Random Random=new Random()在循环之外,否则您可能每次都会选择相同的值…这是一个很好的观点,托马斯,谢谢。啊,我真不敢相信我错过了!哈哈,非常感谢你指出这一点,它现在工作得很好!再一次,非常有用!这会让事情变得更干净,谢谢。
// 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());
    }
}