C# Class int parse
本文关键字:parse int Class | 更新日期: 2023-09-27 17:59:23
所以我有一个类,它为21点游戏随机抽取一张牌。当我试图计算先发手的得分时,理论上它应该有效,但我不知道为什么它不起作用。在我运行程序几次并且运行良好之后,它抛出了一个StackOverflowException
。
public static class DrawCard
{
static string[] culoare = new string[4] { "r", "g", "b", "v" };
static string[] numere = new string[13] { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
public static Rectangle carteRec = new Rectangle(50, 50, 100, 100);
public static Rectangle sourceRec = new Rectangle(0, 0, 220, 314);
public static GraphicsUnit unit = GraphicsUnit.Pixel;
public static Image carte1, carte2;
private static string carte;
private static int _nr, _cul;
public static int scor1, scor2, _scor;
public static string randomcard(Random r, int scor)
{
//string carte = "";
//randomizam culoarea si numarul cartii
_nr = r.Next(0, 13);
_cul = r.Next(0, 4);
if (_nr >= 0 && _nr <= 8)
{
scor += int.Parse(numere[_nr]);
}
else if (_nr > 8 && _nr <= 12)
{
scor += 10;
}
carte = (string)numere[_nr] + (string)culoare[_cul];
return carte;
}
public static int Scor
{
get { return _scor; }
set { _scor = value; }
}
public static void StartHand(Graphics desen, Rectangle destRec1, Rectangle destRec2)
{
string k = randomcard(new Random(), scor1);
string j = randomcard(new Random(), scor2);
//_scor = scor1 + scor2;
if (k != j)
{
carte2 = Image.FromFile(@"C:'Users'Raul'Documents'visual studio 2010'Projects'Blackjack'Blackjack'Carti'" + j + ".jpg");
carte1 = Image.FromFile(@"C:'Users'Raul'Documents'visual studio 2010'Projects'Blackjack'Blackjack'Carti'" + k + ".jpg");
desen.DrawImage(carte1, destRec1, sourceRec, unit);
desen.DrawImage(carte2, destRec2, sourceRec, unit);
}
else
{
StartHand(desen, destRec1, destRec2);
}
}
}
您不能以这种方式创建Random
的多个新实例。文件上写着:
默认种子值源自系统时钟,并且具有有限的分辨率。因此,通过调用默认构造函数连续创建的不同随机对象将具有相同的默认种子值,因此将产生相同的随机数集。这个问题可以通过使用单个随机对象来生成所有随机数来避免。
这意味着在StartHand
的开头通常有k == j
,因此进行递归调用。这反过来又导致堆栈溢出。
只创建一个随机数生成器实例。您可能希望使用比系统时钟更好的种子。所有的随机数都应该来自Random
的这个单一实例。
建议您使用循环而不是递归来确保k
与j
不同。
你试图得分的做法完全错误。你似乎在randomcard
中尝试过。但你只会对一个局部变量进行评分,该变量的值不会被记住。我想你的意思是randomcard
的分数参数是out
的参数。
我建议您需要采用更实用的编码风格。具有绘制卡片的功能。让卡片由一个包含suit和value成员的结构表示。有一个函数,在给定值的情况下返回分数。停止使用过多的静态成员,尽可能使用局部变量和返回值。
您的随机套装编号有五个值(_cul=r.Next(0,4);)以及您的随机卡号十四个值(_nr=r.Next(0,13);),每种都多了一个。