猜数字小游戏(随机生成’三剑客‘)

简介: 猜数字小游戏(随机生成’三剑客‘)

大家好,我是一只励志要翻身的小牛,废话少说,下面就给大家介绍第一个C语言小游戏——猜数字小游戏!


一、游戏规则

至于猜数字嘛,见名知意,规则无非就是:玩家反复输入猜的数字直到猜对为止,下面,我们就通过C语言实现一个1-100之间的猜数字游戏,老铁们准备好了吗,发车了!

二、效果展示

三、游戏设计思路

1.游戏交互界面

       (1)创建游戏菜单

       (2)创建游戏逻辑主体

2.猜数字游戏

       (1)电脑生成随机数字

       (2)玩家输入数字

       (3)判断是否猜对

四、游戏交互界面

1.创建游戏菜单

玩游戏怎么能没有菜单呢,下面我们创建一个简易的菜单供玩家选择:

void menu()
{
  printf("**************************************************\n");
  printf("*******      1->play       0->exit        ********\n");
  printf("**************************************************\n");
}

2.创建游戏逻辑主体

游戏的逻辑的是否完美实现是整个游戏成败的关键,对于这样一个简单的小游戏我们可以这样实现游戏主体逻辑:

int main()
{ 
    srand((unsigned int)time(NULL));//拿时间戳来设置随机数的生成起始点
  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);//这里用do while 循环是因为这个游戏需要至少进去一次
                //特点:先执行,后判断
  return 0;
}

1、因为游戏是面向用户的,所以这里需要定义并调用菜单函数——menu()

2、因为游戏至少可以进入一次,所以用do-while()循环——代码至少执行一次

注意:while(input)——循环条件input的巧妙之处,C语言中0为假,非0为真,所以这里用户输入1或输入 其他非0数字导致错误,都会再次调出菜单让用户选择,无需增加其他条件。

当然了这里的猜数字游戏函数-game()还未定义,我们接下来我们就需要对 game()函数进行实现:

五、游戏实现

1、随机数生成”三剑客“

我们回到游戏的设计思路,其实猜数字游戏中最重要的一步就是生成随机数,那我们应该如何生成随机数呢?这里C语言为我们提供了随机数生成三剑客:rand--srand--time

(1)随机数生成器:rand函数

rand()函数的属性:int rand (void)——生成随机整数(0-32767)

分析:rand()函数接受参数为空,返回一个int类型的随机整数。头文件-stdlib.h

但是rand()函数真的随机吗?我们下面一探究竟:

#include <stdio.h>
#include<stdlib.h>
int main()
{
  int i = 5;
  while (i)
  {
    int ret = rand();
    printf("%d\n", ret);
    i--;
  }
  return 0;
}

执行3次结果:

可以发现,循环5次后,每组的随机数据都一致,因此答案就很明显了,rand()函数是假随机。

(2)随机数发生器的初始化函数:srand函数

那么我们还有没有办法让它真随机呢?办法当然是有的啦,C语言同时为我们提供了一个随机数发生器的初始化函数:srand函数--配合rand函数使用,设置随机数生成起点

srand()函数属性:void srand (unsigned int seed)

分析:srand函数接受一个unsigned int类型,返回空(不需要返回值->设置随机数生成起点),头文件-stdlib.h

执行结果:

可以发现,rand函数生成的随机值随srand函数接受参数变化而变化,要想让rand函数生成一个随机数,srand函数就需要接收一个随机值

(3)获取时间戳:time函数:

那么这个随机值去哪找呢?因为时间是不断变化的,因此我们可以让srand函数接收一个时间戳。 这里引出获取时间戳:time函数:

time函数属性:time_t time (time_t* timer)

分析:time函数接收一个指针类型,返回time_t类型,头文件-time.h

(4)三剑客的”有机结合“ -真随机的实现

1.rand函数的属性:int rand (void)

2.srand函数属性:void srand (unsigned int seed)

3.time函数属性:time_t time (time_t* timer)

了解了“三剑客”各自的属性,就可以开始配置随机数生成器,实现“真随机 ”

//生成随机数的大致逻辑结构
#include<stdlib.h>
#include<time.h>
int main()
{
  srand((unsigned int)time(NULL));
  int ret = rand();
  return 0;
}

注意:

1、time函数接收指针类型参数,所以传入NULL-空指针

2、srand函数接收unsigned int类型参数 ,所以将time返回类型time_t转换为unsigned int类型

2、玩家输入与判断

玩家输入与判断模块通过简单的while循环语句与if判断语句即可实现,这里就不再分开赘述,代码如下:

void game()
{
  int a = 0;
  //rand()函数生成一个随机数
  int ret = rand() % 100 + 1;//1-100之间的随机数
  while (1)//1为真,让他一直循环,直到猜对
  {
    printf("请猜数字:");
    scanf("%d", &a);
    if (a > ret)
    {
      printf("猜大了\n");
    }
    else if (a < ret)
    {
      printf("猜小了\n");
    }
    else
    {
      printf("恭喜你,猜对了!\n");
      break;
    }
  }
}


