猜数字游戏(详解+代码)

简介: 猜数字游戏(详解+代码)

用C语言实现猜数字游戏

问题描述

此游戏首先随机生成一个1~100的整数,再有游戏玩家输入自己猜的数字,如果猜的数字过大,则输出“你猜大了!”,若猜的数字过小,则输出“你猜小了”,若猜对了,则输出“恭喜你通关了!”。

代码实现

首先,游戏玩家进入游戏,我们可以打印一个菜单,告诉玩家输入指定的命令进入游戏,这里,我们有正整数“1”作为进入游戏的命令,数字“0”作为退出游戏的命令。

#include<stdio.h>
void menu()
{
  printf("1.开始游戏\n");
  printf("2.退出游戏\n");
}

然后我们开始构思,首先写出一个大概的游戏模型

void menu()
{
  printf("1.开始游戏\n");
  printf("2.退出游戏\n");
}
int main()
{
  menu();
  return 0;
}

这里的代码就可以实现菜单的打印了

打印菜单后,我们就可以定义一个输入的数字,用来进入游戏,与菜单的信息相呼应,这里我们可以用到do while循环

#include<stdio.h>
void menu()
{
  printf("1.开始游戏\n");
  printf("2.退出游戏\n");
}
int main()
{
  int input = 0;
  do 
  {
    menu();
    printf("请输入数字—>:");
    scanf("%d", &input);
  } while (input);
  return 0;
}

输入数字之后,我们就可以开始进入游戏,对于输入的数字input,我们可以用switch语句来分情况进行

#include<stdio.h>
void menu()
{
  printf("1.开始游戏\n");
  printf("2.退出游戏\n");
}
int main()
{
  int input = 0;
  do 
  {
    menu();
    printf("请输入数字—>:");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      printf("开始游戏");
      break;
    case 0:
      printf("退出游戏");
      break;
    default:
      printf("输入错误");
      break;
    }
  } while (input);
  return 0;
}

下面我们可以测试一下这段代码

现在,我们就可以定义一个game()函数,来实现猜数字,将game()放到switch语句的case1中,开始玩游戏

对于game函数,我们首先就要产生一个随机的数字,而产生随机数字如何产生呢,这里就可以用到我们的rand函数了。

我们可以试着用一下rand函数输出随机数

void game()
{
  int ret = rand();
  printf("%d\n", ret);
}

大家调试之后可以看到,确实是生成了随机数,但是关闭程序之后你再次调试就会发现,每次输出的随机数都是和上一次输出的一样的这是为什么呢?

rand()函数确实是用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。所以在调用rand()函数之前,就要使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。随机种子相同,每次产生的随机数也会相同。

在菜鸟中我们就可以了解到srand函数的用法

我们在这里要想有一个随机种子,怎么办呢,这里就可以用到时间戳了

什么是时间戳呢?

时间戳一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。

所以我们可以用time函数来生成随机种子

具体代码实现如下

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
  printf("1.开始游戏\n");
  printf("2.退出游戏\n");
}
void game()
{
  int ret = rand();
  printf("%d\n", ret);
}
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;
}

这里我们需要注意的就是

rand()函数和srand()函数的头文件是#include<stdlib.h>
time()函数的头文件是#include<time.h>

下面我们就可以调试代码,试一下是否真正得生成随机数

调试之后可以发现两次调试所生成的数字均不相同,故生成随机数成功!

但是我们发现生成的随机数都偏大,如果我们想把生成的随机数字把控在1~100呢?

我们可以这样

int ret=rand()%100+1;

任何数字模100后的结果都会是小于100的,故rand(0)%100的结果为0~99,在加上1的范围就为1 ~ 100了。

生成随机数字后我们就可以输入一个自己猜的数字guess,并且用if语句进行判断是过大还是过小,用while进行循环猜数字

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
  printf("1.开始游戏\n");
  printf("2.退出游戏\n");
}
void game()
{
  int ret = rand() % 10 + 1;
  int guess = 0;
  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;
}

这样,我们的猜数字游戏就完成了!

最后,我们可以对这个猜数字游戏做一个优化,例如,我们只能猜三次,若是三次猜数字都错了就失败了

我们可以定义一个变量count等于3,每次猜大或者猜小就执行语句count–

