前言
博客主页:干脆面la的主页
为了能够获得更多关于使用分支与循环语句的经验,现在编写一个简单的游戏程序。这个程序产生一个1~100的随机数,用户尝试尽可能少的次数猜出这个数。
- 如果认为博主的文章对你有所帮助
- 欢迎三连加关注
- 你们的支持是最我大的动力!
目录
前言
1 下面是这个程序运行时用户将看到的
2 整体构思
2.1 main函数
2.2 menu()函数
2.3 game()函数
2.3.1 利用rand()函数生成1~100随机数
2.3.2 srand()函数
2.3.3 time函数
2.3.4 交互过程
3 完整代码奉上
正文开始...
1 下面是这个程序运行时用户将看到的
- 猜数字游戏
- 电脑随机生成一个1~100之间数字
- 用户猜小了,电脑会告诉:猜小了
- 用户猜大了,电脑会告诉:猜大了
- 玩家猜对了,电脑会告诉:恭喜你,猜对了
运行结果如下:
2 整体构思
这个程序需要完成几个任务:
- 打印菜单
- 选择开始游戏 or 退出游戏
- 生成随机数
- 猜测神秘数
- 与用户交互直到选出正确数
- 选择继续开始游戏 or 退出游戏
因此我们可以写下主函数的框架:
2.1 main函数
分析过程:
- 进入程序需要先打印菜单,并且选择1(开始游戏)/0(结束游戏)来开始游戏或结束游戏。
- 我们知道当程序一运行起来就要打印菜单并且输入选择开始or结束,因此选择用do...while循环来编写程序。
- 而input就是我们选择的对菜单进行的选择1(开始游戏)/0(结束游戏),用input作为while的判断条件恰好使输入1的时候条件为真继续循环,而输入0的时候条件为假结束循环。
- int main()
- {
- int input = 0;
- do
- {
- //打印菜单
- menu();
- printf("Please select:>");
- scanf("%d", &input);
- switch(input)
- {
- case 1://输入1开始游戏,调用game()函数
- game();
- break;
- case 0:
- printf("退出游戏\n");//输入0结束游戏,并且循环结束
- break;
- default:
- printf("选择错误\n");//输入其他数字会显示输入错误,并继续重新输入
- break;
- }
- } while (input);
- return 0;
- }
复制代码
2.2 menu()函数
menu函数的实现其实很简单,就是通过printf函数来打印相关内容
- void menu()
- {
- printf("**************************\n");
- printf("***** 1.start *****\n");
- printf("***** 0.exit *****\n");
- printf("**************************\n");
- }
复制代码
2.3 game()函数
分析过程:
- 电脑生成1~100随机数
- 用户猜数字
- 用户每猜一次就会告诉用户猜大or猜小
- 用户猜对了就返回主函数
2.3.1 利用rand()函数生成1~100随机数
C语言中生成随机数的方法是rand()函数
我们先来通过文档看看该怎么使用rand函数
转到定义得知RAND_MAX是一个十六进制数0x7fff也就是说返回一个十进制为0~32767的int
文档说到必须在使用rand函数前使用srand函数,我们尝试下如果不使用会怎么样:
- void game()
- {
- int r = rand();
- printf("%d\n", r);
- }
复制代码
第一次运行程序:

第二次运行程序:
我们发现两次运行生成的随机数居然是相同的,这明显不是我们想要的结果。
2.3.2 srand()函数
srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。

当我们将种子值设为1时,我们发现随机数都为41
- void game()
- {
- srand(1);
- int r = rand();
- printf("%d\n", r);
- }
复制代码

当我们将种子值设为100时,随机数又全为365

因此,种子值决定了随机数生成的值,因此我们要思考,什么参数是可以不断变化的,从而实现真正意义上的“随机”,这里我们可以将种子值设为不断变化的时间,这里我们又要引用time()函数。
2.3.3 time函数

由于time返回的值是time_t,而time_t转为定义我们发现它实际上通过typedef定义的整型


而srand函数需要的参数是unsigned int,因此我们需要对time函数强制类型转换为unsigned int,通过整理,我们只需要把代码写成这样,就可以在真正意义上生成随机数。
- void game()
- {
- srand((unsigned int)time(NULL));//设置随机数的生成器
- int r = rand();
- printf("%d\n", r);
- }
复制代码

但是这里还有一点是错误的,就是设置随机数的生成器只需要在整个工程中设置一次就可以了,如果在game()函数中创造随机数,如果输入快点会发现生成一样的随机数,如下图:

因此我们把它放在main函数里才是正确的打开方式,这时我们无论输入多快,随机数值都不会重复,如下图:



那么我们在设计程序时想要设置的数字时1~100之间的数字,我们要怎么做呢?
首先我们用r=rand()%100,r的范围就是0~99;
那么再加上1:r=rand()%100+1,r的范围就是1~100。
至此我们就成功生成随机数了:

2.3.4 交互过程
接下来就是猜数字及电脑与用户交互的过程,如下图代码:
- void game()
- {
- printf("请猜一个1~100的数字:>\n");
- //生成随机数
- int r = rand() % 100 + 1;
- int guess = 0;
- int count = 0;
- while(1)
- {
- scanf("%d", &guess);
- if (guess < r)
- {
- printf("猜小啦,请继续\n");
- count++;
- }
- else if (guess > r)
- {
- printf("猜大啦,请继续\n");
- count++;
- }
- else
- {
- printf("恭喜你,猜对啦!\n");
- count++;
- printf("总共猜了%d次~\n", count);
- break;
- }
- }
- }
复制代码
3 完整代码奉上
- #include #include #include void menu()
- {
- printf("**************************\n");
- printf("***** 1.start *****\n");
- printf("***** 0.exit *****\n");
- printf("**************************\n");
- }void game()
- {
- printf("请猜一个1~100的数字:>\n");
- //生成随机数
- int r = rand() % 100 + 1;
- int guess = 0;
- int count = 0;
- while(1)
- {
- scanf("%d", &guess);
- if (guess < r)
- {
- printf("猜小啦,请继续\n");
- count++;
- }
- else if (guess > r)
- {
- printf("猜大啦,请继续\n");
- count++;
- }
- else
- {
- printf("恭喜你,猜对啦!\n");
- count++;
- printf("总共猜了%d次~\n", count);
- break;
- }
- }
- }int main(){ int input = 0; srand((unsigned)time(NULL)); do { //打印菜单 menu(); printf("Please select:>"); scanf("%d", &input); switch(input) { case 1://进入游戏 game(); break; case 0://退出游戏 printf("退出游戏\n"); break; default: printf("选择错误\n"); break; } } while (input); return 0;}
复制代码
(完)
来源:https://blog.caogenba.net/m0_63303316/article/details/122489732
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |