C数字猜谜游戏
我刚开始学习C编程,为了锻炼我找到了这个任务。这是一个数字猜游戏,电脑猜出我心中的数字。首先我得想一个数字。然后我必须扫描数字所在的范围。然后计算机生成一个在这个范围内的数字,并问我它是否正确。根据计算机的回答,如果太低,我必须用L回答,如果太高,我必须用H回答,如果正确,我必须用G回答。如果它是正确的,它会打印出来,以及尝试的次数。如果输入了任何其他字符,它会打印出我输入了错误的答案 这就是我到目前为止得到的。它不会给我任何错误,但当我输入L、H或G时,它会打印出我输入了错误的答案 提前感谢你的帮助C数字猜谜游戏,c,C,我刚开始学习C编程,为了锻炼我找到了这个任务。这是一个数字猜游戏,电脑猜出我心中的数字。首先我得想一个数字。然后我必须扫描数字所在的范围。然后计算机生成一个在这个范围内的数字,并问我它是否正确。根据计算机的回答,如果太低,我必须用L回答,如果太高,我必须用H回答,如果正确,我必须用G回答。如果它是正确的,它会打印出来,以及尝试的次数。如果输入了任何其他字符,它会打印出我输入了错误的答案 这就是我到目前为止得到的。它不会给我任何错误,但当我输入L、H或G时,它会打印出我输入了错误的答案 提前感谢你
#include<stdio.h>
#include<stdlib.h>
void main(){
int randomNo = 0;
int input = 0;
int counter = 0;
int min = 0;
int max = 0;
char answer = ' ';
char low = 'L';
char high = 'H';
char good = 'G';
printf("Enter min and max: ");
scanf_s("%d %d", &min, &max);
do{
randomNo = min + rand() % (max - min) + 1;
printf("Is it %d?\n", randomNo);
printf("Enter your answer:");
scanf_s("%s", &answer);
if (answer == low){
printf("Number guessed is low\n");
min = randomNo;
counter++;
}
else if (answer == high){
printf("Number guessed is high\n");
max = randomNo;
counter++;
}
else{
printf("You entered the wrong answer!\nYour answer should be L - too low H - too high G - goed\n");
}
} while (answer != good);
printf("Your answer is correct!\nYou guessed it in %d times!\n", counter);
}
#包括
#包括
void main(){
int randomNo=0;
int输入=0;
int计数器=0;
int min=0;
int max=0;
char-answer='';
char low='L';
字符高='H';
char good='G';
printf(“输入最小值和最大值:”);
扫描频率(“%d%d”、“最小值”、“最大值”);
做{
randomNo=min+rand()%(max-min)+1;
printf(“是%d吗?\n”,否);
printf(“输入您的答案:”);
scanf_s(“%s”和“应答”);
如果(答案==低){
printf(“猜测的数字低\n”);
最小值=零;
计数器++;
}
否则如果(答案==高){
printf(“猜测的数字高\n”);
max=no;
计数器++;
}
否则{
printf(“您输入了错误的答案!\n您的答案应该是L-太低H-太高G-goed\n”);
}
}而(答案!=好);
printf(“你的答案是正确的!\n你猜了%d次!\n”,计数器);
}
应该是:
scanf_s("%c", &answer); /* answer is a char (not a string) */
另一方面:
使用相同种子的两个不同初始化将生成
在对兰德公司的后续调用中也会出现相同的连续结果
如果seed设置为1,则生成器将重新初始化为其初始值
值,并生成与调用rand或rand之前相同的值
斯兰德
为了生成类随机数,srand通常被初始化
对于某些独特的运行时值,如函数返回的值
时间(在标题中声明)。这对大多数人来说已经足够独特了
琐碎的随机化需要
添加
srand(时间(空))代码>从一开始。您的扫描是“扫描”字符串(%s
),而不是字符(%c
)
使用scanf_s(“%c”,&answer)
!:) 而不是
scanf_s("%s", &answer);
使用:
Asanswer
不是字符串,而是字符
您还需要将else
更改为else if(answer!=“G”)
或else if(answer!=good)
rand
也将生成相同的值。为了生成随机值,您需要
srand(time(NULL));
在main
的开头。这是您的如果语句也需要处理answer==good
,否则您将在输入G
时打印错误的答案。如果(回答!=好)
void main()
应该是int main(void)
,您可以简单地将最后一个else
更改为else。您使用scanf\u s
而不是scanf
(或fgets
/getchar
等)的原因是什么?它的便携性差,没有任何优势。如果你必须使用它(因为这是一个你必须使用的任务或类似的任务):你使用哪个版本——微软的CRT版本还是C11附件K中的标准版本?我正在Visual Studio 2013中编写代码,它不允许使用scanf,因为它不安全。但是我会尝试fgets和getchar。为什么scanf_s
而不是scanf
?@chouaib,有安全增强功能。他使用scanf_s,他可能有他的原因(可能是他正在学习的教程,或者他可能更喜欢一直使用scanf_)。我不会要求他改变这一点:O@AlterMann:scanf_s
并不比scanf
更安全(如果使用错误,两者都是危险的,如果使用正确,两者都是安全的),这里给出的所有答案都很好地说明了原因(在所有情况下都是UB)@Sorikairo:OP可能是在使用MSVC,并被一些针对标准C函数的警告误导,这些警告旨在鼓励人们编写可移植性较差的代码。
scanf_s(" %c", &answer);
srand(time(NULL));