简单了解C语言后,我们尝试写出一个简单的猜数游戏吧。
游戏名称:
猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏。
游戏规则:
首先由计算机自动给出一个随机数,然后由玩家输入出所猜数字,系统会自动告知玩家所猜数据比实际数据大还是小,之后玩家可以根据系统提示,对所猜数据做出调整后再次输入,直到玩家所猜数据与实际数据相吻合,一轮游戏结束。
- 获取一个随机数;
- 输入所猜数据并且得到反馈(猜大了,猜小了,猜对了);
- 实现可以反复玩的功能;
获取随机数和输入所猜数据得到反馈属于游戏内容,我们首先根据反复玩这个功能去建立游戏基本框架。
我们需要设计一个友好的询问菜单
menu()界面询问玩家是否进行游戏,而且要实现反复玩的功能,这里肯定需要用到循环,游戏每结束一次,这个询问菜单界面弹出,询问玩家是否进行下一轮游戏还是退出游戏。
#include<stdio.h> void menu(void) //询问菜单 {
printf("\n"); printf("\n"); printf("* 1. play \n"); printf("* 0. exit \n"); printf("\n"); printf("\n"); } int main() {
int input; //菜单栏 do {
menu(); //调用了询问菜单 printf("请选择:"); scanf("%d", &input); //玩家输入自己的选择 if (input == 1) {
printf("进行猜数游戏\n"); } else if(input == 0) {
printf("退出游戏\n"); break; } else {
printf("请重新输入\n"); } } while (input); return 0; }
讯享网
效果如下:我们已经基本实现了猜数游戏的框架构造

讯享网
在上面我们基本实现猜数游戏的整体框架之后,我们需要对猜数游戏
game()进行设计。
rand ()
运用 rand() 函数可以产生随机数,范围在0至RAND_MAX(32767) 之间。
讯享网#include<stdio.h> #include<stdlib.h> //使用rand()函数的头文件 int main() {
int i; int a[5] = {
0 }; for (i = 0; i < 5; i++) {
a[i] = rand(); } for (i = 0; i < 5; i++) {
printf("%d ", a[i]); } return 0; }
运用rand()函数时,该代码块多次运行结果均相同。这就意味着如果单纯用rand()函数产生随机数时,每轮游戏将产生的随机数是相同的。若要不同,就要在使用rand()函数前使用srand() 函数,先去设置初始化随机数的生成器(生成起点)。



srand()
运用 srand() 函数初始化随机数的生成起点,其参数是一个整数。
#include<stdio.h> #include<stdlib.h> int main() {
int i; int a[5] = {
0 }; srand(100); //这里的参数是随便输入的一个数 for (i = 0; i < 5; i++) {
a[i] = rand(); } for (i = 0; i < 5; i++) {
printf("%d ", a[i]); } return 0; }


讯享网#include<stdio.h> #include<stdlib.h> int main() {
int i; int a[5] = {
0 }; srand(100); //这里的参数是随便输入的一个数 for (i = 0; i < 5; i++) {
a[i] = rand(); } for (i = 0; i < 4; i++) {
printf("%d ", a[i]); } return 0; }

我们发现如果每次 srand() 函数参数都设相同值,rand()所产生的随机数值每次就会一样。
所以 srand() 函数的参数每次都需要发生变化,使每次产生的随机数都不相同。这里就可以用到 时间戳。

time()
时间戳是当前计算机时间与计算机起始时间(1970年1月1日00点00分00秒)之间的时间差值秒数。在C语言中用 time() 表示,它的返回值是不断发生变化的。
time_t time (time_t* timer);这里的返回类型time_t在编译器中的解释为整型。

#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {
int i; int a[5] = {
0 }; srand((unsigned int) time (NULL)); for (i = 0; i < 5; i++) {
a[i] = rand(); } for (i = 0; i < 5; i++) {
printf("%d ", a[i]); } return 0; }


我们发现用time()作为strand()参数可以有效解决上面遇到的问题
但是
讯享网#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {
int i; int a[5] = {
0 }; srand((unsigned int) time ( NULL )); printf("第一次"); for (i = 0; i < 5; i++) //第一次 {
a[i] = rand(); } for (i = 0; i < 5; i++) {
printf("%d ", a[i]); } printf("\n"); printf("第二次 "); srand((unsigned int)time(NULL)); for (i = 0; i < 5; i++) //第二次 {
a[i] = rand(); } for (i = 0; i < 5; i++) {
printf("%d ", a[i]); } printf("\n"); return 0; }

我们发现srand((unsigned int) time ( NULL ))不可快速频繁调用,因为频繁调用太快时,时间戳的值不会改变,以至于 srand() 参数不会发生变化。在猜数游戏时并不需要在每次生成随机数时都将srand((unsigned int) time ( NULL ))调用一次,只需要设置一次随机数的起点即可。

了解了以上知识,我们就可以着手写猜数游戏game()部分。先产生一个随机数,然后输入所猜数据,直到随机数与所猜数据相同,即可退出循环。
void game() {
int a = 0; int guess=0; //srand((unsigned int) time(NULL));在主函数中调用一次即可 //生成一个1到100的随机数 a = rand()%100+1; //开始猜数字 while (1) {
printf("请输入你所猜的数字: "); scanf("%d", & guess); if (guess > a) printf("猜大了\n"); else if (guess < a) printf("猜小了\n"); else {
printf("恭喜你,猜对了\n"); break; //猜对以后跳出循环 } } }
综上,将两部分代码合并起来为:
讯享网#include<stdio.h> #include<time.h> #include<stdlib.h> void menu(void) {
printf("\n"); printf("\n"); printf("* 1. play \n"); printf("* 0. exit \n"); printf("\n"); printf("\n"); } void game() {
int a = 0; int guess=0; //生成一个1到100的随机数 a = rand()%100+1; //开始猜数字 while (1) {
printf("请输入你所猜的数字: "); scanf("%d", & guess); if (guess > a) printf("猜大了\n"); else if (guess < a) printf("猜小了\n"); else {
printf("恭喜你,猜对了\n"); break; //猜对以后跳出循环 } } } int main() {
srand((unsigned int)time(NULL));//用时间戳作为参数,设置随机数的生成起点。 int input; do {
menu();// 询问菜单 printf("请选择:"); scanf("%d", &input); if (input == 1) {
game(); } else if(input == 0) {
printf("退出游戏\n"); break; } else {
printf("请重新输入\n"); } } while (input); return 0; }
运行结果:

game over !


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/126849.html