【问题标题】:C# Class int parseC# 类 int 解析
【发布时间】:2014-04-23 05:23:46
【问题描述】:

所以我有这个类可以为二十一点游戏随机抽取一张牌。当我尝试计算起手牌的分数时,理论上它应该可以工作,但我不知道为什么它没有。而且,在我运行该程序几次并且运行良好后,它会抛出一个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);

        }
    }
  }

【问题讨论】:

  • 抛出异常时调试器告诉你什么?
  • 恭喜:你无意中发现了尾调用的必要性;p

标签: c# parsing int


【解决方案1】:

您不得以这种方式创建Random 的多个新实例。 documentation 说:

默认种子值来自系统时钟并且具有有限的分辨率。因此,通过调用默认构造函数连续创建的不同 Random 对象将具有相同的默认种子值,因此将产生相同的随机数集。这个问题可以通过使用单个 Random 对象生成所有随机数来避免。

这意味着在StartHand 的开头你通常有k == j 并因此进行递归调用。反过来,这会导致堆栈溢出。

只创建一个随机数生成器实例。您可能希望使用比系统时钟更好的种子。所有随机数都应来自Random 的单个实例。

建议您使用循环而不是递归来确保k 不同于j

您的得分尝试完全错误。您似乎在randomcard 中尝试这样做。但是你只得分到一个不被记住值的局部变量。我认为您的意思是 randomcard 的 score 参数是 out 参数。

我建议您需要采用更实用的编码风格。有抽卡的功能。让卡片由具有花色和价值成员的结构表示。有一个给定值返回分数的函数。停止使用这么多静态成员,并尽可能使用局部变量和返回值。

【讨论】:

  • 谢谢@David。但得分值仍然为 0,我不知道为什么。 stackoverflow 异常现在可以了。
  • 您询问了有关 Stack Overflow 的问题。这肯定是您所提问题的答案。
  • 是的,谢谢。但是如果你愿意,你可以看看 int 解析有什么问题吗?
  • 你的评分是用随机卡完成的吧?但这会修改​​参数,它们是按值传递的本地参数。
  • 哦,是的。但是这里我没有指针来改变实际值,那么没有指针怎么能做到呢?
【解决方案2】:

你的随机花色有五个值 (_cul = r.Next(0, 4);) 和你的随机牌号有十四个值 (_nr = r.Next(0, 13);),一个太多每个。

【讨论】:

  • 是的,但随机函数不包括 13 和 4
  • 对不起,参数名maxValue有误导性。
猜你喜欢
  • 2011-09-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多