void game()
{
  int ret = rand() % 10 + 1;
  int guess = 0;
  int count = 3;
  while (1)
  {   
    printf("请输入你猜的数字->:");
    scanf("%d", &guess);
    if (guess > ret)
    {
      printf("你猜大了!\n");
      count--;
    }
    else if (guess > ret)
    {
      printf("你猜小了!\n");
      count--;
    }
    else
    {
      printf("恭喜你通关!\n");
      break;
    }
    if (count == 0)
    {
      printf("闯关失败!\n");
      break;
    }
  }
}

完整代码如下

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
  printf("1.开始游戏\n");
  printf("2.退出游戏\n");
}
void game()
{
  int ret = rand()%100 + 1;
  int guess = 0;
  int count = 3;
  while (1)
  {   
    printf("请输入你猜的数字->:");
    scanf("%d", &guess);
    if (guess > ret)
    {
      printf("你猜大了!\n");
      
    }
    else if (guess < ret)
    {
      printf("你猜小了!\n");
    
    }
    else
    {
      printf("恭喜你通关!\n");
      break;
    }
    if (count == 0)
    {
      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;
}
相关文章
|
运维 Java API
nacos常见问题之Nacos读取配置文件失败如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
SpringCloudAlibaba NoSQL 安全
SpringCloudAlibaba篇(九)SpringCloudGateWay整合Oauth2+Jwt实现认证中心
SpringCloudAlibaba篇(九)SpringCloudGateWay整合Oauth2+Jwt实现认证中心
3172 0
SpringCloudAlibaba篇(九)SpringCloudGateWay整合Oauth2+Jwt实现认证中心
|
6月前
|
传感器 编解码 算法
stm32的PID控制算法
基于STM32的PID温度控制系统实现,整合硬件配置、PID算法优化及显示模块设计
|
11月前
|
数据采集 人工智能 监控
GEO优化核心:高权重新闻信源筛选与AI收录实战指南
在 GEO(搜索引擎地理优化)实操中,新闻信源的质量直接影响内容的 AI 收录率、关键词排名及转化效果。多数开发者面临两大核心问题:1. 低价值信源浪费成本:部分新闻平台价格低廉(30-50 元 / 篇),但发布后未被 AI 抓取,无法为 GEO 排名提供权重支撑;2. 广告属性触发审核拒绝:含联系方式(电话、微信号)的软文易被平台判定为广告,导致审核驳回,影响发布效率。
|
人工智能 自然语言处理 关系型数据库
极智编程:基于Qoder+PolarDB Supabase 实现全栈VibeCoding
VibeCoding是AI驱动的编程新范式,开发者通过自然语言描述需求,由AI完成全栈开发。结合Qoder与PolarDB Supabase MCP Server,可填补前后端断层,实现高效全栈应用生成,显著降低开发门槛,提升非专业者的开发效率。
|
人工智能 自然语言处理 安全
Milvus x n8n :自动化拆解Github文档,零代码构建领域知识智能问答
本文介绍了在构建特定技术领域问答机器人时面临的四大挑战:知识滞后性、信息幻觉、领域术语理解不足和知识库维护成本高。通过结合Milvus向量数据库和n8n低代码平台,提出了一种高效的解决方案。该方案利用Milvus的高性能向量检索和n8n的工作流编排能力,构建了一个可自动更新、精准回答技术问题的智能问答系统,并介绍了部署过程中的可观测性和安全性实现方法。
1473 0
|
Java 测试技术 应用服务中间件
Spring Boot 配置文件总结
Spring Boot 提供全局配置文件 `application.properties` 和 `application.yml`,用于修改自动配置的默认值。前者使用键值对配置,后者使用缩进和冒号。不同环境(开发、测试、生产)可切换配置文件,通过 `spring.profiles.active` 指定。例如,开发环境端口为4790,测试环境为4791,生产环境为4792。配置示例展示了属性、List、Map定义及引用方法。
726 14
|
JavaScript
Selenium--WebDriverWait--你知道显示等待?(结合源码让你更加得心应手)
Selenium--WebDriverWait--你知道显示等待?(结合源码让你更加得心应手)
513 0
|
移动开发 前端开发 JavaScript
游戏开发技术- 请谈谈WebGL与Canvas的区别,以及在什么情况下更适合使用WebGL。
WebGL和Canvas都是网页游戏开发的关键技术。Canvas是2D绘图API,适合初学者和简单的2D游戏,而WebGL是基于OpenGL的3D渲染标准,用于复杂3D图形和游戏,提供GPU硬件加速。当涉及3D渲染、高级视觉效果或高性能需求时,WebGL是更好的选择。对于轻量级2D应用,Canvas就足够了。某些游戏引擎支持两者自动切换,以实现最佳性能和兼容性。
2340 4