前言
猜数游戏:计算机随机生成一个100以内的正整数,给予你一定次数的猜数机会,如果准确猜中,计算机会输出“Congratulations!You are right!”;如果没猜中,计算机则输出“GAME OVER”并结束程序。(可以通过其他的一些指令来优化该游戏,使之更具挑战或趣味)
一、分析
????????要让计算机随机生成一个数字,需要用到rand()函数,它会随机生成一个位于 0 ~ RAND_MAX 之间的整数。RAND_MAX 是?<stdlib.h> 头文件中的一个宏,它用来指明 rand() 所能返回的随机数的最大值。C语言标准并没有规定 RAND_MAX 的具体数值,只是规定它的值至少为 32767。在实际编程中,我们也不需要知道?RAND_MAX 的具体值,把它当做一个很大的数来对待即可。但是仅使用rand()函数生成的“随机数”是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为种子。种子和随机数之间是存在正态分布的关系的。因为种子在计算机启动的时候是随机的,但计算机启动后它就不再发生变化了;即每次启动计算机后,种子就定值了,所以根据公式推导出来的随机数也固定了。
????????那如何生成一个在每次运行时都不同的数字呢?
? ? ? ? 这需要用到srand()函数,它是用来初始化随机种子数的。它需要一个 unsigned int 类型的参数。
????????因为time的值是每时每刻都不同的,我们就需要使用到time()函数(要在代码前加上<time.h>的头文件),我们可以用当前时间来获取这个种子数,由于每一次运行的时间都不同,则我们获得的种子也不同,根据公式推导出来的随机数也不相同,这时我们调用rand(),让它根据提供给srand()的种子数返回一个随机数,需要100以内的随机数,我们就再让这个随机数对100取模就行了。
????????获得随机数的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int a;
srand((unsigned)time(NULL));
a = rand()%100;
printf("%d\n", a);
return 0;
}
? ? ? ? 接下来,输入一个数,让计算机判断是比随机数大还是小,直到猜对为止。
? ? ? ? 使用while循环来多次猜数,猜对了就退出循环结束程序。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void)
{
int a,b;
srand((unsigned)time(NULL));
a=rand()%100;
printf("请猜一个数(0~100)\n");
while(1)
{
scanf("%d",&b);
if(b>a)
printf("大了,请继续);
if(b<a)
printf("小了,请继续);
if(b==a)
{
printf("Congratulations!You are right!\n");
break;
}
}
return 0;
}
基本的猜数游戏就到这了。
我们可以通过限定次数让游戏变得更有趣:
在循环猜数之前定义一个整数,每循环一次,这个整数就自减一次,当这个数自减为0则跳出循环并输出“GAME OVER!”? ? ? ? 猜对之后用exit()直接结束程序,()内为负数提前结束程序。
是不是感觉GAME OVER!也没什么趣味?
我们先了解一下关机的代码(只能在Windows操作系统上实现):
system("shutdown -s -t 50");
shutdown就是令计算机关机或者重新启动的指令,“-s”表示关机,“-r”表示重启,“-t 50”表示在五十秒后关机或重启。
再了解一下取消关机的代码:
system("shutdown -a");
在次数消耗完之后,用户的电脑将关机,想要取消关机怎么办呢?
不妨再给用户一次机会,如果用户能输对你预先设定的一个密码,那就可以取消关机并输出一些图案或者字符。(可以预设为你男\女朋友生日,然后输出一个红色爱心和告白的话哈哈哈)
输出爱心图案的代码如下:
#include<stdio.h>
#include<math.h>
int main(void)
{
float y,x,z;
for(y=1.5f;y>-1.5f;y-=0.1f)
{
for(x=-1.5f;x<1.5f;x+=0.05)
{
z=x*x+y*y-1;
putchar(z*z*z-x*x*y*y*y<=0.0f?'*':' ');
}
putchar('\n');
}
return 0;
}
使用颜色和清屏指令后输出效果更佳
颜色(前一个X是背景色,后一个X是字体色,均使用16进制表达,自行百度其代表颜色):
system("color XX");
清屏(要加头文件<windows.h>:
system("cls");
二、结果
1.代码
该游戏完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>?
#include<math.h>
int main(void)
{
?? ?system("color 87");
?? ?int a,b,sum,h,l; //sum是你设定的猜数次数,l是你输入的密码
?? ?sum=5;
?? ?h=123456789; //这里是你预设的一个密码
?? ?srand((unsigned)time(NULL));
?? ?a=rand()%100;
?? ?printf("请猜一个数(0~100)\n");
?? ?while(1)
?? ?{
?? ??? ?sum--;
?? ??? ?scanf("%d",&b);
?? ??? ?if(b>a)
?? ??? ?printf("大了,你还剩下%d次机会,请继续\n",sum);
?? ??? ?if(b<a)
?? ??? ?printf("小了,你还剩下%d次机会,请继续\n",sum);
?? ??? ?if(b==a)
?? ??? ?{
?? ??? ??? ?printf("Congratulations!You are right!\n");
?? ??? ??? ?exit(-1);?
?? ??? ?}
?? ??? ?if(sum==0)
?? ??? ?{
?? ??? ??? ?printf("GAME OVER!!!\n");
?? ??? ??? ?printf("你还有一次输入密码的机会,否则你的计算机将关机。\n");?
?? ??? ??? ?system("shutdown -s -t 60");
?? ??? ??? ?break;?
?? ??? ?}
?? ?}
?? ?scanf("%d",&l);
?? ?if(h==l)
?? ?{
?? ??? ?system("cls");?
?? ??? ?system("color f4");
?? ??? ?float y,x,z;
?? ??? ?for(y=1.5f;y>-1.5f;y-=0.1f)
?? ??? ?{
?? ??? ??? ?for(x=-1.5f;x<1.5f;x+=0.05)
?? ??? ??? ?{
?? ??? ??? ??? ?z=x*x+y*y-1;
?? ??? ??? ??? ?putchar(z*z*z-x*x*y*y*y<=0.0f?'*':' ');
?? ??? ??? ?}
?? ??? ??? ?putchar('\n');
?? ??? ?}
?? ??? ?printf("Just Like You.\n");
?? ??? ?system("shutdown -a");
?? ?}
?? ?return 0;
?? ?Sleep(5000);
}
2.测试
测试结果如下:
?猜错之后再正确输入密码后的测试结果
?猜数次数内猜对的测试结果
总结
该游戏用到了rand()、srand()、time()等函数,还有shutdown等指令,难度也不高,只是使用的命令较多。不嫌弃的话快拿去整蛊你的小伙伴吧!
以上就是猜数游戏的全部内容了。若发现不足,欢迎指正,感谢你的观看。
|