🌈write in front :
🔍个人主页 : @啊森要自信的主页
本期专栏🔥:本期将分享一些猜数字小游戏怎么一步一步实现的🌈作者寄语 🌈: 小菜鸟的力量不在于它的体型,而在于它内心的勇气和无限的潜能,只要你有决心,就没有什么事情是不可能的。
欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习。
前言
通过前面的学习,我们可以制作一个简单C语言的小游戏——猜数字小游戏
游戏要求:
1.电脑自动生成1~100的随机数
2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束
一、 随机数⽣成 rand
首先还我们先打上
#include <stdio.h>
int main()
{
return 0;
}
根据要求我们怎么让电脑生成随机数呢,这个时候我们要产生随机数,这时我们可以引用rand函数,这是C语言提供的,不认识,没关系我们了解一下:
int rand (void);
rand函数会返回一个伪随机数,这个随机数的范围是0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器实现的,但是大部分编译器是32767。rand函数的使用需要包含一个头文件:
stdib.h
那我们就测试一下rand函数,这里多调用几次,产生5个随机数:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
第一次运行:
第二次运行:
这里我们重复运行一次进行对比就可以看出来,两次打印的随机数一模一样,这问题大了,我们要的是每次生成不一样的数字,为什么会这样子呢❓
如果再深入了解一下,用就不难发现,rand函数生成的随机数是伪随机数 ,而这个伪随机数不是真的随机数,是通过某种算法生成的随机数,真正的随机数是无法预测下一个数是多少的,而rand随机数是对一个叫种子的基准值进行运算生成的随机数。之所以每次运行的随机数都是相同的,是因为rand函数生成随机数的默认种子是1。哎,读到这里,岂不是让每一次种子发生改变,那么每一次随机数就不会一模一样的?没错,的确如此!
二、srand
因此C语言又提供了一个函数srand
,用来初始化随机数的生成器,srand模型如下:
void srand(unsigned int seed);
程序中在调⽤rand函数之前先调⽤srand函数,通过srand函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。
那也就是说给srand的种⼦是如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随机数,这就⽭盾了
三、 time
在程序中,我们通常使用程序运行的时间作为种子,因为时间是不断变化的。在C语言中,有一个函数叫做time,可以获取当前时间。time函数的原型如下:
1 time_t time (time_t* timer);
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型。
time
函数的参数timer
如果是⾮NULL
的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果timer
是NULL
,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
time
函数的时候需要包含头⽂件:time.h
如果只是让time函数返回时间戳,我们就可以这样写:
1 time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值
话不多说,让我们上代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
//使⽤time函数的返回值设置种⼦
//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换
srand((unsigned int)time(NULL));
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
第一次运行:
第二次运行:
(注:截图只是当时程序运⾏的结果,你的运⾏结果不⼀定和这个⼀样,,(因为返回的时间不一样))
四 、设置随机数的范围
srand函数是不需要频繁调⽤的,⼀次运⾏的程序中调⽤⼀次就够了。
如果我们要⽣成0~99之间的随机数,⽅法如下:
1 rand() %100;//余数的范围是0~99
如果要⽣成1~100之间的随机数,⽅法如下:
rand()%100+1;//%100的余数是0~99,而0 ~ 99的数字+1,范围是1~100
如果要⽣成100~200的随机数,⽅法如下:
100 + rand()%(200-100+1)
//余数的范围是0~100,加100后就是100~200 所以如果要⽣成a~b的随机数,⽅法如下:
所以如果要⽣成a~b的随机数,⽅法如下:
a + rand()%(b-a+1)
五、猜数字游戏实现
5.1打印菜单
首先菜单一点是要打印的,因此我们可以使用do while循环先打印一次再判断:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
do{
printf("**** 猜数字小游戏 ****\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("***********************\n");
}while(0);
return 0;
}
当然我们也可以用函数对打印菜单进行封装:
void menu()
{
printf("**** 猜数字小游戏 ****\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("***********************\n");
}
int main()
{
do
{
menu();
} while (0);
return 0;
}
5.2选择
打印菜单后,我们接下来就是游戏玩,还是不玩,
void menu()
{
printf("**** 猜数字小游戏 ****\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("***********************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请输入-->\n");
scanf("%d", &input);//输入1 或 0
switch (input)//对输入的值进行选择,因此用了switch语句
{
case 1:
printf("猜数字小游戏启动!\n");
break;
case 0:
printf("退出游戏!!!\n");
break;
default :
printf("输入错误,请重新选择!!\n");
}
} while (input);//这里我们可以把 0 改为input,因为0只能循环一次,
//input可以选择 1或者0来进行游戏的选择
return 0;
}
5.3 生成
打印菜单,选择游戏进行和结束,这些过程我们要来实现函数的核心部分:猜数字。但是猜数字我们的有数字生成呀!所以我们可以通过前面的
rand ,srand 和 time
函数来生成0—100
的数:
void menu()
{
printf("**** 猜数字小游戏 ****\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("***********************\n");
}
void game()
{
int r = rand() % 100 + 1;//通过调用srand函数生成0—100的数;
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //使用time函数的返回值设置种子
//因为srand的参数是unsigned int类型,我们将time的返回值强制类性转换
//srand函数的头文件的 time.h
do
{
menu();
printf("请输入-->\n");
scanf("%d", &input);//输入1 或 0
switch (input)//对输入的值进行选择,因此用了switch语句
{
case 1:
printf("猜数字小游戏启动!\n");
game();
break;
case 0:
printf("退出游戏!!!\n");
break;
default :
printf("输入错误,请重新选择!!\n");
}
} while (input);//这里我们可以把 0 改为input,因为0只能循环一次,input可以选择 1或者0来进行游戏的选择
return 0;
}
5.4 循环比较
最后用
while
循环输入的数与生成的数进行比较
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("**** 猜数字小游戏 ****\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("***********************\n");
}
void game()
{
int r = rand() % 100 + 1;//通过调用srand函数生成0—100的数;
int guess = 0;
while (1) //用while循环输入的数与生成的数进行比较
{
printf("请猜数字—>");
scanf("%d", &guess);
if (guess > r)
{
printf("猜大了\n");
}
else if (guess < r)
{
printf("猜小了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //使用time函数的返回值设置种子
//因为srand的参数是unsigned int类型,我们将time的返回值强制类性转换
//srand函数的头文件的 time.h
do
{
menu();
printf("请输入-->\n");
scanf("%d", &input);//输入1 或 0
switch (input)//对输入的值进行选择,因此用了switch语句
{
case 1:
printf("猜数字小游戏启动!\n");
game();
break;
case 0:
printf("退出游戏!!!\n");
break;
default :
printf("输入错误,请重新选择!!\n");
break;
}
} while (input);//这里我们可以把 0 改为input,因为0只能循环一次,input可以选择 1或者0来进行游戏的选择
return 0;
}
六 、优化:控制次数
由于博主一直都猜不中,可以给个小小的赞鼓励一下嘛;当然我们也可以设定次数来猜:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("**** 猜数字小游戏 ****\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("***********************\n");
}
void game()
{
int r = rand() % 100 + 1;//通过调用srand函数生成0—100的数;
int guess = 0;
int count = 5;
while (count) //用while循环输入的数与生成的数进行比较
{
printf("你还有%d次机会", count);
printf("请猜数字—>");
scanf("%d", &guess);
if (guess > r)
{
printf("猜大了\n");
}
else if (guess < r)
{
printf("猜小了\n");
}
else
{
printf("猜对了\n");
break;
}
count--;
}
if (0 == count)
{
printf("你失败了,正确值是%d\n", r);
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //使用time函数的返回值设置种子
//因为srand的参数是unsigned int类型,我们将time的返回值强制类性转换
//srand函数的头文件的 time.h
do
{
menu();
printf("请输入-->\n");
scanf("%d", &input);//输入1 或 0
switch (input)//对输入的值进行选择,因此用了switch语句
{
case 1:
printf("猜数字小游戏启动!\n");
game();
break;
case 0:
printf("退出游戏!!!\n");
break;
default :
printf("输入错误,请重新选择!!\n");
break;
}
} while (input);//这里我们可以把 0 改为input,因为0只能循环一次,input可以选择 1或者0来进行游戏的选择
return 0;
}
好啦!猜游戏到这里就完了,注:永远不要害怕每一次失败,要勇于尝试,看过千遍万遍,不过于自己动手做几遍!
感谢您的观看,如果喜欢的话,请点个赞。