写一个猜数字游戏,要求
1. 电脑随机生成1—100的随机数
2.玩家猜数字,猜数字的过程中根据猜测数字的大小给出大了或小了的反馈,直到猜对,游戏结束
首先关于生成随机数,先介绍一个函数——int rand(void),首先它会生成一个伪随机数,这个数的范围为0~RAND_MAX(其实是32757,取决于编译器),使用时需要包含头文件<stdlib.h>。
#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());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
先运行一次,再运行一次
我确实是运行了两次,可是这两次结果都是一样的。所以才说rand函数生成的函数是伪随机数。rand函数是对一个叫“种子”的基准值进行运算生成的随机数,之所以前面的运算结果是一样的,是因为rand函数生成随机数的默认种子是1。所以我们要生成不同的随机数,就要让种子变化。
这时候就要用到void srand(unsigned int seed)函数,去初始化设置那个随机数的生成器。
电脑上的时间 时刻都在发生变化,那么可以利用时间做这个种子,只要时间在变化,种子就在变化,下一次生成的随机数就会变化。接下来还要介绍一个概念—时间戳,其实就是这个时间和计算机的起始时间之间的差值以秒为单位。 C语言中有个time函数,可以返回时间戳的值。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned int)time(NULL));//srand需要一个无符号的整型,就强制类型转换
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
可以自己运行一下,是不一样的。
接下来是控制范围。如果要生成1~100的随机数:rand()%100+1,如果要生成100~200的随机数:100+rand()%(200-100+1) ,所以如果要生成a~b的随机数:a+rand()%(b-a+1)。而当我们玩了一次这个游戏后觉得不过瘾想再来几次,就可以使用循环结构,可以选择用do-while循环先打印一个菜单,再利用switch语句根据所选内容给出相应功能。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int input;
do
{
printf("*****************\n");
printf("******1.play******\n");
printf("******0.exit******\n");
printf("*****************\n");
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字游戏\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
接下来就是猜数字的主体。首先猜数字可能要猜很多次,所以需要循环,猜的数字可能会大也可能会小 ,所以要有选择结构,可以使用if语句,最后猜出数字了,就没必要继续下去了,需要跳出循环,再根据上面讲到的生成随机数的知识,就可以写出如下代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
//1.生成随机值
int r = rand() % 100 + 1;
//2.猜数字
int gess = 0;
while (1)
{
printf(" 请猜数字:>");
scanf("%d", &gess);
if (gess > r)
printf("猜大了\n");
else if (gess < r)
printf("猜小了\n");
else
{
printf("恭喜你猜对了\n");
break;
}
}
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
printf("*****************\n");
printf("******1.play******\n");
printf("******0.exit******\n");
printf("*****************\n");
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;
}
我自己猜了几次就对了 ,还是蛮有意思的。
当然如果是无限制的猜下去直到猜对那可能没那么有意思,于是我们可以再加上次数限制:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
//1.生成随机值
int r = rand() % 100 + 1;
//2.猜数字
int gess = 0;
int count = 5;
while (count)
{
printf("剩下%d次机会", count);
printf(" 请猜数字:>");
scanf("%d", &gess);
if (gess > r)
printf("猜大了\n");
else if (gess < r)
printf("猜小了\n");
else
{
printf("恭喜你猜对了\n");
break;
}
count--;
}
if (count == 0)
printf("很遗憾,游戏失败\n");
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
printf("*****************\n");
printf("******1.play******\n");
printf("******0.exit******\n");
printf("*****************\n");
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;
}
OK本次的猜数字游戏就介绍到这里了,下来希望大家可以多敲多练,才可以掌握。
拜拜。