【C语言小游戏】猜数字游戏

article/2025/8/24 9:50:23

hello,csdn的小伙伴呢,在前面,我们已经初步了解了c语言,并且系统的学习了分支与循环的内容。今天我们就将分支与循环的内容综合应用一下,来做一个很简单猜数字小游戏。


目录

程序的需求以及最终代码展示

一、实现打印出菜单

二、循环的条件

三、实现选择分支

四、实现具体的游戏功能

1.生成随机数

2.猜数字

总结


程序的需求以及最终代码展示

这个是最重要的一步,我们得先直到程序需要有什么需求,才能方便我们进行后面的操作

1.程序会声称1~100之间的随机数

2.猜数字

(1)猜小了,程序提示猜小了,继续猜

(2)猜大了,程序提示猜大了,继续猜

(3)猜中了,程序提示猜中了,游戏结束

3.游戏可以反复玩

这里直接给出最终代码展示,读者可以先自行阅读,然后看文章的讲解是如何实现出这个代码的。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{printf("*************************\n");printf("*****  1.开始游戏   *****\n");printf("*****  0.结束游戏   *****\n");printf("*************************\n");
}
void play()
{int ret = rand()%100+1;int num;//printf("%d\n", ret);printf("请输入你猜的数字\n");while(1){scanf("%d", &num);if (num > ret){printf("猜大了,请重新选择\n");}else if (num < ret){printf("猜小了,请重新选择\n");}else{printf("恭喜你,猜对了!!!");}}
}
int main()
{ srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:play();printf("开始猜数字\n");break;case 0:printf("结束游戏\n");break;default:printf("输入错误,请重新选择\n");}} while (input);return 0;
}

一、实现打印出菜单

首先我们得打印出一个菜单吧,菜单上面显示着开始游戏或者退出游戏。如何实现呢?请看下面代码。

#include<stdio.h>
void menu()
{printf("*************************\n");printf("*****  1.开始游戏   *****\n");printf("*****  0.结束游戏   *****\n");printf("*************************\n");
}
int main()
{do{menu();printf("请选择:");} while ();return 0;
}

如上代码所示,我们进入主函数以后,先执行一个do while循环,因为我们这个是至少要经历一次循环的,至于循环的条件是什么,后面在探讨,然后我们将菜单封装成一个函数menu,这样的好处是可以使得主函数的代码变得简洁,使得每个功能都独立起来。方便后续的使用。这样我们就成功的制作出了一个界面了

二、循环的条件

因为这个游戏是由我们来进行选择0或者1的,所以我们肯定得需要输入一个数,这时候就需要scanf这个库函数了,我们不妨定义一个新变量input,将scanf输入的那个数字放在一个input的变量里面,注意,这里有一个经典的错误标准的零分,我们很多人在定义input的时候将input定义在了do while循环内部,这就犯了大错了,因为input是一个局部变量,它的作用域与生命周期都只在它所在的大括号内部。如果我们将input定义在了循环内部,那么我们while后面的括号就不认识input了,因为它已经离开了它所在的作用域,它的生命周期也已经销毁了。那么在这里有人就问,如果我加上一个static呢?注意,这又是一个经典的错误标准的零分,因为static对于局部变量只能延长它的生命周期,但是不会影响它的作用域,因此,加上static仍然是一个经典的错误标准的零分。

input的定义好了,那么判断条件到底是什么呢,注意看,我们的菜单是1开始游戏,0结束游戏,也就是说,判断条件就是input!=0,只要input等于0,那么循环结束,也就意味着游戏结束,可是input不等于,那是不是就等价于,我们循环的条件直接填写input就可以了,因为只有0为假,非零为真。经过思考,相信读者也能想明白。

那么我们加上循环条件后代码如下

#include<stdio.h>
void menu()
{printf("*************************\n");printf("*****  1.开始游戏   *****\n");printf("*****  0.结束游戏   *****\n");printf("*************************\n");
}
int main()
{int input = 0;do{menu();printf("请选择:");scanf("%d", &input);} while (input);return 0;
}

