【问题标题】:C# Safe Cracking minigame not working as expectedC# 安全破解迷你游戏无法按预期工作
【发布时间】:2017-03-15 21:11:44
【问题描述】:

背景:

我正在尝试为我班上的一款游戏制作一个小迷你游戏,但我无法让它 100% 发挥作用。问题是如果你通过 20 次猜测,它会无限打印 generateCombo(); 消息,我也无法让它转到第二个数字。

任何帮助,我是新的代码,今年才开始。

提前致谢!

class Safe
{
    public bool safeLocked { get; set; }
    public int guesses { get; set; }
    public int cn1 { get; set; }
    public int cn2 { get; set; }
    public int cn3 { get; set; } 
    public int cn4 { get; set; }
    public int num1 { get; set; }
    public int num2 { get; set; }
    public int num3 { get; set; }
    public int num4 { get; set; }

}

safe.guesses = 0;
        safe.safeLocked = true;
        safe.cn1 = 0;
        safe.cn2 = 0;
        safe.cn3 = 0;
        safe.cn4 = 0;

public static void generateCombo()
    {

        //First number
        Random n1 = new Random();
        safe.num1 = n1.Next(1, 10);

        //Second number
        Random n2 = new Random();
        safe.num2 = n2.Next(1, 10);

        //Third number
        Random n3 = new Random();
        safe.num3 = n3.Next(1, 10);

        //Fourth number
        Random n4 = new Random();
        safe.num4 = n4.Next(1, 10);

        Console.WriteLine ("A new combonation has been generated.");
        Console.ReadLine ();
        safeCracking ();

    }

public static void printScreen()
    {
        Console.Clear ();
        Console.ForegroundColor = ConsoleColor.Green;
        Console.Write("Guesses: ");
        Console.ResetColor();
        Console.WriteLine("{0}", safe.guesses);
        Console.WriteLine("");

        Console.WriteLine("     =================================    ");
        Console.WriteLine("     |       |       |       |       |    ");
        Console.WriteLine("     |       |       |       |       |    ");
        Console.WriteLine("     |   {0}   |   {1}   |   {2}   |   {3}   |    ", safe.cn1, safe.cn2, safe.cn3, safe.cn4);
        Console.WriteLine("     |       |       |       |       |    ");
        Console.WriteLine("     |       |       |       |       |    ");
        Console.WriteLine("     =================================    ");
        Console.WriteLine("");
        Console.WriteLine("Guess the numbers of the combination one by one.");
        Console.WriteLine("");
    }


    public static void safeCracking()
    {
        for (int i = 0; i < 20; i++) {

            if (safe.guesses == 20) {
                generateCombo ();
            }

            printScreen ();

            string numg;
            int numberG;

            try{
                numg = Console.ReadLine();
                numberG = int.Parse(numg);
            }   catch {
                numg = "";
                numberG = 0;
            }
            numberOf.puzzleGuess = numg;

            //Check number 4
            if (safe.cn3 < 0 && (numg == safe.num4.ToString ())) {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("");
                Console.WriteLine("{0} Is Correct!", numberOf.puzzleGuess);
                Console.ResetColor();
                safe.cn4 = numberG;
                Console.ReadLine();
            } 

            //Check number 3
            else if (safe.cn2 < 0 && (numg == safe.num3.ToString ())) {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("");
                Console.WriteLine("{0} Is Correct!", numberOf.puzzleGuess);
                Console.ResetColor();
                safe.cn3 = numberG;
                Console.ReadLine();
            }

            //Check number 2
            else if (safe.cn1 < 0 && (numg == safe.num2.ToString())) {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("");
                Console.WriteLine("{0} Is Correct!", numberOf.puzzleGuess);
                Console.ResetColor();
                safe.cn2 = numberG;
                Console.ReadLine();
            }

            //Check number 1
            else if (safe.cn1 == 0 && (numg == safe.num1.ToString())) {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("");
                Console.WriteLine("{0} Is Correct!", numberOf.puzzleGuess);
                Console.ResetColor();
                safe.cn1 = numberG;
                Console.ReadLine();
            } 

            else {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("");
                Console.WriteLine("{0} Is Incorrect!", numberOf.puzzleGuess);
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Press Enter to continue...");
                Console.ResetColor();
                Console.ReadLine();
                safe.guesses++;
                safeCracking();
            }

        }

        if (safe.safeLocked == false) {
            //Continue game here
        }

    }

【问题讨论】:

  • 您能否编辑您的回复并添加“安全”对象的代码?
  • 我们需要看看 generateCombo() 方法。
  • @StfBln 知道了
  • @OusmaneMahyDiaw 完成
  • @OusmaneMahyDiaw 是正确的。每当调用 safeCracking() 时,都会开始一个新循环。 generateCombo 问题很简单。 GenerateCombo 调用 SafeCracking。他创建了一个无限循环。

标签: c# string for-loop int


【解决方案1】:

我假设您想生成一个连击并猜测 20 次,而不是每次有人猜测时重新生成一个连击(对于 IMO 游戏来说更有意义)。如果是这种情况,您应该将 generateCombo() 移出 for 循环

if (safe.guesses == 20) {
            generateCombo();
            safe.guesses = 0;
}

for (int i = 0; i < 20; i++) {
...

另外,您不需要在generateCombo() 中使用safeCracking();,因为它会导致无数次调用。有些东西调用safeCracking() 方法来启动游戏,它调用generateCombo(),它调用一个新的safeCracking() 等等。您的所有 for 循环都不会超过第一次迭代。

编辑:您可能还应该删除 else 中的 safeCracking() 递归调用。每次您似乎有错误的号码时都会调用该号码,并且每次您有错误的答案时都会重新启动游戏。

如果您希望游戏每 20 次猜测循环一次,为什么不在 for 循环之后放置一个 safeCracking() 调用。确保阅读“退出”行或用户可以输入以关闭游戏的某些命令。

try{
text = Console.ReadLine();
if(text.ToLower() == "exit")
   return
numberG = int.Parse(text);
}   catch {
            numberG = 0;
        }

【讨论】:

  • 另外,我很确定您检查猜测是否正确的所有逻辑都使用 numg 而不是您想要的 numberG 。 (包括 numberOf.puzzleGuess = numg; 我认为应该 = i?)。不过,与您询问的问题并不真正相关。
  • 我尝试将 generateCombo() 从 for 循环中取出,但这似乎不起作用。此外,我将 safeCracking() 从 generateCombo() 中取出,但它不起作用,因为在我执行 generateCombo() 后它结束了。另外这只是我游戏里面的一个小游戏,只是一个小谜题。
  • 那么 safe.guesses 不是 20,当您最初开始迷你游戏时,所以 if 应该是 if(safe.guess % 20 == 0)。除此之外,是的,主要问题是这些电话是循环的。并且您的程序流程只是陷入了循环。您的代码似乎只在 safe.guesses 达到 20 时才生成 Combo()。
  • 推论,原来的循环一定是else中的safeCracking()调用。每次出现 else 时,都会不断创建一个新的 for 循环。
  • 由于您是编程新手(耶!)并且在线课程没有老师可以向您寻求帮助或反馈您的代码有什么问题,我附上了我用来调试代码和玩游戏的简单程序。您应该能够仅使用该代码运行和玩游戏;它在我用我的名字注释掉的大部分行上都有 cmets 以及我为什么这样做。希望你好好学习,不要灰心! gist.github.com/RMSD/fdba4cc689ec81592a709e718386518c
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多