随机函数在游戏软件开发中的应用
2019-12-16赵海国
赵海国
摘要:随机函数在扫雷游戏、贪吃蛇游戏、纸牌游戏和拼图游戏等多种游戏软件开发过程中经常用到。该文讨论随机函数在游戏软件开发中的应用技巧,有利于游戏开发人员全面了解该类函数的功能和使用方法。
关键词:随机函数;扫雷游戏;贪吃蛇游戲;纸牌游戏
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2019)29-0062-03
游戏是人们休闲的一种重要方式,它既能丰富人们的业余生活,又能帮助人们释放学习、生活或工作中的压力。游戏之所以有如此大的魅力主要原因是其随机性,趣味性和挑战性能吸引玩家的兴趣,故而随机函数在游戏软件的程序设计中占据着举足轻重的作用。不同的语言环境下生成随机数的函数名称略有不同:iava环境下产生随机数的随机函数为Math.randomO函数,VB环境下产生随机数的随机函数为Rnd()函数,C/C++语言环境下产生随机数的随机函数为rand()函数。下面以C,c++语言环境为例介绍随机函数的相关概念及使用方法。
1随机函数的概念
1.1rand()函数的概念
在以C/C++语言为基础的编程环境中,随机函数是rand()函数。添加头文件后,可使用该函数来产生随机数。rand()函数的使用格式为:int rand(void)。
例如以下程序用几行代码就可以生成一个随机数并打印出来
以上程序中rand()函数产生的随机数并不是真正的随机数,而是一个伪随机数,因为反复调用程序发现,每次得到随机数都是同样的数,没有真正达到随机的效果。因为rand()函数的实现是以一个被称为随机数种子seed的值为基准,根据某个递推公式推算出来的。计算机开机后随机数种子seed的值会默认为1,rand()函数在每次被调用时会查看随机数种子seed的值,若随机数种子seed的值系统一直默认为1而没有被改变,得到的随机数就会是重复的。可见要想得到不同的随机序列,可以在程序运行开始时通过改变随机数种子seed的值来实现。故而系统又引入了srand()函数,用来设置随机数种子seed的值,rand()函数调用时使用不同的随机数种子seed值便可生成游戏软件系统所需要的随机序列。
1.2srand()函数的概念
srand0函数称为初始化随机数发生器,它是C/C++语言环境下用来设置随机数种子seed的值的一个函数,其正确的使用格式为:void srand(unsigned int seed)。
通过srand()函数可以重新“播种”修改随机数种子seed的值,程序先调用srand()函数设置一个最新的随机数种子seed值,然后再调用随机函数rand()函数,它会以最新的种子seed值为基准,根据递推公式推算出一个当前的随机数。由于每次设置的随机数种子seed的值是不同的,故而每次推算出来的随机数就实现了真正随机的效果。为了使得程序每次重新运行调用srand()函数时能够设置一个可变的随机数种子seed值,常常使用系统时间函数time()的返回值作为srand()函数的参数,正确使用格式为:srand((unsigned)time(NULL))或者srand((un-signed)time(O)。
程序每次被调用的时间都是不同的,语句srand((unsigned)time(O)相当于对用一个全新的时间参数对随机数种子seed进行重新“播种”,rand()函数调用时使用不同的随机数种子seed值推算出不同的随机数,反复调用即可得到不同的随机数序列。时间函数time()以秒为单位,加上头文件就可使用。由此可见,stand()函数,time()函数和rand0函数联合使用,程序生成的随机数序列就真正有了随机性,具体使用方法请看下面的程序实例。
多次运行上面这段程序,发现每次程序运行调用srand()函数被调用的时间不同,相当于每次设置的随机数种子seed的值不同,rand()函数每次推算出来的随机数便不同,故而程序每次运行都可以得到不同的随机序列。
2随机函数在游戏软件开发中的应用
2.1随机函数在扫雷游戏系统中的应用
扫雷游戏是windows系统自带的一款大众类益智小游戏,玩家要在尽可能短的时间里找出所有设置了地雷的方块,且在找雷过程中从未踩到雷则判断玩家胜利游戏结束,若中途判断错误踩到雷则判断玩家失败游戏结束。游戏根据不同难度有不同的大小规格,玩家可以自定义游戏规格和雷数,游戏开始之后玩家需要做的就是在不踩到雷的前提条件下根据翻开的方块得到周围雷的信息并找出所有地雷。
随机函数在扫雷游戏中主要用在游戏开局时初始化数据,完成游戏界面随机布雷,使得每次游戏时都有不重复的地雷布局。以游戏界面规格为9*9(row*col)的简单模式为例,定义行列为(row+2)*(col+2)的界面,上下加一行左右加一列,这样对边角的方块进行周围雷数统计时会更方便也更精准。定义一个二维数组char arr[ROW][coL],在9*9的简单模式实例中ROW和COL的值都是11,二维数组中的元素用“1”来代表雷,用“0”代表空白方块.利用srand()函数和时间函数time()函数生成随机种子seed的值,ran()函数根据最新的种子seed值推算出当前的随机数,两次调用函数生成两个随机数组成二维数组中的横坐标和纵坐标。坐标生成后判断该位置是否为空能否生成新的地雷,循环生成所有地雷,即完成随机布雷。随机函数在扫雷游戏中的关键代码如下:
可见,随机函数在扫雷游戏中的主要应用就是初始化游戏界面。先利用随机函数在二维数组中游戏界面区域生成随机坐标,判断坐标为空白时将此坐标置为雷,总雷数减一再继续生成新地雷,直到完成所有地雷的布置。因为随机函数的使用,扫雷游戏每一次重新开始后都有不同的游戏开局,给玩家带来了全新的游戏体验,游戏过程中的趣味性和挑战性对玩家有极大的吸引力。
2.2随机函数在贪吃蛇游戏系统中的应用
贪吃蛇游戏是一款简单又耐玩的经典益智游戏,矩形游戏界面内有随机布置的“食物”和一条玩家控制的贪吃蛇,玩家通过控制贪吃蛇的蛇头方向去吃掉食物,每次吃掉食物之后玩家会获得积分但是也会让贪吃蛇的蛇身变得越来越长,游戏过程中贪吃蛇的蛇头碰到游戏边框和蛇身就会判定游戏结束,累计每次吃掉食物的所有积分,最后的积分即为游戏结束时的最终成绩。
随机函数在贪吃蛇游戏中的作用是在游戏过程中在游戏界面上随机地选择位置为贪吃蛇生成新的食物。贪吃蛇是矩形游戏界面,游戏界面由一个个方块组成,先要用一个二维数组来存储数据,将srand()函数,time()函数和rand()函数联合使用生成随机数.然后把随机生成的两个随机数取余变成界面内的一个坐标,判断这个位置是不是在蛇身上或者障碍物,如果不是蛇身或障碍物就能直接生成新食物显示在游戏界面;如果是蛇身或障碍就需要重新生成新的坐标并继续判断直到新的食物生成成功为止。随机函数在贪吃蛇游戏中的关键代码如下:
随机函数在贪吃蛇游戏中的主要应用是游戏当前食物被贪吃蛇吃掉时随机地生成位置坐标为贪吃蛇生成新的食物。当游戏默认的食物被吃掉确认需要新生成新的食物时,联合使用srand()函数,time()函数和rand()函数生成两个随机数组合成坐标,并判断这个坐标是否生成在蛇身或障碍的坐标上,判断该坐标不在蛇身和障碍上后将新食物生成在该坐标位置显示出来供贪吃蛇食用。游戏过程中,食物不断被吃掉的同时又不断地生成新的食物,如此循环直至游戏结束。游戏过程中贪吃蛇吃掉食物积分增长的同时贪吃蛇的蛇身不断增长,游戏难度越来越大,挑战性越来越强,趣味性也不断增强,极大地提升了玩家的兴趣。
2.3随机函数在纸牌游戏系统中的应用
纸牌游戏是一款种类繁多、规则各异、普及最广的大众类游戏,windows系统中的蜘蛛纸牌、空当接龙这类单人纸牌排序游戏,斗地主、跑得快等联机对战游戏都是纸牌类游戏。游戏中的纸牌包括A,2-10、J-K共13种,每种各4张不同花色,力113::大王和小王共54张牌组成一副牌组.程序给扑克牌的每张牌按照规则编号:黑桃按从小到大依次标号为l到13,红桃按从小到大为14到26,梅花按从小到大为27到39,方块按从小到大为40到52,小王为53,大王为54,这54张牌按照从小到大的顺序依次存入一维数组中。以斗地主为列,游戏将54张牌分发给3名玩家,每人17张牌,地主玩家另外多拿3張牌并先手出牌,两名农民玩家合作对抗地主玩家,3人中最先打完手牌的玩家所代表的一方获胜。
虽然纸牌游戏类型多样,游戏输赢的判定规则也各不相同,但是随机函数在各类纸牌游戏中的作用是大致相同的,主要用于游戏开局是进行随机洗牌和随机切牌。随机洗牌是指使用随机函数在游戏开局时通过随机交换牌组数据元素的位置来打乱纸牌数组中的数据,使得54张牌按照不同的顺序存放在纸牌数组中,完成洗牌。不同于扫雷游戏和贪吃蛇游戏,纸牌游戏只需要用一个一维数组来存储数据,创建一维数组并赋值以区分不同的纸牌,联合使用srand()函数,time()函数和randO函数生成一维数组中的随机坐标,然后数组从头开始每个元素都匹配一个新生成的随机坐标,并将两个位置上的元素对换位置,依次对换位置后就完成了对牌组的打乱洗牌。随机函数不仅应用于随机洗牌,洗牌完成后还会进行随机切牌,将随机选取出的纸牌分给玩家做手牌。通过两次使用随机函数后,即可使玩家每次都能分到不一样的手牌。随机函数在纸牌游戏中用于随机洗牌的关键代码如下:
void Shuffle_Cards(int card[541)//洗牌函数的参数为存储54张纸牌数据的一维数组
以上洗牌函数Shuffle_Cards中随机函数的作用是完成洗牌,该函数的参数为存放牌组数据的一维数组card,通过联合使用srand()函数,time()函数和rand()函数随机挑选出牌并调换位置,通过循环交换若干次将扑克牌的顺序完全打乱,从而完成随机洗牌过程,得到一个全新的数组达到洗牌的目的,实现初始化游戏数据的效果。随机函数在发牌过程中主要用于随机地将新产生的数组分配给三个玩家,完成随机发牌过程。当游戏进入到新一轮时,在洗牌和发牌的过程中都有用到随机函数,使得玩家每一次都能拿到全新的牌组参与游戏,增强了游戏的趣味性,同时这类使用最广的纸牌游戏也给大众提供了方便快捷的消遣方式。
3随机函数的应用总结
从随机函数在扫雷游戏、贪吃蛇游戏和纸牌游戏中的应用实例可以看出,众多游戏设计过程中都使用了随机函数。游戏设计时为了真正实现游戏数据的随机化,达到游戏趣味性的效果,需要注意以下两点:
1)注意各个函数的使用顺序和时机:先以时间函数time(NULL)为参数调用srand()函数来设置随机数种子seed的值,再调用rand()函数以最新的随机数种子值为基准根据递推公式推算出一个最新的随机数,正确地联合使用srand()函数,time()函数和rand()函数才能生成游戏软件真正需要的随机序列;
2)注意随机数的数值范围:游戏系统中生成的随机数多用于游戏数据处理,扫雷游戏界面随机布雷和贪吃蛇游戏中生成新的食物都是用随机数作为二维数组的下标对数组中的元素进行相关操作,纸牌游戏中随机洗牌和随机切牌就是用随机数作为一维数组的下标对数组元素进行处理。要使用随机数作为数组下标就必须注意数值的范围,系统生成的随机数必须要使用取余运算进行相关处理后方能正确使用。
可见,随机函数的正确使用可以实现游戏数据的随机化:扫雷游戏中使用随机函数可以实现游戏界面内的随机布雷;贪吃蛇游戏使用随机函数可以在当前食物被吃掉时随机地为贪吃蛇选择空白位置坐标生成新的食物供贪吃蛇继续食用;纸牌游戏使用随机函数可以实现随机洗牌和随机切牌。此外,随机函数还在连连看游戏,俄罗斯方块游戏,拼图游戏等众多游戏中有广泛的应用。在各类游戏中,随机函数的使用增进了游戏初始数据的随机性,提高了游戏的趣味性,增强了游戏的挑战性,更能激发玩家对游戏的兴趣,可见随机函数在游戏软件设计中有着及其重要的作用。