【问题标题】:Guess the number game, every # is low猜数字游戏,每个#都低
【发布时间】:2016-01-11 22:10:40
【问题描述】:

我在这个项目上已经花了好几个小时试图弄清楚这一点,但我已经到了脑死的地步,我读到的所有东西都让我感到困惑。

这个想法是输入一个数字,程序会告诉我它是对还是错。每次我输入数字后的结束响应都是数字太低。

此外,最终答案表明答案太低,同时它是正确的。

最后,这个东西是假设再次询问输入的数字是否不正确,但我不知道如何做到这一点。

从字面上看,在这一点上,最微小的建议是非常感谢的。这是一个漫长而痛苦的夜晚。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int number;
//new function
void welcomeMessage(){
    printf("Welcome to my new guessing game!\n");
    printf("Let's get started!\n");
}
//new function
int randomNumber(){

    int range;

    srand(time(NULL));
    range = (20 - 1) + 1;

    number = rand() % range + 1;

    return 0;
}
//new function
int guessInput(){

    int guess, range;

    printf("I'm thinking of a number between 1 and 20\n");
    printf("Care to give it a guess? Be careful! You only get 4 tries!\n");
    scanf("%d", &guess);

    return 0;
}
//new function
int wrongAnswer(){

    int guess, number;

        if(guess < number)
        {   
            printf("Try again, your guess is too low\n");
            return 0;
    }

        else if(guess > number)
    {   
            printf("Give it another try, your guess was a bit to high\n");
            return 0;
    }
        return 0;
}
//new function
int correctAnswer(){

    int guess, number;

        if(guess == number)
            printf("Great job! That time you got it right!\n");
            return 0;
}

int main(){
    welcomeMessage();
    randomNumber();
    guessInput();
    wrongAnswer();
    correctAnswer();

}

【问题讨论】:

  • 您在每个函数中定义新变量——这些不是“全局”的,只存在于这些函数中。
  • 不要每次打电话给srandrand。在程序启动时调用一次。
  • @JonathonReinhart 抱歉,您能进一步解释一下或者可能告诉我吗?我不太明白。
  • “不要使用全局变量”...他解决了那个问题...只是可能没有达到预期的行为
  • 未定义行为蝙蝠侠!

标签: c function loops


【解决方案1】:

您实际上并未将guess 的值传递给wrongAnswer()correctAnswer()。这两个函数中的guess 未初始化并且不包含存储在guessInput() 中的值。这就是为什么wrongAnswer 告诉你猜测太低而correctAnswer 告诉你猜测是正确的。

您还需要删除这些函数中的number 声明。你现在有一个全局的number 来存储随机数,但是在你的函数中声明的新的number 变量将具有优先权——它没有初始化并且不像你想象的那样包含随机数。

您可能需要调整 wrongAnswer()correctAnswer() 函数以将 guess 作为整数参数,并删除这两个函数中的 guessnumber 声明。类似的东西

int wrongAnswer(int guess);
int correctAnswer(int guess);

您可能还想考虑让您的guessInput() 函数返回guess 的值。尝试类似

int guessInput()
{   
    int guess;

    printf("I'm thinking of a number between 1 and 20\n");
    printf("Care to give it a guess? Be careful! You only get 4 tries!\n");
    scanf("%d", &guess);

    return guess;
}

int main()
{
    ...
    int guess = guessInput();
    wrongAnswer(guess);
    correctAnswer(guess);
    ...
}

通过这种方式,您可以将guess 的值传递给您的两个函数,以便它们可以实际评估数字是正确还是不正确。

您还需要查看返回函数的值。现在他们并没有真正告诉你任何事情,无论如何他们都会返回 0。考虑将它们更改为如果猜测正确则返回 0,如果猜测不正确则返回 1。

int correctAnswer(int guess)
{   
    if(guess == number) {
        printf("Great job! That time you got it right!\n");
        return 0;
    } else {
        return 1;
    }
}

有了这些信息,您可以创建一个while 循环来不断地询问用户输入,直到他们输入正确的答案。类似的东西

int main()
{
    ...
    int is_correct = 1, is_wrong = 1;
    int guess;
    while (is_correct == 1) {
        guess = guess_input();
        is_wrong = wrongAnswer(guess);
        is_correct = correctAnswer(guess);
    }
    ...
}

上面的while 循环将永远调用这三个函数中的每一个,直到用户猜出正确的输入。它评估is_correct == 1,不断检查is_correct 的值,并不断重复。当is_correct == 0 循环将中断并且您的程序将终止。这就是我上面提到的返回值的用武之地——返回值 0 表示正确答案,并允许您的程序停止。返回值 1 将重复循环。还有其他方法可以做到这一点,但在您刚开始时可能会有所帮助。

希望这对您有所帮助。我还考虑重新设计你的wrongAnswer()correctAnswer() 函数——你真的需要两个吗?你能把它简化为一个函数吗?

【讨论】:

  • 感谢所有这些。可悲的是,它要求我有两个功能来判断错误和正确的答案。最好我想将其简化为一个,但这是不允许的。
【解决方案2】:

我在程序中看到的最基本问题是您没有将值传递给函数。每个函数本身都在工作,并且值或者我应该说它必须使用的“数字”没有被传递给它们。

您可以使用全局变量或直接传递值。这就是我会做的:

输入函数:

int guessInput(){
int guess, range;
printf("I'm thinking of a number between 1 and 20\n");
printf("Care to give it a guess? Be careful! You only get 4 tries!\n");
scanf("%d", &guess);
return guess;}

随机数生成函数:

int randomNumber(){
int range;
srand(time(NULL));
range = (20 - 1) + 1;
number = rand() % range + 1;
return number;}

答案函数:(你真的不需要 2 个函数)

int Answer(int guess, int number){

int counter=0;
    if(guess < number)
    {   
        printf("Try again, your guess is too low\n");
        counter=1;
}

    else if(guess > number)
{   
        printf("Give it another try, your guess was a bit to high\n");
        counter=1;
}

    else if(guess == number)
{   
        printf("Great job! That time you got it right!\n");
        counter=2;
}
    return counter;}

现在你所有的函数都可以接受变量了,修改主函数

int main(){

int number=0;
int guess=0;
int answr=0; // This does not have to exist but since your doing a return.
welcomeMessage();
number=randomNumber();
guess=guessInput();
Do {
answr=Answer(guess,number);
}(while answr<2)
}

所以当计数器达到 2 时,这意味着答案是正确的,当用户猜到正确答案时,while 循环将停止。

PS:您可能需要稍微完善一下我的代码,因为我也处于脑死亡模式 atm。 :D

【讨论】:

  • 非常感谢您。我同意将答案功能减少到一个会更简单,但是说明说我们必须将它们分成两个,一个代表正确,一个代表不正确。
  • 好的,如果这是一个要求,你可以按照最初的想法,在 while 循环中拥有这两个函数(最好修改我创建的方式)。确保您有结果的返回值,代码将执行这两个函数,一旦满足正确答案的返回值,您就可以退出循环。如果您希望我为您创建一个代码 sn-p,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多