前言
我们这是新的专栏就是用来实现一些好玩的c语言的项目,用来巩固我们学的c语言的知识,这个专栏会一直更新下去但是时间会不稳定,等初始c语言更新完后,我们会出一个c语言入门这个专栏这个专栏会专门对每个知识点进行细化,并且会再出一个专栏用来刷题和和c语言入门的更新速度一样,也是用来巩固学习的内容,好啦废话不多说我们开始这一个专栏的第一篇内容。
一.该游戏的具体内容
我们这个游戏名字叫做猜数字游戏,内容挺简单的,大致的玩法也很简单电脑会自动的出一个随机的数字这个数字的范围是0~100,玩家每次都可以输入一个值来猜这个数字的,每次输入数字进行猜的时候电脑都会给你一个回应来提示你,比如说不好意思猜的数值偏小,或者猜的数值偏大,或者猜对了,然后玩家可以继续进行猜测,并且电脑产生的那个值不会改变知道猜对为止,并且玩家可以选着再玩一把,并且电脑的给出的值也会有所不同。
二.大致思路
我们了解了这个游戏的内容我们应该可以有个很明确的思路。
第一步:就是创建一个菜单,告诉玩家这个游戏是什么,并且给出一个菜单,询问玩家是否想玩这个游戏。
第二步:生成一个随机的数字,并且这个数字的值得在1~100之间。
第三步:完成猜数字的过程,并且电脑会根据玩家所给出的数字来做出提醒。
第四步:游戏结束询问玩家是否继续。
三.具体实现的过程
1.第一步
根据我们上面的大致思路可以得知,我们第一步是创建一个菜单。那我们一开始是不是就可以使用printf函数来告诉玩家这个游戏是什么?如何开始游戏?那我们就可以这样:
#include<stdio.h>
int main()
{
printf("***********欢迎进入猜数字游戏**********\n");
printf("***************************************\n");
printf("***********输入 1 开始游戏************\n");
printf("***********输入 0 结束游戏************\n");
printf("***************************************\n");
printf("请输入对应的值->");
return 0;
}
这就是我们的简易的菜单,目的是告诉玩家这个游戏什么,如何开始游戏,那这时我们的玩家就会输入一个值,我们的电脑会根据这个值来做出判断,,那这么看的话switch语句是一个非常好的选择,而且我们之前说了当我们这把游戏结束的时候,我们还会问玩家是否选择再玩一把,那我们这么看的话,我们这里就应该会出现一个循环的语句,我们先打印出来菜单再问玩家是否继续游戏,那这时候do while 循环应该是最适合这个场景,因为这个循环的特点就是先做再判断,假设玩家玩完了一把之后我们会打印菜单问玩家是否继续,那么这就是先做的体现。我们先定义一个名字叫input的变量,这个变量用于储存玩家输入的值,并且电脑根据这个值做出判断,那我们可以直接将这个值放入switch语句后面的括号里面,再通过switch来执行不同的功能,并且我们还将这个值放到do while的判断语句里面,因为一旦玩家不想玩了,输入的值为0那么就可以直接跳出这个循环并且打印游戏结束。具体的实现如下:
int main()
{
int input = 0;
do
{
printf("***********欢迎进入猜数字游戏**********\n");
printf("***************************************\n");
printf("***********输入 1 开始游戏************\n");
printf("***********输入 0 结束游戏************\n");
printf("***************************************\n");
printf("请输入对应的值->");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏\n");
break;
case 0:
printf("游戏结束\n");
break;
default:
break;
}
} while (input);
return 0;
}
这里我们感觉这个前面的菜单太臃肿了,那我们是不是可以创建一个菜单函数
#include<stdio.h>
void menu()
{
printf("***********欢迎进入猜数字游戏**********\n");
printf("***************************************\n");
printf("***********输入 1 开始游戏************\n");
printf("***********输入 0 结束游戏************\n");
printf("***************************************\n");
printf("请输入对应的值->");
}
int main()
{
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏\n");
break;
case 0:
printf("游戏结束\n");
break;
default:
break;
}
} while (input);
return 0;
}
2.第二步
既然我们要生成一个随机的数字,那我们就得用到一个函数叫rand()函数那这个函数是怎么用的呢?我们可以在网上搜一下
我们来看看这个函数,括号里面的类型为void也就是啥都没有,并且返回的类型为int类型,头文件为<stdlib.h>。我们可以看看下面的英文介绍
这时候我那高考刚及格的英语就派出用场了,这个的意思就是rand这个函数会返回一个随机的值,这个值的范围为0~RAND_MAX,那这个时候肯定有小伙伴们要说了,这个后面的一段串以文字母的值是多少啊!大家可以把这个输入到编译器里面,然后再把这段代码转定义就会发现这个的只为0x7fff,我们可以用计算器算一下发现这个的值为32767,那么我们这里就可以可以定义一个int类型的变量ret来接收这个随机值,这时候我们就可以打印出来看看效果
啊这时候我们就发现哎好家伙真的能够输出一些随机的数字了,那我们是不是就可以立马实行下一步了呢?啊小伙伴们先不要慌,我们关掉程序再执行以下程序,这时候我们会发现这些数字好像一模一样的,第一次跑的时候是41 18467 6334 26500,我们第二次跑的时候也是这些数字,虽然我们的数字是随机的但是这些数字在另一个方面来看好像也是固定的啊,那这怎么办呢?我们再来看看这个这个rand函数的介绍吧。
这个说使用rand这个函数之前先用srand这个函数来设置随机数,那我们再来看看srand这个函数
这上面写在srand函数的功能是设置一个随机数开始的起点,介绍下面还说了srand后面的括号里面需要一个无符号的整形,头文件为<stdlib.h>,并且这个函数的没有返回类型,那我们是不是可以再看看这个使用的效果,我们先在前面加个srand(100)看看
这个时候我们又发现一个问题,他产生了一个随机的数字,但是这个随机的数字只产生了一个,我们再试试一个srand(100)看看
啊这时候发现情况一模一样,那这怎么办呢?我想要生成一个随机的数字,结果需要一个随机的数字,那这不就相当于我身上一分钱没有,我去找别人借50w元,结果别人说借是可以借,但是前提是在我借你之前,你必须得有50w元,你这不是欺负老实人嘛!对吧那我们想想我们身边有没有随机值,这时后有人听着十年这首歌突然想到了答案,时间不是一直在变嘛,时间在我们生活中的时间一直在改变,这时候我们就要提一个概念叫时间戳我打开浏览器搜一下
便可以知道这个东西随着时间的变化,一直在变那么他是不是就相当于一个随机值呢呀,那我们c语言里面是怎么实现的呢?这时候我们再来介绍一个函数叫做time函数
我们来看看这个图片,这个函数的作用是获取系统的时间,头文件为<time.h>,他的括号里面的需要一个参数类型为time_t的指针,当然这里你如果不想传指针的话,其实你可以传个空指针进去,这个函数会返回一个time_t的值,这个time_t就是时间戳,那我们这里怎么用这个函数呢?因为他返回的值就是时间戳,那我们是不是可以将他放到strand里面去,因为strand需要的类型是unsigned的类型,而time的返回值类型为time_t那我们这里是不是可以使用强制类型转换啊对吧,那说到这里我们应该就没有啥问题我们来看看
这里我们好像又出现了问题,我们只要键盘敲的快一点的话,我们会发现出现了相同的随机值?那这是什么原因呢?我们把所有的代码放出来看看
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("***********欢迎进入猜数字游戏**********\n");
printf("***************************************\n");
printf("***********输入 1 开始游戏************\n");
printf("***********输入 0 结束游戏************\n");
printf("***************************************\n");
printf("请输入对应的值->");
}
void game()
{
srand((unsigned int)time(NULL));
int ret = rand();
printf("%d\n", ret);
}
int main()
{
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
break;
}
} while (input);
return 0;
}
我们这里创建了一个game函数放在case1里面,其实这里就有一个问题我们的srand函数的作用是设置一个随机数的起点,而我们这里的随机数出现在循环里面,那么我们在运行的时候是不是也就是在不停的设置起点了,那我们这里就有个解决的办法就是将这个srand放到循环外面这样我们就能解决问题
好看到这里我们就解决了如何生成随机数的问题,那么这里我们就剩下一个问题就是如何让这个数字的范围为1~100,那么这个问题就简单多了,我们可以让产生出来的随机数字%100,这样我们得出来扽结果是不是就一定属于0到99了,那么我们再+1是不是就变成了1到100了。这样我们就能得到1到100的随机值。
3.第三步
这一步就是实现用户猜的功能,这步其实也非常的简单,用户每次输入的数字与我们电脑产生出来的随机值的关系是不是就三种可能,第一种比随机值大,第二种比随机值小,第三种跟随机值一模一样,那我们是不是可以根据这个来给用户提供提示和判断游戏结果,如果用户没有猜对我们继续让用户继续猜测知道猜对了为止。那么这里的判断是否相等和谁大谁小是不是可以用if语句来完成,我们这里的不断的猜是不是就是一个循环,那我们这里的结束的标志是什么呢?是不是就是猜对了,但是我们这里好像没有啥变量的改变来结束循环,所以我们采用while循环,并且在判断语句里面直接放个1,这样就是一个死循环,那我们结束的标志怎么来弄呢?那我们是不是可以在猜测成功的那个if语句里面加个break来跳出循环。那么这样我们的代码也就实现了。这里我们定义了一个game函数来使得代码不显得那么臃肿。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("***********欢迎进入猜数字游戏**********\n");
printf("***************************************\n");
printf("***********输入 1 开始游戏************\n");
printf("***********输入 0 结束游戏************\n");
printf("***************************************\n");
printf("请输入对应的值-> ");
}
void game()
{
int ret = rand()%100+1;
while (1)
{
int input = 0;
printf("**************\n");
printf("请输入你所猜的值\n");
printf("**************\n");
scanf("%d", &input);
if (ret > input)
{
printf("**************\n");
printf("猜小了,请继续\n");
}
else if (ret < input)
{
printf("**************\n");
printf("猜大了,请继续\n");
}
else
{
printf("**************\n");
printf("恭喜你,猜对了\n");
printf("----------------\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
break;
}
} while (input);
return 0;
}
总结
看到这里我们这章的内容也就结束,这一章我们巩固了函数的内容和选择语句和循环语句的内容,看到这里小伙伴们可以下去多多联系,我是叶超凡我会持续更新c语言的内容,帮助更多的小伙伴们学习c语言,谢谢大家的观看这篇文章,有问题也麻烦大家多多提出,祝大家学习顺利。