利用C语言写出简单的猜数字小游戏
Posted 夏.冬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用C语言写出简单的猜数字小游戏相关的知识,希望对你有一定的参考价值。
何为猜数字游戏?
电脑给出一个1-100之间的随机数,由玩家去猜,如果玩家猜小了,则提示猜小了,如果猜大了,则提示猜大了,如果猜对了,则显示你真棒,猜对了~
实现猜数字游戏需要哪些C语言知识点?
实现该程序只需要简短的几十行代码即可,涉及的知识点有菜单,简单的循环语句、选择语句,以及简单的库函数引用、自定义函数的调用。
具体的代码实现
首先,我使用的是vs2017编译器,编译器具体的使用方法这里就不提及了。
首先写出主函数
注:这里的#define _CRT_SECURE_NO_WARNINGS是为了防止vs编译器报错scanf函数不安全
我们平时打开游戏都会先弹出一个界面让我们选择是否开始游戏,因此我们写该游戏时也需要写一个菜单。
我们平常玩游戏肯定不是玩完一局接着就退出游戏了,因此这里我们需要用到循环语句,这样玩完一局以后就可以选择是否继续游戏。
while、for循环都需要先判断才会进入循环,而菜单的显示是不需要判断的,因此选择do while循环。
其中的menu即为菜单。
图示即为该游戏菜单的写法,菜单无需返回值,因此定义为void;该菜单的意思是输入1开始游戏,输入0退出游戏。
写完菜单后,在主函数中继续完善。
定义一个input用于接收我们要选择的数字,游戏用户除了会选择1和0,还有可能误选择其他数字,因此用swtich语句进行处理,先把swtich语句的基本结构写出。
将基本结构写出后,再对switch语句和do while语句进行完善(不要忘了把do while循环的条件写上)。
选择数字1即开始游戏,这里先打印"猜数字"进行代替,后面再编写具体游戏内容。
如果用户选择了1和0之外的数字,则提示"选择错误",do while的循环条件写为input,如果用户输入的是0,则退出游戏,而0为假,循环也可以结束;如果输入的是非0的数字,则为真,循环继续,用户也可以选择是否继续游戏。
将上述代码都完成后,开始编写游戏的内容。
编写一个自定义函数game(),在game函数内部进行游戏代码的编写,以实现游戏。
游戏分为两部分:1. 生成随机数 2. 猜数字
生成随机数要引用库函数rand() - 生成一个随机数 - 需引入头文件stdlib.h
这时我们打印ret的值,运行查看一下随机数的生成结果,发现好像确实生成了几个随机数。
这时我们关闭运行窗口,再运行一次查看结果。
我们发现与第一次的结果完全相同,这时我们会发现该随机数的生成出现了问题,此时可以查一下文档看看rand的具体功能。
此处我选择的是MSDN。
我们发现该函数的功能确实是生成一个0-RAND_MAX范围的随机数(其中RAND_MAX的值为0x7fff(引入头文件后输入RAND_MAX,将鼠标移到RAND_MAX上,即可显示其数值),转化为十进制即为32767),这时候不要着急,我们继续往后读文档。
这句话的意思是在引起rand函数之前需要用一个srand函数,即srand是一个设置随机数的生成器,要将srand与rand配合使用。
先将srand函数中的值写为1,我们运行查看结果。
将srand中的内容改为其他值,我们再运行一下。
可以发现,每次随机数都改成了固定的一个值,改变srand中的值就可以改变随机数的值,这时可以推得,只要srand函数中的值一直在改变,那么就可以生成随机数了。
srand中的值需要随机数,我们又需要用srand来生成随机值,这好像是自相矛盾的,其实不然,只要srand中是一个一直在改变的量就可以了,那么计算机中什么是一直在变的呢——时间。
这时要引入时间戳的概念。
时间戳
当前计算机的时间-计算机的起始时间(1970.1.1.0:0:0)=(xxxx)秒,xxxx即为时间戳。
我们可以拿时间戳来设置随机数的生成起始点。
时间戳的使用则要用库函数time - 需引入头文件time.h。
查看time的文档后,发现time的参数为指针time_t*,如果不想用这个参数,我们传一个空指针NULL,即写为time(NULL)。同时我们发现time的返回类型为time_t,time_t其实是一个整型类型(此处不过多介绍),而srand函数的参数的返回类型为unsigned int。
这时候我们就可以明白,只要把time函数强制转化为unsigned int类型,那么就可以把time函数作为srand函数的参数了。
运行后发现随机数生成的并不完全随机,如果输入值时按的过快甚至会出现两个随机数相同的情况,这是因为我们把srand函数用错了,srand只需生成一次即可,如果放入我们自定义的game函数内就会多次生成,因此要把srand放到主函数内。
这时随机数的生成就完全随机了,但生成的数过大,非常难以猜到数字,我们已知rand生成随机数的范围为0-32767,那么rand()%100生成的随机数即为0-99,rand()%100+1生成的随机数即为1-100,这就符合我们的游戏规则了。
这时游戏的第一步就完成了,接下来我们就可以进行第二步了。
这时我们发现,玩家基本不可能一次就猜对,因此第二步我们需要设置循环,让玩家猜多次,直到猜中为止。
玩家猜错,则继续循环,猜对了则跳出循环,询问是否继续游戏。
这时我们就可以愉快的进行猜数字游戏了~
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("************************************\\n");
printf("***** 1. play 0. exit *****\\n");
printf("************************************\\n");
}
//游戏的实现
void game()
{
int guess = 0;//用于接收猜的数字
//1. 生成随机数
int ret = rand() % 100 + 1;
//2. 猜数字
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\\n");
}
else if (guess > ret)
{
printf("猜大了\\n");
}
else
{
printf("你真棒,猜对了\\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//设置随机数的生成器
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch(input)
{
case 1:
//printf("猜数字\\n");
game();
break;
case 0:
printf("退出游戏\\n");
break;
default:
printf("选择错误\\n");
break;
}
} while (input);
return 0;
}
以上是关于利用C语言写出简单的猜数字小游戏的主要内容,如果未能解决你的问题,请参考以下文章