猜数字游戏(详细)

时间:2023-01-18 20:57:58

整体代码如下:

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("**************************\n");
printf("**** 1.play 0.exit ****\n");
printf("**************************\n");
}
void game()
{
int ret=0;
int guess=0;
ret=rand()%100+1;//特例表示的1-100的数字
//ret=rand();就是表示1-32767的数字
while(1)
{
printf("请猜数字:");
scanf("%d",&guess);
if(guess>ret)
{
printf("猜大了\n");
}
else if(guess<ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你 猜到了!\n");
break;
}
}
}
int main()
{
int input=0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while(input);
return 0;
}

框架构建

函数构建:为了使代码清晰 避免在main的主函数进行操作的部分复杂代码,可以收纳主菜单的界面和游戏程序进行的系统
do while的使用:游戏的进行肯定是一个循环且至少进行一次,这里则优先考虑。循环体内包含游戏的菜单及选择的模式
switch的使用:游戏分为“玩 不玩 其他”三种进入模式;对于“玩”就是游戏程序进行的本身、“不玩”则是退出、”其他“则表示为输出错误

产生选择菜单:

void menu()
{
printf("**************************\n");
printf("**** 1.play 0.exit ****\n");//1表示开始玩游戏 0表示退出游戏
printf("**************************\n");
}

对菜单进行人机沟通:

int input;
printf("请选择:");
scanf("%d",&input);

做出选择的部分:

switch(input)
{
case 1:
//等待输入游戏程序部分
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}

完成第一步的框架内容

#include <stdio.h>
void menu()
{
printf("**************************\n");
printf("**** 1.play 0.exit ****\n");
printf("**************************\n");
}
int main()
{
int input;
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
//等待输入游戏程序部分
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while(input);
return 0;
}

注:while(input)可以达到一箭双雕的作用 即:input的值直接决定了下一次循环会不会开始,如果是0就不开始 恰好对应上结束游戏,如果是非0就开始 也恰好对应了其余两种情况

猜数字游戏(详细)

优化case1的游戏程序部分

产生游戏函数

产生游戏函数
case 1:
game();//游戏程序
break;

并对外进行声明,产生随机数将要装载进去的一个容器ret

void game()
{
int ret=0;
}

产生随机数

调用随机数生成数字的函数rand和srand(+msdn工具的使用)

rand:数据类型int rand( void );

猜数字游戏(详细)

srand:数据类型void srand( unsigned int seed );

猜数字游戏(详细)

rand:Generates a pseudorandom(伪随机) number.生成一个随机数字 但这个生成的数字本身就是有顺序的 只是大小不一样。所以在调用rand之前要先使用srand随机数的一个生成器也就是srand。Sets a random starting point设置一个随机起点  

也就是说,这个函数会 生成“伪随机整数” (也就是只随机一次,之后的数字都确定了),这一点很重要,并且最大值是RAND_MAX,简单的说,就是一个可以被使用者定义的最大值, RAND_MAX 的值应至少为32767,也就是说 只会产生1-32767之间的数

注:使用时需引用库函数<stdlib.h>

猜数字游戏(详细)

猜数字游戏(详细)

srand((unsigned int)time(NULL));
ret=rand();

为使游戏方便合理且简短一点 这里我使猜的范围在1-100做个例子即

ret=rand()%100+1;

调用函数time

srand的数据类型是void srand( unsigned int seed );

我们需要在类型里面存在随机数 可以需要随时在变化的东西如时间time。此时我们需要的时间戳的需求就产生了  

时间戳

当前计算机的时间减去计算机的起始时间1970.1.1.0.0.0的差值  即(......)秒。

拿时间戳来设置随机数的生成起点

猜数字游戏(详细)

time:数据类型time_t time( time_t *timer );

猜数字游戏(详细)

注:使用时需引用库函数<time.h>

记:time_t本质上就是一个长整型量  

猜数字游戏(详细)

此时将time和srand结合起来得到:

srand((unsigned int)time(NULL));

1.NULL是空指针 不产生其他效果

2.对time进行强制性转换为(unsigned int)类型符合srand的数据类型void srand( unsigned int seed );

游戏内部比较大小

产生需要用户输入的数字

达到来与计算机中随机生成的数字比较的目的

int guess=0;
与随机数进行比较
while(1)//真
{
printf("请猜数字:");
scanf("%d",&guess);
if(guess>ret)
{
printf("猜大了\n");
}
else if(guess<ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你 猜到了!\n");
break;
}

此时代码为:

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("**************************\n");
printf("**** 1.play 0.exit ****\n");
printf("**************************\n");
}
void game()
{
int ret=0;
int guess=0;
srand((unsigned int)time(NULL));
ret=rand()%100+1;
while(1)
{
printf("请猜数字:");
scanf("%d",&guess);
if(guess>ret)
{
printf("猜大了\n");
}
else if(guess<ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你 猜到了!\n");
break;
}
}
}
int main()
{
int input=0;
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while(input);
return 0;
}

最终的优化代码

srand((unsigned int)time(NULL));放到第37行int input=0;的后面 因为这样时间差就一直在变而且可以使这一串代码 (srand((unsigned int)time(NULL)))只在主函数运行一次达到每次都存在的作用,也就是说不用重复的在game()的空间里不停的运行它 节省了空间和时间 反正只运行一次也能达到目的

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("**************************\n");
printf("**** 1.play 0.exit ****\n");
printf("**************************\n");
}
void game()
{
int ret=0;
int guess=0;
ret=rand()%100+1;
while(1)
{
printf("请猜数字:");
scanf("%d",&guess);
if(guess>ret)
{
printf("猜大了\n");
}
else if(guess<ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你 猜到了!\n");
break;
}
}
}
int main()
{
int input=0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while(input);
return 0;
}

易错点

1.srand:数据类型void srand( unsigned int seed );

不能直接将参数部分固定成某一个具体的数字 否则不能产生随机数,而是固定数如:

srand(1);

则:

猜数字游戏(详细)

2.不能将

ret = rand0%100+1:

放入以下的代码里面

while(1)//真
{
printf("请猜数字:");
scanf("%d",&guess);
if(guess>ret)
{
printf("猜大了\n");
}
else if(guess<ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你 猜到了!\n");
break;
}
}

否则生成的那个随机数每次都不会固定下来 导致永远都猜不到