c# - 在消除堆栈溢出异常的可能性的同时保持功能的好方法是什么
问题描述
我正在以一种非常低效的方式做到这一点。不是很有经验,只是尝试希望它能起作用的东西,而且我(可以理解地)被堆栈溢出异常所困扰。
所以我的代码的第一部分非常明显,牌组中有 33 张卡片,我以“随机”方式渲染 3 张卡片,并尝试进行异常处理(“CheckForReDraw();”)方法来防止重复,这就是事情发生的地方。 .. 凌乱
public void DrawThreeUniqueGladiatorCards()
{
if (numberOfDiscards >= 30)
{
ShuffleGladCards();
}
Random gladCard = new Random();
drawnGladCard1 = gladCard.Next(1, 34);
Random gladCard2 = new Random();
drawnGladCard2 = gladCard.Next(1, 34);
Random questCard3 = new Random();
drawnGladCard3 = gladCard.Next(1, 34);
CheckForReDraw();
}
public void CheckForReDraw()
{
if (drawnGladCard1 == drawnGladCard2 || drawnGladCard1 == drawnGladCard3 || drawnGladCard2 == drawnGladCard3)
{
DrawThreeUniqueGladiatorCards();
}
if (glad1Board == true || glad1Discard == true)
{
if (drawnGladCard1 == 1 || drawnGladCard2 == 1 || drawnGladCard3 == 1)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad2Board == true || glad2Discard == true)
{
if (drawnGladCard1 == 2 || drawnGladCard2 == 2 || drawnGladCard3 == 2)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad3Board == true || glad3Discard == true)
{
if (drawnGladCard1 == 3 || drawnGladCard2 == 3 || drawnGladCard3 == 3)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad4Board == true || glad4Discard == true)
{
if (drawnGladCard1 == 4 || drawnGladCard2 == 4 || drawnGladCard3 == 4)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad5Board == true || glad5Discard == true)
{
if (drawnGladCard1 == 5 || drawnGladCard2 == 5 || drawnGladCard3 == 5)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad6Board == true || glad6Discard == true)
{
if (drawnGladCard1 == 6 || drawnGladCard2 == 6 || drawnGladCard3 == 6)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad7Board == true || glad7Discard == true)
{
if (drawnGladCard1 == 7 || drawnGladCard2 == 7 || drawnGladCard3 == 7)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad8Board == true || glad8Discard == true)
{
if (drawnGladCard1 == 8 || drawnGladCard2 == 8 || drawnGladCard3 == 8)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad9Board == true || glad9Discard == true)
{
if (drawnGladCard1 == 9 || drawnGladCard2 == 9 || drawnGladCard3 == 9)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad10Board == true || glad10Discard == true)
{
if (drawnGladCard1 == 10 || drawnGladCard2 == 10 || drawnGladCard3 == 10)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad11Board == true || glad11Discard == true)
{
if (drawnGladCard1 == 11 || drawnGladCard2 == 11 || drawnGladCard3 == 11)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad12Board == true || glad12Discard == true)
{
if (drawnGladCard1 == 12 || drawnGladCard2 == 12 || drawnGladCard3 == 12)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad13Board == true || glad13Discard == true)
{
if (drawnGladCard1 == 13 || drawnGladCard2 == 13 || drawnGladCard3 == 13)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad14Board == true || glad14Discard == true)
{
if (drawnGladCard1 == 14 || drawnGladCard2 == 14 || drawnGladCard3 == 14)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad15Board == true || glad15Discard == true)
{
if (drawnGladCard1 == 15 || drawnGladCard2 == 15 || drawnGladCard3 == 15)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad16Board == true || glad16Discard == true)
{
if (drawnGladCard1 == 16 || drawnGladCard2 == 16 || drawnGladCard3 == 16)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad17Board == true || glad17Discard == true)
{
if (drawnGladCard1 == 17 || drawnGladCard2 == 17 || drawnGladCard3 == 17)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad18Board == true || glad18Discard == true)
{
if (drawnGladCard1 == 18 || drawnGladCard2 == 18 || drawnGladCard3 == 18)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad19Board == true || glad19Discard == true)
{
if (drawnGladCard1 == 19 || drawnGladCard2 == 19 || drawnGladCard3 == 19)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad20Board == true || glad20Discard == true)
{
if (drawnGladCard1 == 20 || drawnGladCard2 == 20 || drawnGladCard3 == 20)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad21Board == true || glad21Discard == true)
{
if (drawnGladCard1 == 21 || drawnGladCard2 == 21 || drawnGladCard3 == 21)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad22Board == true || glad22Discard == true)
{
if (drawnGladCard1 == 22 || drawnGladCard2 == 22 || drawnGladCard3 == 22)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad23Board == true || glad23Discard == true)
{
if (drawnGladCard1 == 23 || drawnGladCard2 == 23 || drawnGladCard3 == 23)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad24Board == true || glad24Discard == true)
{
if (drawnGladCard1 == 24 || drawnGladCard2 == 24 || drawnGladCard3 == 24)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad25Board == true || glad25Discard == true)
{
if (drawnGladCard1 == 25 || drawnGladCard2 == 25 || drawnGladCard3 == 25)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad26Board == true || glad26Discard == true)
{
if (drawnGladCard1 == 26 || drawnGladCard2 == 26 || drawnGladCard3 == 26)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad27Board == true || glad27Discard == true)
{
if (drawnGladCard1 == 27 || drawnGladCard2 == 27 || drawnGladCard3 == 27)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad28Board == true || glad28Discard == true)
{
if (drawnGladCard1 == 28 || drawnGladCard2 == 28 || drawnGladCard3 == 28)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad29Board == true || glad29Discard == true)
{
if (drawnGladCard1 == 29 || drawnGladCard2 == 29 || drawnGladCard3 == 29)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad30Board == true || glad30Discard == true)
{
if (drawnGladCard1 == 30 || drawnGladCard2 == 30 || drawnGladCard3 == 30)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad31Board == true || glad31Discard == true)
{
if (drawnGladCard1 == 31 || drawnGladCard2 == 31 || drawnGladCard3 == 31)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad32Board == true || glad32Discard == true)
{
if (drawnGladCard1 == 32 || drawnGladCard2 == 32 || drawnGladCard3 == 32)
{
DrawThreeUniqueGladiatorCards();
}
}
if (glad33Board == true || glad33Discard == true)
{
if (drawnGladCard1 == 33 || drawnGladCard2 == 33 || drawnGladCard3 == 33)
{
DrawThreeUniqueGladiatorCards();
}
}
}
我正在搞乱各种东西,试图(主要是数组)弄清楚当一张牌被选中时通知随机函数,并且只从牌组中的剩余牌中挑选而不使用这种可笑的方法。非常感谢任何指针或参考材料。
在您的情况下,从可用卡组中随机抽取下一张卡。如果你抽到一张红心皇后,则从可用卡(牌组)中移除该卡并从剩余卡中随机选择一张卡。
这意味着您当前随机选择价值和西装的方法不合适。相反,您可以例如在开始时将数组洗牌一次并挑选前 5 张牌(与真人如何打牌的类比在这里很引人注目)。数组中的每个条目都必须唯一标识一张卡片,因此它是有效的 {Value, Suit} 组合。”
我发现这篇文章在理论上很有用,但我似乎无法弄清楚如何自己实现它。
解决方案
创建一个套牌类,用卡片填充它,随机化顺序(不是卡片),然后从中抽牌,就像你在真正的套牌中一样。
首先,创建一个代表卡片的类:
class Card
{
private readonly int suit;
private readonly int rank;
public Card(int suit, int rank)
{
this.suit = suit;
this.rank = rank;
}
public int Suit { get { return suit; } }
public int Rank{ get { return rank; } }
}
现在我们有了一个Card
类,我们需要一些东西来容纳它们。从牌组顶部一次发一张牌,所以看起来队列是合适的。
我们将该队列包装在一个名为 Deck 的类中,并为其提供几个方法来填充自身、随机化顺序和发牌。
class Deck
{
private Queue<Card> cards = new Queue<Card>(); //Here's our queue
private readonly Random random = new Random();
//This is for a standard deck, but you could make it work it your special deck
//We just loop and make sure there is one of each possible card
private virtual IEnumerable<Card> CreateFreshDeck()
{
for (var suit = 1; suit<=4; suit++)
for (var rank = 1; rank <=13; rank++)
yield return new Card(suit,rank);
}
public void Shuffle()
{
this.cards = new Queue<Card>
(
CreateFreshDeck().OrderBy( a => random.Next() ) //This is where the shuffling happens
);
}
public int CardsRemaining
{
get { return cards.Count; }
}
public Card DealOne()
{
return this.cards.Dequeue();
}
public IEnumerable<Card> DealMany(int count)
{
return this.cards.Take(count);
}
}
现在你可以这样做:
var d = new Deck();
d.Shuffle();
while (!gameOver)
{
var card = d.DealOne();
//etc.
推荐阅读
- django - 从一个应用程序获取字段名称到 django 中的另一个应用程序
- python - 随机森林提高准确性
- xml - 无法通过 XSLT 在属性值中插入换行符
- python - 熊猫,set_index + groupby 滚动
- r - Shiny - 如何判断图形何时以编程方式完成渲染?
- r - 基本 gganimate 导致“设备错误......未使用的参数(useS4 = FALSE)”
- javascript - Lightningchart JS 错误报告:仪表板交易示例,布林带的一部分消失了
- swift - Swift:后台应用程序刷新任务 - 如何查看任务是否成功运行
- r - 根据与另一列的部分匹配创建新列
- python - 如何从熊猫创建某些标准的列表?