返回

猜数字游戏(详细)

发布时间:2023-01-31 08:10:49 224
# 容器# 数据# 工具

整体代码如下:

#include 
#include
#include
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 
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 );

猜数字游戏(详细)_小游戏_02

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

猜数字游戏(详细)_猜数字_03

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

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

注:使用时需引用库函数

猜数字游戏(详细)_随机数_04

猜数字游戏(详细)_小游戏_05

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的差值  即(......)秒。

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

猜数字游戏(详细)_#include_06

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

猜数字游戏(详细)_小游戏_07

注:使用时需引用库函数

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

猜数字游戏(详细)_#include_08

此时将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 
#include
#include
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 
#include
#include
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);

则:

猜数字游戏(详细)_#include_09

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;
}
}

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

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
daily study 15 2023-01-31 07:48:09