我们简单测试一下,这里也同样提醒大家,一定要完成一点需求,测试一点,防止我们后续一股劲写完后,一堆bug,无从下手。

 在这里虽然说我们的游戏还没有成功制作好,但是我们的界面已经完成了。

三、实现选择分支

这个需求我们主要是用来实现如果选择这个,则需要进入哪一个环节。选择的不是0和1,又该何去何从呢?经过思考,显然switch比较适合一些,因为它比较简洁,而且其拥有一个default语句。实在是再适合不过了。那么我们来简单的实现一下吧

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

我们继续测试一下功能

可见符合我们的预期。

四、实现具体的游戏功能

要实现游戏功能,那肯定得把游戏的代码放在case为1的条件下,但是如果直接放进去,显得代码过于冗杂,所以我们不妨和一开始的菜单一样,将他封装到函数里面。在这个函数里面实现具体的功能,我们不妨让这个函数为 void game(),不需要参数,也不许返回任何一个东西,只要直接调用这个函数,就可以直接进行游戏。

那么游戏内部的功能该如何实现呢?

我们将其分为两步:第一步生成随机数,第二步猜数字。

1.生成随机数

如何生成随机数才是这个道题最大的难关。在这里我们需要了解一个函数rand,rand函数是专门用来生成随机数的。那么rand该怎么用呢?,我们再次打开我们的cplusplus网站查找这个库函数。在这里我们再次贴出这个网站 :c语言库函数,在这个网站中,我们搜索rand,遇到以下界面

我们可以从这个网站的介绍中得知,rand是一个无参数的,返回类型是int的函数,它的作用是生成一个随机数。并且返回这个0~RAND_MAX之间的一个整数。那这里我们要了解RAND_MAX是什么东西?

我们直接把它复制粘贴到我们的visual stdio编译器上,注意要放到一个函数里面,然后我们右击它,点击转到定义。如下图所示

 我们会进入到这样一个界面

 在前面的学习中我们也了解到了define这个预处理指令的作用是什么(如果已经忘记了的话,我这里直接给出链接:第一站:初识C语言(第四幕))RAND_MAX其实就是我们的0x7fff这个十六进制数,这个十六进制数的大小我们也可以简单的计算一下它的十进制数也就是32767(如果想要知道计算原理的话,也在前面的文章中已经讲到,这里给出链接:进制转换)也就是说,我们 这个rand可以生成一个0~32767之间的数字。那我们不妨在程序里面进行执行以下看看效果如何?

#include<stdio.h>
#include<stdlib.h>
void menu()
{printf("*************************\n");printf("*****  1.开始游戏   *****\n");printf("*****  0.结束游戏   *****\n");printf("*************************\n");
}
void play()
{int ret = rand();printf("%d\n", ret);
}
int main()
{ int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:play();printf("开始猜数字\n");break;case 0:printf("结束游戏\n");break;default:printf("输入错误,请重新选择\n");}} while (input);return 0;
}

我们运行一下

一眼看过去,貌似还不错啊,但是事情真的那么简单吗?,读者可以多次运行以上的代码,会发现一个很诡异的事情,那就是我每次生成的随机数都一模一样啊,这可如何是好啊。那这样我玩这个游戏玩一把就腻了啊。所以说,我们要解决这种情况。

我们继续回到那个网站,在研究一下,我们会发现中间有句话已经说到了,调用rand之前,需要使用srand函数,也就是说rand函数使用之前要使用srand函数来设置随机数的生成器,通俗的来说就是使用rand之前必须使用srand。那srand该如何用呢?我们继续使用cplusplus网站,来搜素srand

我们经过阅读以后得知,srand要传入一个无符号整型的数字,不返回任何值。它的作用是设置随机数的初始值。我们可以实践一下

 嗯?怎么都是38,我把这个0换成1试试?

都是41,那2呢?

 都是45。

