作为学习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属性。
在尝试自己解决这个问题时,我遇到了关于词典的信息。我之前从未使用过,但是有必要考虑创建所有可能的卡片,存储它们,并且只检索我需要的卡片,而不是每次都尝试创建它们吗?
感谢您提供的任何帮助或反馈:)
答案 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());
}
}