#include<stdio.h>
#include<stdlib.h>
int Menu()
{
//创建一个Menu函数,打印需要的用户界面
printf("=\n");
printf(“\n");
printf(" 1.开始游戏 \n");
printf(" 0.退出游戏 \n");
printf("\n”);
printf("=\n");
//用choice来判断是否进入循环
int choice = 0;
//因为调运的数在while循环之中,所以每调运一次,执行一次
printf(“请输入您的选择:”);
scanf_s("%d", &choice);
return choice;
}
//创建一个Game函数
//Gmae函数是一个没有返回值的函数,所以写为void Game
void Game()
{
//要产生一个随机数,因为要降低才数的难度,所以此处生成的为一个1-1000以内的随机数
//要让系统产生一个随机数,就需要调用rand函数,它在stdlib.h头文件之中
//我们可以在cplusplus网站中进行查找其功能
//可以看到其运算规则如下,注意 当头文件写为cstdlib时是c++的书写分格,当头文件写为stdlib.h时是c语言的书写风格
v1 = rand() % 100; // v1 in the range 0 to 99
v2 = rand() % 100 + 1; // v2 in the range 1 to 100
v3 = rand() % 30 + 1985; // v3 in the range 1985-2014
//用 result 来保存产生的随机数
int result = rand() % 1000 + 1;
while (1)
{
//让用户输入一个数字,来进行判断
int cai;
printf("请输入您猜的数字:\n");
scanf_s("%d", &cai);
if (cai < result)
{
printf("您输入的数字低了,请继续猜\n");
}
else if (cai > result)
{
printf("您猜的数字高了.请继续猜\n");
}
else
{
printf("猜对了,真棒!!!\n");
break;
}
//当用户输入的数与产生的随机数不符时,提示高了还是低了
//让用户继续猜数,直到用户猜对时跳出循环
}
}
int main()
{
//创建一个循环,在这个循环中进行操作
//当循环退出的条件不确定时,先写一个死循环
while (1)
{
//打印一个用户界面,让用户选择是否进入游戏
//创建一个Menu函数,调用Menu函数,根据是否满足Menu函数中的条件来进行判断
//如果用户选择进入游戏,则进入猜数游戏的循环
//如果用户选择退出游戏,则显示"谢谢您的参与!!"
//如果用户输入有误,则提示"输入有误"
int choice = Menu();
if (choice == 1)
{
printf(“请输入您猜的数:\n”);
//调用Game函数,借助Game函数中猜数的功能,来进行猜数
//因为Game函数没有返回值,所以调用时不能以int sum=Game();的形式来进行调用,应该直接以Game();的形式进行调用
Game();
}
else if (choice == 0)
{
printf("谢谢您的参与!!!\n");
break;
}
else
{
printf("输入有误,请重新输入!!\n");
}
}
system("pause");
return 0;
}
但是我们运行程序之后发现,每次猜数的内容都为42,即每次电脑产生的随机数都为42 ,所以该程序有一部分内容是需要进行改变的.
程序的运行结果如下图所示
原因:因为rand()函数如果单独调用的情况下,它产生的数为一个伪随机数,即当rand()函数在第一次调用的过程中产生的随机数,在后面的程序中,这个随机数的值不会发生变化,就以第一次rand()函数产生的随机数为准
所以要想每次更新rand()的值就需要给rand()加一个种子,再每次调用ran()函数的时候更新这个种子,这种情况要用到srand函数
制定种子的方法也有两种,第一种就是手动进行制定
unsigned in seed;
scanf("%d",seed);
srand(seed);
把这部分内容加在rand()函数的前面就可以达到,手动制定种子的效果
方法2自动制定种子的效果
第二种是通过调用时间函数来达到自动制定种子的目的
在rand()函数前面加上
srand(unsigned(time(null));
记住在使用这种自动产生种子的情况下,需要在前面加上include(time.h);
程序的运行结果如下