这似乎是让我们传一个变化的值啊,那这疯了,我们想要一个变化的值,然后需要使用srand,结果我srand也需要传一个变化的值。陷入了死循环了啊。那该如何解决呢?实际上我们不一定要传一个随机值,我们只要传一个一直变化的值即可。其实我们生活中就有一个一直在变化的值,也就是时间。

 在这里我们就得提及一个东西了,那就是时间戳。我们在百度上搜素一下它的定义吧

 时间戳  这是我们的链接。

根据上面的定义可知,时间戳就是我们当前的时间与1970年1月1日时间的差值的秒数,单位是秒。那这可就知道了,因为我们的时间一直在变化,所以这个时间戳刚好符合我们的要求啊。于是我们就将时间戳传入进去。

时间戳怎么传入呢?我们有一个函数time()这个函数用于生成时间戳,他的返回值为int,注意time_t其实就是int,但是它有一个参数,这里我们就默认传一个NULL也就是空指针,这里我们暂时不做深入讨论,读者仅仅需要记住在此处传一个NULL即可,其实NULL就是0。而且time函数属于<time.h>这个头文件

 所以我们的代码实现就为 (注意:srand需要传入一个unsigned int的数,而time返回的是int类型,所以下面代码就对time进行了强制类型转化)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{printf("*************************\n");printf("*****  1.开始游戏   *****\n");printf("*****  0.结束游戏   *****\n");printf("*************************\n");
}
void play()
{srand((unsigned int)time(NULL));int ret = rand();printf("%d\n", ret);
}
int main()
{ int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:play();printf("开始猜数字\n");break;case 0:printf("结束游戏\n");break;default:printf("输入错误,请重新选择\n");}} while (input);return 0;
}

经过测试后,我们发现,貌似好像还是有点问题,因为我们每个随机数都比较相近,而且如果按的快的话,甚至都会一样

 这又是什么原因呢?

其实我们的srand是初始化随机数发生器,我们只需要调用一次即可,不要频繁调用。而我们把它放到game函数后,它每玩一次游戏就会初识化一次,所以说我们把这个srand放到main函数就能解决问题.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{printf("*************************\n");printf("*****  1.开始游戏   *****\n");printf("*****  0.结束游戏   *****\n");printf("*************************\n");
}
void play()
{int ret = rand();printf("%d\n", ret);
}
int main()
{ srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:play();printf("开始猜数字\n");break;case 0:printf("结束游戏\n");break;default:printf("输入错误,请重新选择\n");}} while (input);return 0;
}

运行结果如下

这下事情就完美的解决了。 终于生成一个随机数了,但是我们要注意一点,我们的要获取一个1~100之间的数。所以我们要对rand对100取模+1,这样就完美的解决了问题。

 现在我们已经成功的生成了随机数了,接下来我们就是进行猜数字了。

2.猜数字

这个的实现就比较简单了,我将最终代码放在这块,读者可以自行去阅读,尝试理解,有任何不懂的直接在评论区里发出来你的困惑,我看到随时回答。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{printf("*************************\n");printf("*****  1.开始游戏   *****\n");printf("*****  0.结束游戏   *****\n");printf("*************************\n");
}
void play()
{int ret = rand()%100+1;int num;//printf("%d\n", ret);printf("请输入你猜的数字\n");while(1){scanf("%d", &num);if (num > ret){printf("猜大了,请重新选择\n");}else if (num < ret){printf("猜小了,请重新选择\n");}else{printf("恭喜你,猜对了!!!");}}
}
int main()
{ srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:play();printf("开始猜数字\n");break;case 0:printf("结束游戏\n");break;default:printf("输入错误,请重新选择\n");}} while (input);return 0;
}

总结

本小节主要讲解了猜数字游戏的实现,讲解的非常详细,希望读者可以从中获得一些感悟。取得一定的进步,不要忘记点赞加关注哦!!!


http://chatgpt.dhexx.cn/article/stFqFpBB.shtml

相关文章

C语言学习推荐---小游戏

