猜数字游戏程序是一个基于控制台界面的交互程序,游戏运行时,需要玩家输入一些内容交给计算机处理,计算机按照游戏设计流程判断玩家是成功还是失败。游戏设计十分简单,计算机随机生成一个数字,用户最多可以猜测10次结果,如果10次之内未能猜中计算机给出的数值,那么判定玩家失败,否则判定玩家成功。
程序启动时提示用户选择游戏的难易程度,支持三种:1.简单;2.一般;3.困难。用户输入对应的数字值作为难易程度级别,计算机会根据难易程度生成对应的数值,简单级别计算机生成的随机数范围为0-10,一般级别计算生成的随机数范围为0-100,困难级别计算机生成的随机数范围为0-1000,缺省情况下,随机数的范围为一般级别。下图为菜单函数displayMenu和获取随机数范围函数getRangeFromLevel的代码。
图1
函数displayMenu用以显示菜单内容,函数getRangeFromLevel用以将level值(1,2或3)转换为随机数所在范围的上限值,即[0,range],后续代码使用这个值生成一个随机数。
随机数生成函数generateRANDomNumber调用了标准库中的srand、time和rand三个函数,函数srand和rand的声明位于头文件stdlib.h中,函数time的声明位于time.h中,分别需要在源代码中将它们包含进来。如何生成指定范围的随机数呢?rand函数返回值是一个伪随机数,范围为0-32767之间的一个整数,为了将伪随机数的范围转换为玩家设定的数值范围,按照下面的公式进行换算。
rand / rand_max * range
rand:为0-32767之间的一个伪随机数
rand_max: 为rand函数的伪随机数最大值
range:期望的随机数范围最大值,最小值预设为0
图2
图2中第36行代码展示转换代码对应的表达式,需要注意的是rand函数返回值和RAND_MAX宏都表示为一个整数,我们需要显示地将一个操作数转换为浮点值,第32行代码中使用了类型转换符(double),获取伪随机数与最大伪随机数的比值之后,乘以期望的范围最大值range变量,就可以得到游戏中特定级别的数值范围,但是这个数值类型为浮点数,函数generateRandomNumber的返回值为整型值,故在第32行代码显示地将表达式的数值转换为整型数值。
图2中第34行代码调用了函数srand为rand函数设置了伪随机数起始种子值,如果起始种子值相同,那么rand所返回的数值序列也是一致的。为此,我们通过调用时间函数time,将当前时间所对应的秒数(自1970/1/1日开始计算)作为起始种子值,这样在每次启动这个游戏时就可以获取不同的随机数值了。
以上的三个函数实现了菜单显示、随机数范围值和生成伪随机数功能,程序的main函数对这些函数进行了调用,首先是displayMenu函数调用,用以显示菜单;之后通过玩家的输入内容来生成随机数范围,最后进入一个循环猜数流程,如果猜测次数大于10,那么程序将退出。
图3
图3代码第14行显示菜单,第16行根据玩家输入内容设定随机数范围,第17行代码生成一个随机数,第20-28行为一个循环语句,每一次玩家输入猜测的数值后,都会与计算机生成的随机数target进行比较,如果二者相同,则给出欢迎提示语,如果玩家的猜测次数超过10次,那么程序将会自动退出。
,