当前位置: 首页 > news >正文

C语言实现猜数字游戏

一. 游戏要求

1. 电脑自动生成1~100的随机数
2. 玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束

从上面可以得出,我们写的代码需要包括:随机数的生成猜数字的过程(循环)两个部分,接下来让我们看一下要怎么做吧!


二. 知识补充

2.1 rand

C语言提供了一个函数 rand ,可以生成随机数,要包含头文件: stdlib.h 

函数原型:

1      int    rand   ( void ) ;

rand 函数会返回一个伪随机数,该随机数范围在0~RAND_MAX(大部分编译器上是32767)之间

让我们来使用一下这个函数:

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

我们可以看出,生成的三个数字是随机的,但当我们再次运行的时候发现,运行结果依旧是上面的内容,因此我们说 rand 生成的数是伪随机的。伪随机数并不是真正的随机数,它是通过某种算法生成的随机数,真正的随机数应该是无法预知下一个数字是多少的

 rand 函数是对一个叫 “ 种子 ” 的基准值进行运算生成的随机数,前面之所以会产生相同的数字,是因为 rand 函数生成随机数的默认种子是 1 ,若要每次生成不同的随机数,就要让种子发生变化

下面让我么来看看怎么改变种子的值吧~

1.2 srand

C语言中提供了一个函数 srand ,用来初始化随机数的生成器

函数原型:

1     void   srand  (unsigned  int  seed) ;

让程序在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数 seed 来设置 rand 生成随机数时的种子。只要种子变化,那每次生成的随机数序列也就会随之变化

比如:

#include <stdio.h>                    #include <stdio.h> 
#include <stdlib.h>                   #include <stdlib.h>int main()                            int main()
{                                     {srand(1);                             srand(2);printf("%d\n", rand());               printf("%d\n", rand());printf("%d\n", rand());               printf("%d\n", rand());printf("%d\n", rand());               printf("%d\n", rand());return 0;                             return 0;
}                                     }
//41                                  //45
//18467                               //29216
//6334                                //24198

这样通过每次修改 srand 函数的参数 seed 就可以让每次输出的随机数不同。那么问题来了,每次在生成随机数之前还需要我们传进去一个值,那这样生成的数字还算真正意义的随机数吗?让我们看一下怎么解决这个问题吧~

1.3 time

在程序中我们⼀般用程序运⾏的时间作为种子,因为时间是时刻在发⽣变化的
在C语⾔中有⼀个函数叫 time ,就可以获得这个时间

函数原型:

1     time_t   time   (time_t * timer) ;

 time 函数会返回1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是 time_t 类型的,本质上是32位或64位的整型类型

time函数的参数 timer 如果是 非NULL 的指针的话,函数也会将这个返回的差值放在 timer 指向的内存中带回去;如果 timer 是 NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳

time函数的使用需要包含头⽂件: time.h 

如果只让 time 函数返回时间戳,就可以写:

time (NULL) ;  //调用time函数返回时间戳,这里没有接收返回值

看看效果吧:

#include <stdio.h>
#include <stdlib.h>int main()
{srand((unsigned int)time(NULL));printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());return 0;
}

  

这样每次运行出来的数字就不一样啦

此时我们回顾一下题目,游戏规则要求我们生成的随机数范围是1~100,因此我们还需要研究一下怎么保证每次生成的随机数在这个范围里面

1.4 设置随机数范围

1. 生成0~99之间的随机数:

rand ()  %  100 ;

2. 生成1~100之间的随机数:
rand ()  %  100  +  1;

3. 生成100~200的随机数:

100  +  rand ()  %  (200 - 100 + 1);

综上,生成a~b之间的随机数:

a  +  rand ()  %  (b - a + 1);


三. 思路梳理

游戏嘛,我们首先要来个菜单:

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

玩家根据菜单选择是否开始游戏,这时我们给出一个循环,每一局结束后都会询问玩家是否继续玩:

由于在游戏开始之前,也要咨询玩家是否开始游戏,因此我们在这里用 do while 循环

int input = 0;
do
{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("开始猜数字\n");break;case 0:printf("游戏结束,欢迎下次再玩\n");break;default:printf("选择错误,请重新选择\n");break;}
} while (input);

如果玩家选择开始游戏,那么接下来我们就要设计猜数字的过程了:

生成一个随机数让玩家开始猜,每次猜后给出提示:猜大了 or 猜小了 or 猜对了,没猜中则继续猜,猜中则本局结束

void game()
{int ret = rand() % 100 + 1;int guess = 0;printf("请猜数字:>\n");while (1){scanf("%d", &guess);if (guess < ret){printf("猜⼩了\n");}else if (guess > ret){printf("猜⼤了\n");}else{printf("恭喜你,猜对了\n");break;}}
}......srand((unsigned int)time(NULL));

当然,我们还可以设置猜数字的次数......,来让游戏变得更好玩


四. 代码实现

根据上面的分析,让我们来看一下完整的代码演示吧:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>void menu()
{printf("**********************\n");printf("***   1.开始游戏   ***\n");printf("***   0.退出游戏   ***\n");printf("**********************\n");
}void game()
{//生成随机数int ret = rand() % 100 + 1;printf("%d\n", ret);//猜数字int guess = 0;int count = 6;printf("游戏开始,请猜数字:>\n");printf("你一共有6次机会\n");while (count){scanf("%d", &guess);if (guess > ret){printf("猜大了\n");}else if (guess < ret){printf("猜小了\n");}else{printf("恭喜你,猜对了\n");break;}count--;printf("你还有%d次机会\n", count);}if (count == 0){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;
}

结语

通过本文,你将对C语言的输入输出、循环控制、函数运用、随机数生成等内容有更好的了解,在设计程序的过程中还可以锻炼你的思维能力,不断提升自己。如果你对游戏有其他优化建议,欢迎在评论区留言讨论~

http://www.dtcms.com/a/313679.html

相关文章:

  • 多模态大模型综述:BLIP-2详解(第二篇)
  • 问题集000
  • 图像张量中的通道维度
  • 力扣经典算法篇-41-旋转图像(辅助数组法,原地旋转法)
  • Kubernetes中ingess以及它和nginx的关系
  • 单表查询-模糊匹配
  • CMake 命令行参数完全指南(4)
  • sqli-labs靶场less26/a
  • awk对文本进行列处理
  • 【实习总结】Qt通过Qt Linguist(语言家)实现多语言支持
  • 抖音全新推荐大模型RankMixer
  • 【AI论文】ScreenCoder:通过模块化多模态智能体推动前端自动化中的视觉到代码生成技术发展
  • 从零开始实现Qwen3(Dense架构)
  • Linux 环境下 Docker 安装与简单使用指南
  • 7.28-8.3周报
  • 控制建模matlab练习10:滞后补偿器
  • OSPF笔记及综合实验报告册
  • 嵌入式 Linux 系统构建的核心组件详解
  • Go 工程化全景:从目录结构到生命周期的完整服务框架
  • 【openlayers框架学习】六:绘制点、圆、文字标注
  • 关于vllm【常见问题解决方案】
  • XtraBackup备份与恢复
  • Python 程序设计讲义(61):Python 的函数——变量的作用域
  • 【运维基础】Linux 硬盘分区管理
  • [Oracle] DUAL数据表
  • [自动化Adapt] 录制引擎 | iframe 穿透 | NTP | AIOSQLite | 数据分片
  • 第二节 YOLOv5参数
  • Python 程序设计讲义(59):Python 的函数——labmda函数(匿名函数)
  • 四、驱动篇-HDF驱动介绍2
  • sublime 乱码问题