首页 > 其他分享 >猜数字游戏(详细)

猜数字游戏(详细)

时间:2023-01-18 19:31:12浏览次数:32  
标签:guess 游戏 int srand break 详细 printf input 数字

整体代码如下:

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

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

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

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

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

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

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

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

猜数字游戏(详细)_#include_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的差值  即(......)秒。

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

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

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

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

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

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

猜数字游戏(详细)_随机数_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 <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);

则:

猜数字游戏(详细)_数据类型_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;
}
}

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

标签:guess,游戏,int,srand,break,详细,printf,input,数字
From: https://blog.51cto.com/u_15899086/6019437

相关文章

  • AcWing. 323. 战略游戏
    题意简述\(\qquad\)给定一棵树,要求树中任意一边至少选中一点,求最少满足题意的选点数解题思路\(\qquad\)我们可以先画出示意图来橙色点表示选,灰色点表示不选。\(\qqu......
  • 猜数游戏
    代码示例:importrandom classGame:#进入首次游戏的时候的菜单提示defindex_tip(self):print("***********欢迎来到猜数游戏*********") defindex_pa......
  • 图扑智慧充电桩可视化运营平台|新能源数字化
    前言电动汽车产业在新能源背景下蓄势勃发,已经成为当下广泛流行、节能环保的绿色出行交通工具。随着特斯拉、宝马、蔚来等众多新能源汽车企业的纷纷布局,市场主体多元化对充......
  • django model 创建表参数字段
    首先,关于model,是数据库与python代码里的一个映射关系,每一个model是django.db.models.Model的一个子类。model里每一个属性值(即字段)代表数据库的字段,通过定义mode......
  • 峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?
    文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面......
  • dfs:2的幂次方表示数字
    #include<iostream>#include<vector>#include<bitset>#include<string>#include<algorithm>usingnamespacestd;vector<string>res;voiddfs(intx){bits......
  • 三子棋小游戏
    今天实现一个三子棋小游戏,虽然小,但是“麻雀虽小,五脏俱全”,通过三子棋游戏,我们来学习如何模块化地写代码。首先,我们创建一个game.h头文件,再创建一个game.c和test.c源文件。//......
  • 使用Hook拦截sendto函数解决虚拟局域网部分游戏联机找不到房间的问题——以文明6为例
    正文本文代码及编译好的二进制文件可以在下面这个仓库找到。https://gitcode.net/PeaZomboss/miscellaneous源代码在文件夹230113-civ6hooksendto若要下载二进制,请到ht......
  • 博客园美化「详细教程+代码配置」
    引言退役好久了,偶然登上久置不用的博客园,看到了一条使我有些愕然和窃喜的私信:看来还是有志趣相投的道友的(doge想到自己当时几次三番不务正业地倒腾博客园的背景,几乎把......
  • AcWing1075. 数字转换
    题目描述如果一个数\(x\)的约数之和\(y\)(不包括他本身)比他本身小,那么\(x\)可以变成\(y\),\(y\)也可以变成\(x\)例如,\(4\)可以变为\(3\),\(1\)可以变为\(7\)。......