目录
3、使用rand()和srand()产生指定范围内的随机整数的方法“模除+加法”的方法
猜数字游戏的实现要求
1.有一个游戏菜单,可供使用者选择是否要玩游戏;
2.可供使用者重复游玩;
3.程序每次产生的数字随机;
4.所生成的随机数在1-100;
5.在每一个使用者输入数字后可以做出判断并给出相应的提示;
设计步骤
一、设计游戏菜单
游戏菜单应有游戏名称;游戏选项;游戏注意事项等。设计代码如下
void mean()//创建函数,输出游戏菜单
{
system("cls");
printf("***********猜数字游戏**********\n");
printf("*******************************\n");
printf("******1.玩游戏 0.退出游戏******\n");
printf("*******************************\n");
printf("注意:所猜数字应位于1-100!!!\n");
}
system("cls"); 是为了实现在每一次游戏结束后实现清屏操作;需要引入头文件#include<stdlib.h>或#include<windows.h>
二、随机数的产生
1、rand()
此数字游戏实现的最大难点之一就在产生1-100的随机数,这里我们引入一个rand()函数,在使用函数rand()需要引入头文件#include<stdlib.h>
rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。在调用rand()函数之前,可以使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。随机种子相同,每次产生的随机数也会相同
rand()函数原型:int rand(void);
使用rand()函数产生1-100以内的随机整数:int number1 = rand() % 100+1;
RAND_MAX;//搭配rand()使用,可产生0-32767的随机数;
//由于rand()每次产生的随机数是固定的所以还需要搭配srand()使用,
rand();
int b = rand() % 100 + 1;//模100+1为了产生1-100的数
2、scrand()
由于rand()产生的是伪随机数,所以还需要引入srand()函数,srand()的头文件依旧是nclude<stdlib.h> srand()函数原型为 void scrand (usigned int seed);
srand()用来设置rand()产生随机数时的随机数种子。参数seed是整数,通常可以利用time(0)或getpid(0)的返回值作为seed。
使用time时要引用头文件#include<time.h>
srand((unsigned int)time(NULL));//unsigned int为srand()函数原型,这儿为强制类型转换;
//time为一个时间戳,目的是为使srand()返回rand()内为一个随机值
//srand()只需要使用一次就好,如果放入循环中,则每循环一次都会调用一次,循环过快的话,会产生相同的返回值
3、使用rand()和srand()产生指定范围内的随机整数的方法“模除+加法”的方法
因为,对于任意数,0<=rand()%(n-m+1)<=n-m
因此,0+m<=rand()%(n-m+1)+m<=n-m+m
因此,如要产生[m,n]范围内的随机数num,可用:
num=rand()%(n-m+1)+mint;
其中的rand()%(n-m+1)+m算是一个公式,记录一下方便以后查阅。
比如产生10~30的随机整数:
srand(time(0));
int a = rand() % (21)+10;
三、游戏部分的实现
随机数部分已经实现,则接下来需要解决怎样判断用户输入数是否为那个数,并给出相应回应。
实现代码如下
void game()
{
int c = 1;
int put = 0;
RAND_MAX;//搭配rand()使用,可产生0-32767的随机数;
//由于rand()每次产生的随机数是固定的所以还需要搭配srand()使用,
rand();
int b = rand() % 100 + 1;//模100+1为了产生1-100的数
do {
printf("请输入你猜的数字:>");
scanf("%d", &put);
if (put > b)
{
printf("猜大了\n");
}
if (put < b)
{
printf("猜小了\n");
}
if (put == b)
{
printf("恭喜你,猜对了!!!\n");
c = 0;//为了结束循环
}
}
while (c);
getchar();//为了吃掉所输入最后一个数字后面回车;
getchar();//吃掉一个回车,防止清屏操作太快;
}
四、main()函数
该游戏所需要的函数都已实现,则接下来则需要把我们所需要的函数组合起来;
实现代码如下:
int main()
{
int a = 0;
srand((unsigned int)time(NULL));//unsigned int为srand()函数原型,这儿为强制类型转换;
//time为一个时间戳,目的是为使srand()返回rand()内为一个随机值
//srand()只需要使用一次就好,如果放入循环中,则每循环一次都会调用一次,循环过快的话,会产生相同的返回值;
do {
mean();
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 0:
break;
default: printf("输入错误,请重新输入\n");
}
} while (a);//若a=0,则结束循环,退出游戏;
return 0;
}
至此为止,猜数字游戏已经简单实现了。后附完整代码
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void mean()//创建函数,输出游戏菜单
{
system("cls");
printf("***********猜数字游戏**********\n");
printf("*******************************\n");
printf("******1.玩游戏 0.退出游戏******\n");
printf("*******************************\n");
printf("注意:所猜数字应位于1-100!!!\n");
}
void game()
{
int c = 1;
int put = 0;
RAND_MAX;//搭配rand()使用,可产生0-32767的随机数;
//由于rand()每次产生的随机数是固定的所以还需要搭配srand()使用,
rand();
int b = rand() % 100 + 1;//模100+1为了产生1-100的数
do {
printf("请输入你猜的数字:>");
scanf("%d", &put);
if (put > b)
{
printf("猜大了\n");
}
if (put < b)
{
printf("猜小了\n");
}
if (put == b)
{
printf("恭喜你,猜对了!!!\n");
c = 0;//为了结束循环
}
}
while (c);
getchar();//为了吃掉所输入最后一个数字后面回车;
getchar();//吃掉一个回车,防止清屏操作太快;
}
int main()
{
int a = 0;
srand((unsigned int)time(NULL));//unsigned int为srand()函数原型,这儿为强制类型转换;
//time为一个时间戳,目的是为使srand()返回rand()内为一个随机值
//srand()只需要使用一次就好,如果放入循环中,则每循环一次都会调用一次,循环过快的话,会产生相同的返回值;
do {
mean();
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 0:
break;
default: printf("输入错误,请重新输入\n");
}
} while (a);//若a=0,则结束循环,退出游戏;
return 0;
}