前言
博客主页:干脆面la的主页
为了能够获得更多关于使用分支与循环语句的经验,现在编写一个简单的游戏程序。这个程序产生一个1~100的随机数,用户尝试尽可能少的次数猜出这个数。
- 如果认为博主的文章对你有所帮助
- 欢迎三连加关注
- 你们的支持是最我大的动力!
目录
正文开始...
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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;
}
(完)