注意:

1、这里的srand函数放到了主函数中,因为调用一次函数就会设置一个随机数的生成器,不需要重复调用。

2、 rand()%100+1的含义:因为rand生成随机整数范围是(0-32767),所以rand()%100限定了范围(0-99),加1满足(1-100)范围需求。

六、完整代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
  printf("**************************************************\n");
  printf("*******      1->play       0->exit        ********\n");
  printf("**************************************************\n");
}
void game()
{
  int a = 0;
  //rand()函数生成一个随机数
  int ret = rand() % 100 + 1;//1-100之间的随机数
  while (1)//1为真,让他一直循环,直到猜对
  {
    printf("请猜数字:");
    scanf("%d", &a);
    if (a > ret)
    {
      printf("猜大了\n");
    }
    else if (a < ret)
    {
      printf("猜小了\n");
    }
    else
    {
      printf("恭喜你,猜对了!\n");
      break;
    }
  }
}
int main()
{ 
    srand((unsigned int)time(NULL));//拿时间戳来设置随机数的生成起始点
  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);//这里用do while 循环是因为这个游戏需要至少进去一次
                //特点:先执行,后判断
  return 0;
}

七、结语

铁汁们,猜数字游戏这点事大家都明白了吗?如果本文对你有所帮助的话,请给博主一个一键三连哦🥰


相关文章
|
Java Shell 应用服务中间件
超详细总结docker镜像
超详细总结docker镜像
475 0
|
Java 程序员 Apache
编程语言比拼之Java VS C++
Java和C++都是非常受欢迎的编程语言,各有各的优势和适用场景。以下是对它们的简要比较:
679 0
|
传感器 数据采集 JSON
RS232/RS485转4G DTU 上传基于Modbus协议的温湿度传感器数据到远程TCP服务器
RS232/RS485转4G DTU 上传基于Modbus协议的温湿度传感器数据到远程TCP服务器
1153 0
RS232/RS485转4G DTU 上传基于Modbus协议的温湿度传感器数据到远程TCP服务器
|
7月前
|
人工智能 自然语言处理 供应链
从体验到系统工程丨上手评测国内首款 AI 电商 App
近期,1688 推出了 1688 AI App,这貌似是国内第一个电商领域的独立 AI App 应用(若不是,欢迎评论指正)。本文试图通过产品界面这一入口,窥探其背后的系统工程。
1064 58
|
数据采集 监控 算法
原子钟的基本介绍
【10月更文挑战第7天】本文介绍原子钟是一种利用原子跃迁频率作为基准的高精度计时设备,广泛应用于通信、导航、科学研究等领域。铯原子钟是最精确的计时设备之一,基于铯133原子的超精细跃迁,频率为9,192,631,770 Hz。其关键部件包括铯束源、微波腔、磁态选择器、检测系统和反馈回路。原子钟在GPS、电信、金融市场等应用中至关重要,软件开发需考虑高精度时间同步、数据处理、硬件接口和性能监控。
2321 62
|
机器学习/深度学习 人工智能 自然语言处理
《解码AI大模型涌现能力:从量变到质变的智能跃迁》
人工智能大模型的涌现能力是当今科技的焦点。其产生依赖于四大关键因素:1) 海量数据提供丰富的训练素材,涵盖多样化的文本和图像;2) 强大算力如GPU、TPU加速模型训练,突破性能瓶颈;3) 精妙架构如Transformer引入自注意力机制,提升语义理解;4) 过参数化与优化策略使模型不断进化,展现未曾预设的能力。这些因素协同作用,推动大模型在复杂任务中表现出色,为未来带来更多可能。
1043 11
|
小程序 JavaScript 数据库
微信小程序|考试系统|基于微信小程序和SpringBoot+VUE的智能在线考试系统毕业设计
微信小程序|考试系统|基于微信小程序和SpringBoot+VUE的智能在线考试系统毕业设计
935 0
|
NoSQL Java Redis
Redis6入门到实战------思维导图+章节目录
这篇文章提供了Redis 6从入门到实战的全面学习资料,包括思维导图和各章节目录,涵盖了NoSQL数据库、Redis安装配置、数据类型、事务、持久化、主从复制、集群等核心知识点。
Redis6入门到实战------思维导图+章节目录
|
机器学习/深度学习 搜索推荐 数据挖掘
多模态融合的难点
【2月更文挑战第17天】多模态融合的难点
879 1
多模态融合的难点
|
存储 算法 安全
使用MD5当做文件的唯一标识,这样安全么?
MD5常用于文件完整性验证。通过对文件进行MD5哈希计算,可以生成唯一的哈希值,用于识别文件的内容是否发生改变。这在文件传输和数据备份中特别有用。 MD5也经常被用于密码存储,将用户密码经过MD5哈希后存储,而不是直接保存明文密码,以增加安全性。
4058 0
使用MD5当做文件的唯一标识,这样安全么?

热门文章

最新文章