文章目录 控制台文字游戏srand、rand、time猜拳游戏 控制台动作游戏运动的小球贪吃蛇 音乐图形界面easyx介绍 后续 学习c语言的时候&#xff0c;想写例子&#xff0c;但是课后习题又太枯燥怎么办&#xff1f; 写小游戏可以锻炼我们的编程抽象能力和思维&#xff0c;而且比较有趣…

c语言入门级小游戏·飞机(1.0版)| 激发你的编程兴趣(50~100行代码)

目录 制作一个可移动的飞机 发射激光 设置一个可击中的障碍物 完整代码 声明&#xff1a;本游戏参考《c语言课程设计与游戏开发实践教程》。 先来放一个效果图 怎么样&#xff0c;真的是新手级别吧&#xff1f; &#xff08;效果视频c语言练习草稿_game1.2.5飞机-CSDN直播…

C语言小游戏之扫雷完整版

C语言小游戏之扫雷 一.游戏介绍二.游戏步骤及实现的功能1.初始化雷盘2.打印雷盘3.随机布置雷4.玩家排雷5.防止玩家第一次被炸死6.统计所选位置周围八个位置中雷的个数7.递归拓展已选位置周围的区域8.标记雷及取消标记 一.游戏介绍 看到这张图片&#xff0c;相信很多小伙伴都非常…

C初阶必写的C语言小游戏—扫雷,一看就会,看完就能写

目录 一.前言二.资源环境的配置三.游戏整体构思1.游戏的开始与结束(菜单)2.创建二维数组用来布置雷和排查雷的信息3.初始化棋盘4.打印棋盘5.布置雷6.排查雷 四.所有代码及效果展示 一.前言 人尽皆知的扫雷小游戏&#xff0c;原理简单&#xff0c;写法也简单&#xff0c;我会通…

c语言代码怎样制作成一个游戏?

游戏背景 《球球大作战》是Superpop一款自主研du发的免费手机网络游戏。 以玩家间的实时互动PK产生游戏乐趣为设计宗旨&#xff0c;通过简单的规则将玩家操作直接转化为游戏策略&#xff0c;体验智谋碰撞的战斗乐趣。 游戏的基本操作包括键盘按下&#xff08;上下左右四个方向…

[ C语言 ] 用C语言实现小游戏 ---- 三子棋 代码 + 解析

前言 本篇文章记录了用C语言实现三子棋小游戏&#xff0c;主要目的是对之前C语言知识学习的巩固&#xff0c;联系各个知识&#xff0c;以及怎么样实际使用各个知识。 一、三子棋的游戏规则 玩家将会看到一个3X3的网格棋盘&#xff0c;默认玩家先下棋&#xff0c;电脑后下棋。 …

一个好玩的小游戏(纯C语言编写)

最近在看知乎是发现了一个这一个专栏 https://zhuanlan.zhihu.com/c2game 从中获取的许多知识&#xff0c;本文中的游戏也是从里面学到的&#xff0c;不过本人又自己加了一些功能。 这是一个类似于飞机大战的游戏&#xff0c;不过目前代码量比较小&#xff0c;所以看起来非常…

【用游戏学C语言】几个基本的小游戏的实现(缓慢更新中~)

目录 ​更新说明 前言 1.相关函数的简单介绍&#xff08;预备知识&#xff09; &#xff08;1&#xff09;关于函数getch() &#xff08;2&#xff09;关于函数system() &#xff08;3&#xff09;关于函数sleep() &#xff08;4&#xff09;关于函数kbhit() &#xff…

【C语言】游戏项目:《疯狂赛车》,每个人都要加油活下去

序 交换一个苹果&#xff0c;得到一个苹果&#xff1b;交换一种思想&#xff0c;得到一种思想。选择与你才干&#xff0c;性格不同的人&#xff0c;他可以弥补你的缺陷。 嗨&#xff01;这里是狐狸~~ 最近有点网抑云了&#xff0c;脑子很乱&#xff0c;不晓得想些什么&#…

Qt学习之QFile和QFileInfo

