草庐IT

猜数字游戏(1到100之间)

wdzjl32 2023-04-12 原文

猜数字游戏是我们日常生活中家喻户晓的游戏,那么我们有没有想过,这么有趣的一个游戏,在c语言中是如何表达出来的呢?让我们一起往下看:

#include<stdio.h>

void menu()

{

printf("****************************\n");

printf("******** 1.play 0.exit******\n");

printf("****************************\n");

}

int main()

{

int input = 0;

do

{

menu();(menu()、printf、scanf一定要放在循环内)

printf("请选择\n");

scanf("%d",&input);

switch(input)

{ case 1:

printf("猜数字\n")

break;

case 0:

printf("退出游戏");

break;

default:

printf("输入错误,请重新选择\n");

break;

}

}while(input);

}

首先,我们采用do....while循环,以确保程序至少可以运行一次。当我们进入循环后,就等于我们进入了游戏界面,因此,进入后的第一件事就是打印菜单menu()以供玩家选择,菜单中有0,1两个选项,因此我们需要创建一个变量input作为scanf函数的参数以供玩家输入数字,做出选择。当玩家做出选择以后,每种选择就对应着不同的结果,这时,我们就要用到switch case语句,switch(input)用于判断玩家做出了那种选择,而case:语句则对应着不同选择下不同结果,其中,若玩家输入1,则进入game()函数,开始猜数字游戏。若玩家输入0,则为退出游戏,若玩家输入的数非0非1,则进入default:语句,需要玩家重新输入。代码最后的while中,选择以input作为参数是很有讲究的,若玩家输入1,结束猜数字游戏后,break跳出,因为input == 1,所以条件为真,while循环,玩家重新回到菜单界面,选择继续玩游戏或者退出。若input输入为0,则while中条件为假,程序停止运行,实现退出游戏。若输入的input非0非1,则与第一种情况相同。到此为止,我们已经完成了猜数字游戏的第一步,让我们看看结果:

如图所示,我们很完美的打印出了菜单,以及每个选项对应的结果。紧接着,我们只需要把case1:的擦猜数字游戏实现即可

想要实现猜数字游戏,那么要满足以下两个条件

  1. 生成1—100之间的随机数。

  1. 找一个数与随机数作比较。

  1. 在实现这个函数之前,我们来介绍几个库函数。

  1. rand()随机数函数,他能生成0—2147483647之间的数字,头文件是<stdlib.h>。

若我们只使用这个随机数函数,能否实现游戏呢?让我们往下看看:

#include<stdio.h>

#include<stdlib.h>

void menu()

{

printf("****************************\n");

printf("******** 1.play 0.exit******\n");

printf("****************************\n");

}

void game()

{

int ret = 0;

ret = rand();

printf("%d\n",ret);

}

int main()

{

int input = 0;

do

{

menu();

printf("请选择\n");

scanf("%d",&input);

switch(input)

{ case 1:

game();

break;

case 0:

printf("退出游戏");

break;

default:

printf("输入错误,请重新选择\n");

break;

}

}while(input);

}

结果如下:

看到这很多小伙伴肯定认为一个rand()函数就够用了,别急,我们再运行一次:

由图的结果我们可以发现,两次运行的结果一模一样,rand()产生的随机数一模一样,这又是为什么呢?其实,这里涉及到了起始点的问题,我们得介绍另一个新的函数——srand()函数

  1. srand函数是随机数的初始化函数,用法是srand((unsigned int)seed)。

我们在game()函数中加入srand(1)看看会产生什么结果:

这时候我们又会发现,无论输入多少次1,结果始终是41.这是因为我们在srand()中输入的值是1,这是个常量,所以rand()函数只会被srand()函数初始化一次,因此输出值永远是41。为了改变这种情况,使rand()函数一直在被初始化,我们需要引入一个一直在变化的东西作为srand()函数的参数,让我们动脑想想我们生活中什么东西是随时在变化的呢?很好,是时间。因此我们引入time()函数。

  1. time()函数是时间戳函数,它的起始时间是1970年1月1日,时间戳就是现在的时间减去起始时间。引用time()函数的头文件是<time.h>。

让我们加入time()函数后再试一次:

如图我们可以发现,虽然随机数的值一直在改变,但是相差并不大,几乎相等。这是因为srand()函数被放在了循环中,time()起始点一直在被改变且相差不大(每次选择时间过短,几乎无间隔),因此这种情况time()函数几乎为一个定值,和上一种情况类似,为了解决这种情况,我们将srand()函数放在循环外面,起始时间点只需要调用一次即可:

我们完美的解决了所有出现的问题,只剩下一个问题,如何使rand()函数产生1—100之间的数字呢?

我们不妨给rand()%100,因为任何数%100都产生1—99之间的值,我们再+1,即:

rand()%100+1

我们再试一次看看结果如何:

到目前为止,我们已经实现了这个游戏的大部分,只剩下最后找一个数与随机数作比较。这还是比较简单的部分,我们直接看最后代码:

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

ret = rand()%100+1;

int guess = 0;

while(1)

{

printf("请输入数字\n");

scanf("%d",&guess);

if(ret < guess)

printf("猜大了,请重新猜\n");

else if(ret > guess)

printf("猜小了,请重新猜\n");

else

{

printf("恭喜你,猜对了\n");

break;

}

}

}

int main()

{

srand((unsigned int )time(NULL));

int input = 0;

do

{

menu();

printf("请选择\n");

scanf("%d",&input);

switch(input)

{ case 1:

game();

break;

case 0:

printf("退出游戏");

break;

default:

printf("输入错误,请重新选择\n");

break;

}

}while(input);

}

切记,scanf,printf,menu()一定要放在循环内,因为玩家需要重复进行游戏或者重复进行选择。

注意函数与循环之间的配合,以及循环参数的选用!

文章到此结束,如有不对之处,请大佬们指正!

有关猜数字游戏(1到100之间)的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  3. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  4. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  5. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  6. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  7. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

  8. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  9. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

  10. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

随机推荐