猜数字游戏 猜1-100间的数字。
做这个游戏需要生成随机数,
rand函数是生成随机数的函数。rand函数在vs上会生成0 - 32767间的数字。
rand 函数原型: int rand (void);
但是rand函数生成的随机数并不是真正的随机数,是伪随机数。打印出来时,和上次生成的结果是一样的。
之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1。
如果要⽣成不同的随机数,就要让种⼦是变化的。
让种子变化的方法:C语⾔中⼜提供了⼀个函数叫 srand,⽤来初始化随机数的⽣成器的,也就是改变种子。
srand的原型:void srand (unsigned int seed);
种子是数据类型需要是unsigned int 如果不是,编译器会报警告。
(unsigned int是无符号整型,如果是int,值可以为负,而unsigned int就只有正数)
只要种⼦在变化,每次⽣成的随机数也就变化起来了。
生成一个随机数,但又需要一个随机数,那该怎么做呢?
方法:在C语⾔中有⼀个函数叫 time ,可以获得这个时间,而时间是在变的,把时间当种子。
time函数原型: time_t time (time_t timer);*
该函数返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型
time函数的参数 timer 如果是⾮空的指针的话,函数会将这个返回的差值放在 timer指向的内存中去。
如果 timer 是(空)NULL指针,就直接返回这个时间的差值。也就是说直接拿srand函数接收就好了。
返回的这个时间差也被叫做:时间戳。
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值。单位是秒。
好的,下面开始。
#include
#include
#include //库函数头文件
#include //time 函数头文件
#include //rand,srand 函数头文件
void menu() // 菜单函数
{
printf("**********************");
printf("***** 1. play ****"); //1开始游戏
printf("***** 0. exit ****"); //0退出
printf("**********************");
}
int main()
{
int input = 0; //定义一个装用户从键盘输入的值
do //使用do while循环,用户得先进来 然后选择。
{
menu(); //首先得进入循环得打印一个菜单。由于不想太啰嗦 所以直接定义个菜单函数,调用就好了。
printf("请输入>");
scanf("%d", &input);
switch (input) //用if判断也行!
{
case 1:
printf("开始游戏!\n");
break;
case 0:
printf("游戏结束!\n");
break;
default:
printf("输入错误!\n");
break;
}
} while (input); //当用户输入0,为假直接退出循环了,所以直接放个input就行。
return 0;
}
(不限次数)
#include
#include //time 函数头文件
#include //rand,srand 函数头文件
void menu() // 菜单函数
{
printf("**********************\n");
printf("***** 1. play ****\n"); //1开始游戏
printf("***** 0. exit ****\n"); //0退出
printf("**********************\n");
}
void game()
{
//首先得生成随机数。
int r = 0; //定义一个变量装随机数。
r = rand() % 100 - 1; //这里每次玩游戏都调用rand函数,生成新数字。
//因为rand函数生成数是0-32767间,%100则只能取0-99,而1-100只需要%100+1就可以了。
//取随机数公式:⽣成a-b的随机数,a + rand()%(b-a+1)。
//srand函数只需要调用一次就可以!所以不用写在这里,写在主函数就可以!。
int guess = 0;
while (1) //不限制次数,一直为真就可以,猜对直接break就行
{
printf("请猜数字>:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜⼩了\n");
}
else if (guess > r)
{
printf("猜⼤了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL)); //srand(time(NULL) 这样写也可以,不想报警告就强制类型转换为unsigned int。
int input = 0; //定义一个装用户从键盘输入的值
do //使用do while循环,用户得先进来 然后选择。
{
menu(); //首先得进入循环得打印一个菜单。由于不想太啰嗦 所以直接定义个菜单函数,调用就好了。
printf("请输入>");
scanf("%d", &input);
switch (input) //用if判断也行!
{
case 1:
printf("开始游戏!\n");
game();
break;
case 0:
printf("游戏结束!\n");
break;
default:
printf("输入错误!\n");
break;
}
} while (input); //当用户输入0,为假直接退出循环了,所以直接放个input就行。
return 0;
}
只需要把上面的viod game修改一些就好了。
void game()
{
int r = 0;
r = rand() % 100 - 1;
int guess = 0;
int count = 5; //限制5次
while (count) //次数用完为零 自动跳出循环。
{
printf("\n你还有%d次机会\n", count);
printf("请猜数字>:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
count--; //每猜一次减1。
}
if (count == 0) //如果是为0自动跳出循环 说明没猜对,给个提示。
{
printf("你失败了,正确值是:%d\n", r);
}
}