2017-04-06 125 views
0

所以我创建了一个猜谜游戏。它应该让玩家1输入一个介于0和99之间的数字,如果他们输入了代码之外的任何内容,应该让他们重试。用while循环猜测游戏中的while循环和if语句调试

然后它会询问一些猜测/尝试玩家2必须输入他们认为的数字。如果程序太高,程序会这么说,如果程序太低,程序会这么说。如果它是正确的 - 玩家2赢了,如果他们没有猜测的话,该计划也是这样说的。

我的问题是与此代码的后半部分。我试图在剩下的猜测中进行猜测的次数。循环不起作用;这里是代码:

int secretnumber; 
    int guesses; 
    int secretnumberguess; 
    int remainingguesses; 

    while (1) { 
    printf("Player 1: Type a number between 0 and 99 and press return:\n"); 
    scanf(" %d",&secretnumber); 

    if (secretnumber > 99 || secretnumber < 0) { 
     printf("Secret number cannot be greater than 99 or below 0.\n"); 
     continue; 
    } 
    break; 
    } 

    printf("Type the number of guesses that player 2 gets and press return: \n"); 
    scanf("%d",&guesses); 

    remainingguesses = guesses - 1; 

    while (remainingguesses != 0) { 
    printf("Player 2: Type your guess and press return (guesses remaining:%d):\n",&remainingguesses); 
    scanf(" %d",&secretnumberguess); 

    if (secretnumberguess > secretnumber) { 
     printf("Your guess was greater than the secret number.\n"); 

     else if (secretnumberguess < secretnumber) 
     printf("Your guess was less than the secret number.\n"); 

     else (secretnumberguess == secretnumber) 
       printf("Your guess was equal to the secret number. You win!\n"); 
     continue; 
    } 
    break; 
    } 

    if (remainingguesses == 0) 
    printf("Sorry you are out of guesses. You lose.\n"); 

我完全不熟悉这一点,并试图调试和修复我的代码。但是循环对我来说确实是一场噩梦,特别是当你将这些声明放入组合时。我意识到自己很无能,我很抱歉,但是有人可以帮助我,因为我对代码的后半部分完全感到困惑。

+0

您可以减少(减少)while循环之外的剩余猜测数。因此,剩余猜测的数量永远不会达到零,并且您的循环永远不会终止。将减量移到刚刚从用户处获得下一个猜测之后。 (这是学习使用调试器遍历代码的好时机;它可以在循环的一两次中发现问题。调试器是您将要使用的功能最强大的工具之一当解决你的代码问题时,学会尽早使用它。) –

+0

'&remainingguesses'是存储变量'remainingguesses'的内存位置。你可能不想打印。尝试阅读来自编译器的警告消息。并学习如何使用调试器(例如GDB或LLDB)。 –

+0

为了将来的参考,像*循环这样的短语不工作*不是问题语句,除非你具体解释什么*不工作*的意思。在这种情况下,问题是循环永远不会终止,所以你应该说,而不是*不工作*。如果您需要帮助,请*具体*并明确说明问题。 –

回答

0

首先,这代码:

while (remainingguesses != 0) { 
    printf("Player 2: Type your guess and press return (guesses remaining:%d):\n",&remainingguesses); 
    scanf(" %d",&secretnumberguess); 

是错误的。当使用printf语句并且您试图在语句中输入变量时,您不需要将&放入其中。

所以,你需要更改代码,您可以:

while (remainingguesses != 0) { 
    printf("Player 2: Type your guess and press return (guesses remaining:%d):\n",remainingguesses); 
    scanf(" %d",&secretnumberguess); 

您需要在printf语句中删除&。我们只使用&来存储东西到一个变量中。

0

一步一步地写代码,尊重正确的语法和理解下一步要完成的内容。不要急于。学习和编程只是需要时间而已。

remainingguesses = guesses - 1; 

变量remainingguesses控制你的循环,但是你只有一次的值赋给它,不会事后更改。循环将永远不会结束。纠正后,问问自己:如果我输入3次猜测,我可以做多少次猜测?

printf("Player 2: Type your guess and press return (guesses remaining:%d):\n",&remainingguesses); 

这里要打印保存价值remainingguesses,而不是其实际值的内存地址。这是指针背后的概念,为了正确理解这里涉及的机制,我建议您研究一下。

if (secretnumberguess > secretnumber) { 
    printf("Your guess was greater than the secret number.\n"); 

    else if (secretnumberguess < secretnumber) 
    printf("Your guess was less than the secret number.\n"); 

    else (secretnumberguess == secretnumber) 
      printf("Your guess was equal to the secret number. You win!\n"); 
    continue; 
} 
break; 

小心那些大括号!只有当猜测大于秘密编号时,才会输入整个块。在任何其他情况下,执行将跳转至中止,然后退出,同时循环。我相信这个混淆让你混淆了继续使用中断的用法。

其他充当您的条件声明的意外事件。它不需要布尔值,也不需要像你正在使用的比较。换句话说,如果猜测数字既不大也不小于秘密数字,它保证与它相等。

这已被提及,但我不能强调它足够:注意编译器。研究它为您提供的每一个错误和警告。你将通过这种方式确保进展。