Qt项目中对文件操作是必不可少的。顾名思义&#xff1a;QFile是文件对象类&#xff0c;QFileInfo是文件信息对象类&#xff0c;结合例子我们看一下用法。 读的文件内容如下&#xff0c;以字符 “#” 或者 “;” 开始的为注释行。 [Extern_Item1] ;名称 Namelibccgext_cvi_64.so…

QT5 QFile读/写文件操作方法

文档打开读/写操作命令说明 值描述QIODevice::NotOpen未打开QIODevice::ReadOnly以只读方式打开QIODevice::WriteOnly以只写方式打开QIODevice::ReadWrite以读写方式打开QIODevice::Append以追加的方式打开&#xff0c;新增加的内容将被追加到文件末尾QIODevice::Truncate以重…

qt5之QFile读写文件

1、效果 读写文件用到的是QFile类&#xff0c; 这里&#xff0c;我显示文件内容用到的是 QTextEdit 2、创建打开和关闭按钮 // 打开文件btnOpenFile new QToolButton;btnOpenFile->setText(tr("open a file"));btnOpenFile->setToolTip(tr("open …

Qt 创建文件 用QFile和QDir类

项目需求是 根据日期创建多级子文件夹, 根目录保存 log.txt 控制台程序实现 如下执行结果 createFile 为程序目录 文档结构: 源码: #include <QtCore/QCoreApplication> #include <QDir> #include <QFile> #include <QDebug> #include <QDateTim…

QFile(文件)

QFile QFile提供一个用于读/写的接口&#xff0c;是一个可以用来读/写二进制文件的Qt资源的I/O设备&#xff0c;QFile可以单独使用&#xff0c;一般配合QTextStream或QDataStream 输入文件路径时最好使用"/"作为分隔符 构造函数&#xff1a; 常用的函数&#xff1a;…

QFileDialog

一、描述 QFileDialog 类使用户能够遍历文件系统以选择一个或多个文件或目录。 创建 QFileDialog 最简单的方法是使用静态函数&#xff1a; fileName QFileDialog::getOpenFileName(this, tr("Open Image"), "/home/jana", tr("Image Files (*.p…

Qt -- QFile文件读写操作

对于文件的读写操作&#xff0c;C 和 C 都各有一套方式。而在 Qt 中也有一套&#xff0c;即使用 QFile 对文件进行读和写操作。 文件的打开方式 文件路径说明&#xff1a;&#xff08;windows-release编译&#xff09; QFile *file new QFile("EcgCap.dat");表示这…

[QT_032]Qt学习之基本文件读写QFile

本文转自&#xff1a;《Qt编程指南》 作者&#xff1a;奇先生 Qt编程指南&#xff0c;Qt新手教程&#xff0c;Qt Programming Guide 7.2 基本文件读写QFile Qt 常见的文件读写类有三个 QFile、QTextStream 和 QDataStream&#xff0c;本节先概要介绍这三个文件读写类&…

QFileInfo

一、描述 QFileInfo 提供有关文件系统中文件的名称和位置&#xff08;路径&#xff09;、访问权限、文件类型等信息。 FileInfo 还可用于获取有关 Qt 资源的信息。这个类是隐式共享的。 二、成员函数 2.1、判断函数 1、bool isAbsolute() 文件路径是否绝对路径。 注意&am…

QFile详解(文件如果不存在则创建、判断文件是否存在、获得文件的各种详细信息、读写文件)

目录 一、QFile文件如果不存在则创建的方法 二、QFile判断文件是否存在的方法 三、QFileInfo的方法获得文件的各种详细信息 四、QFile读写文件的内容 一、QFile文件如果不存在则创建的方法 QFile f("./1234.ini");if(!f.open(QIODevice::Append)){return 0;} op…

QFile文件读写

文章目录 简介常用apiQFile类读写文件QFileQTextStream读写文件 简介 QFile类提供了一个读取和写入文件的接口&#xff0c;一个读写文本、二进制文件和资源的I/O设备。 QFile读写文件的两种方式&#xff1a; 1.QFile可以单独使用。 2.QFile与QTextStream或QDataStream一起使用…