自我介绍:一个脑子不好的大一学生,c语言接触还没到半年,若涉及到效率等问题,各位都可以在评论区提出见解,谢谢啦
注:该文章会对我的下一篇文章:扫雷游戏打下一定基础;
该文章所写代码猜数字的范围为1~100,若需要更改范围,可以对相关数据进行修改
首先:
1.所有游戏需要菜单,因此先得做一个菜单,我单独将它作为了一个函数:caidan,以增加它的通用性。
2.玩家在玩游戏时需要几种选择:(1)继续玩(2)退出;而这一部分需要用do...while...语句来实现。
3.猜数字需要产生随机数:该处需要用到下面几种函数rand,srand,time,下面我会给详细介绍。
void caidan()
{
printf("***********************\n");
printf("***请选择一个数字:****\n");
printf("*** 1.play ******\n");
printf("*** 0.exit ******\n");
printf("***********************\n");
}
int main()
{
int input;
//srand((unsigned int)time(NULL));
do
{
caidan();
scanf("%d", &input);
switch (input)
{
case 1:
//game();//虽然有break,但是不用大括号,因为这是switch语句
printf("继续游戏\n");
break;
case 0:
printf("退出游戏\n");
break;
default:/**/
printf("选择错误,请重新选择\n");
break;
}
} while (input);
//因为玩家如果退出游戏,就会选择0,所有while的条件直接选成input(玩家的选择)就好
return 0;
}
C语言提供了一个函数叫rand,这函数是可以生成随机数的,函数原型如下所示:
int rand (void);
rand函数会返回一个伪随机数,这个随机数的范围是在0~RAND_ _MAX之间,这个RAND_ MAX的大小( 可以通过在编译器上输入并“转到定义”看见 )是依赖编译器上实现的,但是大部分编译器上是32767.
从上图可知:
(1)rand函数的作用是:生成随机数(Generates a pseudorandom number)
(2)rand函数的头文件是:<stdlib.h>
(3)rand函数的参数是:void,所以调用rand时括号内不要写任何数
当函数中放了rand函数,产生了如下数据:
看似随机,但是当你多操作几次时,会发现每次的数据相同,以下是第二次运行:
这是因为rand函数中有一个叫种子的东西(由srand的括号内数字决定,而rand函数默认种子为1,所以当括号内为1时,产生的数据与之前的一样
若将种子的数值改变,则会发现随机数改变:)
由此可以得出,要产生随机数,srand函数的参数应该是随时变化的,以下为srand的函数相关信息:
而时间是随时在变化的,因此可以将srand函数的参数设为时间的函数:time
time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_ t类型的(本质上是32位或者64位的整型类型)。
因为srand函数的参数是unsighted int ,而time函数为time_t类型,
所以要对time函数类型转换:srand((unsighted int)time());
time函数的参数time如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
而srand函数只需要time的返回值,所以time函数并不需要设置参数,因此传一个NULL就好:
srand((unsighted int)time(NULL));
就此,我们的游戏框架就搭建好了,具体代码如下:
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
//不要忘了头文件
void game()
{
;
}
void caidan()
{
printf("***********************\n");
printf("***请选择一个数字:****\n");
printf("*** 1.play ******\n");
printf("*** 0.exit ******\n");
printf("***********************\n");
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
caidan();
scanf("%d", &input);
switch (input)
{
case 1:
game();//不用大括号,这是switch语句
break;
case 0:
printf("退出游戏\n");
break;
default:/**/
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
下面我们就来写game函数的具体内容
1.先要设置好正确答案,但是由于该题要设置的随机数应该在1~100,所以应该将答案这样设置:
int daan=rand() % 100 + 1;所用到的公式为(若生成的数据范围为a~b):
int daan=a+rand() % (b-a+1);接下来要读入玩家所猜数字,并将其与答案进行对比,对玩家进行反馈,具体代码如下:
void game()
{
int guess;
int daan = rand() % 100 + 1;
printf("请输入你要猜的数字:\n");
while(1)
{
scanf("%d", &guess);
if (guess > daan)
printf("猜大了,请重新输入\n");
else if (guess < daan)
printf("猜小了,请重新输入\n");
else
{
printf("恭喜你,答对了,答案是:%d\n", daan);
break;
}
}
}
#include<stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <time.h>
void game()
{
int guess;
//srand((unsigned int)time(NULL));
int daan = rand() % 100 + 1;
printf("请输入你要猜的数字:\n");
while(1)
{
scanf("%d", &guess);
if (guess > daan)
printf("猜大了,请重新输入\n");
else if (guess < daan)
printf("猜小了,请重新输入\n");
else
{
printf("恭喜你,答对了,答案是:%d\n", daan);
break;
}
}
}
void caidan()
{
printf("***********************\n");
printf("***请选择一个数字:****\n");
printf("*** 1.play ******\n");
printf("*** 0.exit ******\n");
printf("***********************\n");
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
caidan();
scanf("%d", &input);
switch (input)
{
case 1:
game();//不用大括号,这是switch语句
break;
case 0:
printf("退出游戏\n");
break;
default:/**/
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
创作不易,望各位多多支持,如果各位有任何对代码或者本人注释的建议,都欢迎在评论区提出来,共同进步!