游戏的条件:
1:电脑随机生成1~100之间的数字
2:如果猜小了就反馈小了,如果 猜大 了就反馈大了,直到正确为止
3:有很不错的用户体验
4:自行决定是否结束
可以学到的内容:
1:初步认识时间戳的运用
2:初步认识循环怎样嵌套
3:初步理解do while循环
4:锻炼写代码的逻辑能力
5:初识(rand)函数(srand)函数(time)函数
6:认识一个简单的游戏框架是怎样实现的
全篇无任何废话,本文的解释都在代码段中,所以一定要看代码,边看边学边理解。
这只是初学者入门的一个小游戏,不难懂,没有什么复杂的内容
开始:
1:首先C的代码都是头文件+main函数,这个不过多解释
2:写一个do while循环,使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续
int main() {
do
{
} while ();
return 0;
}
3:先写一个菜单,代码中尽量使用英文,最好是和想要表达的东西是一个意思
比如菜单的英文就是menu;开始就是play;结束就是over...等等
void menu() //菜单不需要返回值,只是用于看的并且做出选择
{
printf("********************\n");
printf("******—1.play—******\n");
printf("******—0.over—******\n");
printf("********************\n");
}
int main() {
do//使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续
{
menu();//进来先打印一个菜单
} while ();
return 0;
}
4:接受输入的信息
int main() {
int a = 0;//做出选择
do//使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续
{
menu();//进来先打印一个菜单
scanf("%d", &a);// 输入 1 或者 0 或 其他
} while ();
return 0;
}
5:根据信息来进行下一步操作
int main() {
int a = 0;//做出选择
do//使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续
{
menu();//进来先打印一个菜单
scanf("%d", &a);// 输入 1 0 其他
switch (a) //根据a的值匹配case语句
//因为输入的是数字,switch语句最佳
{
}
} while ();
return 0;
}
不懂 do while以及switch 语句的语法格式,去这篇文章看一下,1分钟就懂了
https://blog.csdn.net/W20223161730/article/details/126200624?spm=1001.2014.3001.5502
6:游戏的大致框架完成
int main() {
int a = 0;//做出选择
do//使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续
{
menu();//进来先打印一个菜单
scanf("%d", &a);// 输入 1 0 其他
switch (a) //根据a的值匹配case语句
//因为输入的是数字,switch语句最佳
{
case 1://玩游戏
printf("猜数字\n");
//game(); ←这个函数里面假设有一个游戏主体
case 0: //结束
printf("结束游戏\n");
break;
default ://不做过多解释,不懂就看上面链接的详解
printf("选择错误,请重新选择\n");
}
} while ();
return 0;
}
下面开始这个小游戏的主体
1:开始这个小游戏的主体
void game() {
//1.生成一个随机数
//2.猜数字
}
新知识:rand函数:
测试一下:
#include<stdlib.h>//rand函数的头文件
void game() {
//1.生成一个随机数
int ret = rand();
printf("%d\n", ret);
//2.猜数字
}
测试结果1: 测试结果2:
两次结果都一样,说明有问题
再看一下rand函数的介绍:
也就是说使用rand函数之前必须使用srand函数
新知识:srand函数
void game() {
//1.生成一个随机数
srand(100);
int ret = rand();
printf("%d\n", ret);
//2.猜数字
}
测试:
还是有问题 那就把srand的参数换成200
void game() {
//1.生成一个随机数
srand(200);
int ret = rand();
printf("%d\n", ret);
//2.猜数字
}
测试:
所以:只要srand的参数变化,那么生成的数字就会变换
那么问题来了:什么可以一直发生改变 时间可以
所以要把时间传给srand函数就可以完成这个游戏
新知识:时间戳
时间戳就是目前的时间相较于计算机起始时间(1970年1月1日0时0分0秒)的差值,且经过(单位:秒)换算的差值
如果能把时间戳传给srand函数,当作它的生成器,就可以得到一个不断改变的值
C语言提供了time函数,它可以返回一个时间戳
新知识:time函数
实现:
#include<stdlib.h>//rand和srand的头文件
#include<time.h>//time函数的头文件
void game() {
//1.生成一个随机数
srand((unsigned int)time(NULL));
//time函数返回的是time_t,所以需要强制类型转换成srand对应的参数
int ret = rand();
printf("%d\n", ret);
//2.猜数字
}
测试:
依然有问题,值确实改变了,但是改变的很慢,如果速度快点,就相当于没改变
分析:因为每次按1,它就会调用一次,每次就归零了(重新开始),所以不需要频繁的调用,只需要调用一次就可以了, 所以直接放到主函数里面
int main() {
srand((unsigned int)time(NULL));//主函数只会调用一次,放到主函数里面没问题
int a = 0;
do {
menu();
scanf("%d", &a);
switch (a) {
case 1:
game();
break;
case 0:
printf("结束游戏\n");
break;
default :
printf("选择错误,请重新选择\n");
}
} while (a);
return 0;
}
测试:
非常的随机,但是数太大
那么 在C中任何数%100余的数只可能是0到99,那么+1就是1到100
把rand%100再+1就完美解决了这个问题
void game() {
//1.生成一个随机数
int ret = rand()%100+1;
printf("%d\n", ret);
//2.猜数字
}
测试:
没有问题,继续下一步,那么随机数生成过后不可能让你看,猜数字才是最重要的
void game() {
//1.生成一个随机数
int ret = rand()%100+1;
//2.猜数字
}
开始猜数字:
void game() {
int g = 0;
//1.生成一个随机数
int ret = rand()%100+1;//任何数%100余的数只可能是0到99,那么+1就是1到100
//printf("%d\n", ret);
//2.猜数字
scanf("%d", &g);
if (g > ret) {
printf("猜大了\n");
}
else if (g < ret) {
printf("猜小了\n");
}
else {
printf("猜对了\n");
}
}
注意:不可能猜一边就成功,要猜多次
void game() {
//1.生成一个随机数
int ret = rand()%100+1;
//printf("%d\n", ret);
//2.猜数字
while (1)//一直猜
{
printf("猜数字\n");
int g = 0;
scanf("%d", &g);
if (g > ret) {
printf("猜大了\n");
}
else if (g < ret) {
printf("猜小了\n");
}
else {
printf("猜对了\n");
break; //猜对了跳出
}
}
}
整体+代码注释版本
#include<stdio.h>
#include<stdlib.h>//rand和srand的头文件
#include<time.h>//time函数的头文件
void menu() //菜单不需要返回值,只是用于看的并且做出选择
{
printf("********************\n");
printf("******—1.play—******\n");
printf("******—0.over—******\n");
printf("********************\n");
}
void game() {
//1.生成一个随机数
int ret = rand()%100+1;//任何数%100余的数只可能是0到99,那么+1就是1到100
//printf("%d\n", ret);
//2.猜数字
while (1)//一直猜
{
printf("猜数字:>\n");
int g = 0;
scanf("%d", &g);
if (g > ret) {
printf("猜大了\n");
}
else if (g < ret) {
printf("猜小了\n");
}
else {
printf("猜对了\n");
break; //猜对了跳出
}
}
}
int main() {
srand((unsigned int)time(NULL));//time函数返回的是time_t,所以需要强制类型转换
int a = 0;//做出选择
do//使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续
{
menu();//进来先打印一个菜单
printf("请选择\n");
scanf("%d", &a);// 输入 1 0 其他
switch (a) //根据a的值匹配case语句
//因为输入的是数字,switch语句最佳
{
case 1://玩游戏
game();//游戏主体
break;
case 0: //结束
printf("结束游戏\n");
break;
default ://不做过多解释,不懂就看上面链接的详解
printf("选择错误,请重新选择\n");
}
} while (a);//switch语句选择后来到这里 1为真 0为假
//所以1就是玩游戏 0就是退出
return 0;
}