文章中的标题是“游戏中的随机--转换思维”,有一个关键词是“随机”;但是随机这个说法过于笼统,因此我主要说一个具体化实例:随机坐标。
随机坐标在游戏中相当常见,例如掉落、怪物生成、采集生成或者是一些活动中的藏宝地点。
随机出一个坐标不难。
那随机出一个不重复的坐标呢?其实也不难!
还能好好说话吗?
就是要讲述如何做出一个高效及简洁的随机坐标模块!
我知道相当一部分人设计随机坐标模块的思想如下:
A、就是从一个大箩筐中,抽乒乓球,每抽出一个乒乓球,只记录其编号,乒乓球不拿出箩筐,继续抽取;
如果发现抽出的乒乓球,已经抽取过,则不记录,继续抽取。
这种做法的最大缺点是:抽取的乒乓球越多,效率越低下。抽取一个乒乓球的效率这种做法无疑是最高的,因为不可能出现重复。
B、可能你看到我在A中的语言暗示,已经想到我要说什么了。就是多放置一个箩筐,从箩筐1抽取出来的乒乓球,放进箩筐2;箩筐1没有了乒乓球,再到箩筐2抽取。
这种做法的的优点是:每次抽取不需要检查这个乒乓球是否已经抽取过。缺点是:需要多浪费一个箩筐资源。这是一种用空间换时间的做法。
看到这里,我要说一下,上面的两种做的一个关键字是:抽。用计算机的专业术语来说就是:rand;
在开始讲高效及简洁的方法C时,我先讲一个小例子,那就是打扑克牌。
我们打扑克的时候,我们是采取摇骰抽牌的形式,将各张牌分发到各个玩家手中吗?明显不是。
实际上我们是将牌直接按顺序分发到各个玩家手中,但是我们依然认为这些牌是随机。原因是在发牌之前我们已经洗好了牌。
我们不采取摇骰抽牌,因为很明显这是一种效率低下的做法。
同理,方法C就是采用这种思想。方法C中,将槽替换成箩筐,成为乒乓球的容器。
C、在取出乒乓球之前,将乒乓球乱序放进槽中。在槽的一端取出乒乓球,在另一端再放回这个已经被记录下的乒乓。如果有必要,可以再打乱槽中的乒乓球顺序。
这种做法的的优点是:只需要做一次的统一随机,之后使用时,不用再抽取,直接按顺序获取。
从总体上讲:对比前两种方法,这是一种高效及简洁的方法。
至此,游戏中的随机已经讲完,转换思维也蕴含在上述的讲解中。其实这篇文章的重点是在“转换思维”,我们可以不知道所有用到转换的实例,但是需要时刻保持转换思考。
退一步,海阔天空。