博客主页:https://xiaoy.blog.csdn.net
本文由 呆呆敲代码的小Y 原创
学习专栏推荐:Unity系统学习专栏
游戏制作专栏推荐:游戏制作
Unity实战100例专栏推荐:Unity 实战100例 教程
欢迎点赞 收藏 ⭐留言 如有错误敬请指正!
未来很长,值得我们全力奔赴更美好的生活✨
------------------❤️分割线❤️-------------------------
概率
在游戏中可以说是最玄学的东西了,只要涉及到游戏,基本上就跟概率是离不开关系的。游戏中常见的4种概率设计
每个怪物都会携带一些游戏道具(装备,宝石,金币,道具,任务物品等),被击败后,会根据概率随机掉落。至于掉落的游戏道具是不是你想要的,就要看你的运气了。
在游戏中:如果某个BOSS掉落某件极品装备的概率是5%,那么就是每次BOSS被击杀后,由系统随机在1—100中生成一个数字,如果这个数字小于等于5,那么就会掉落该装备,否则就不会掉落。这是独立概率,每次的概率都是一样的,不会变化。
但是概率其实是不可靠的,同样的概率,有的人可能打1,2次就掉落了,有的人可能打30次才会掉落。这也是没办法的事情,真随机就是这样的。所以,在早期的网络游戏中,如果你想获得某个游戏道具,多花时间就好,打的次数多了,肯定就容易获得你想要的道具。
没钱的玩家可以多花时间,打装备卖给有钱的玩家,以换取点卡。大家各取所需。这是早期游戏设计所决定的。那个时代,除了点卡消费,在游戏中,大家都是公平的。
最简单的代码执行方式就是直接使用APIRandom.Range(min,max)
随机两数之间的中间数,然后跟预订的值作对比即可。
当游戏进入免费时代,游戏设计者为了能够赚到钱,就开始卖属性。但是不能直接卖,要间接的卖,卖的巧妙,最好还能多赚钱。于是转盘这种设计就出来了,不是卖装备 ,是抽奖,能不能抽到看运气。每个方格里有不同的道具,有普通道具,也有中级道具,更有高级道具。
看起来每个格子(转盘)设计的大小,概率都一样,其实不是这样的,这只是看起来一样,具有视角欺骗性,最终还是按概率来。可能高级道具的概率连1%都不到,要不停的转才有可能得到,其实就是一个简单版的打怪掉落程序,只不过不需要打怪,花钱就直接按概率掉落。
不过这种把戏后来慢慢被看穿了。于是,开箱子的方式改进了一下,就是已经抽到的道具不再参与转盘。相当于每获得一个格子中的道具,就减少一个道具,所有剩下的道具概率重新计算,每个道具的获得概率提升了。
但是,你想获得高级道具,仍然是要花大量的钱。
当卡牌游戏开始流行后,抽卡这种模式就越来越受到大众欢迎。抽卡就成了免费游戏的主要收入来源。简单直接,而且隐秘。简单是因为,只要点击一次,就会从牌库中,随机获得一张卡牌。
隐秘是因为,牌库是比转盘还要复杂隐秘的,里面有太多道具,除了基本抽取的概率,内部每个道具的概率也是不一样的。所以,需要不停的抽卡,因为牌库太大,抽卡完全是看脸。
如果概率无法控制,其实对玩家是不太友好的。于是大部分的抽卡游戏都增加了保底功能,抽10次必得。就是为了防止连续抽多次也抽不出来的情况。
还有一部分,采用幸运值累积的方法,每次抽卡如果没中,就会累积幸运值,幸运值越高,就越容易获得想要的道具,其实也是变相的提高概率。
这种其实是伪随机。
那么什么是保底设计?保底设计准确来说是为运气不好的人提供的一种保障,能够获得自己想要的卡牌。
设计保底的方案有多种,这里说下三种方案:
这种方案相对来说比较复杂,目前也只见过极少数项目用过,需要大量的数学公式,个人对这块研究不深,就不展开了。
其实,我们看到在抽卡的概率上面设计者并没有做太多的隐藏设计,但是为什么玩家怎认为是设计有缺陷,甚至调侃到玄学上面去呢?
我认为是基于两方面,一方面是因为幸存者偏差,很多玩家更多将注意力放在抽到卡牌的玩家,而对于没有抽到玩家没有关注(全服通告也只会告知玩家谁抽到好卡,而不会告知多少玩家没有抽到)。另外一方面在于抽卡的概率在大量玩家的基数上是平均的,但是对于单个玩家的概率并非平均。
从个人体验设计来说,个人认为保底是必须,哪怕会打破真实概率,因为比起获得卡牌的成功体验,失败的体验设计对玩家来说是非常糟糕。甚至有些大R玩家直接会打电话给客服,宁愿花钱去购买卡牌,而不是让自己一次次体验失败。
对 10连抽卡保底模型 感兴趣的小伙伴可以参考下这篇文章:《10 连抽保底的概率模型》
洗牌算法 最典型的应用莫过于音乐播放器的随机播放。
在最早期的时候,播放器的随机播放就是采用的真随机,但是用户很快就发现,经常会遇到接连播放同一首歌,或者连续多次在几首歌之间来回切换,而另外某些歌曲几百次也放不到。为了解决这个问题,播放器就把真随机改为了洗牌算法。
所谓的洗牌算法就是:如果你的歌单有20首歌,就建立一个1到20的数组,再把这20个数字像洗牌一样洗成乱序。
在洗完之后,如果第一个数字是n,第一次就播放歌单里的第n首歌。以此类推。
简单代码方法如下,传入一个数组,打乱顺序即可。
public static void ShuffleFunc(ref List<int> nums)
{
// Random myRandom = new Random();
for (int i = 0; i < nums.Count; i++)
{
int temp = nums[i];
int randomIndex = Random.Range(0,nums.Count);
nums[i] = nums[randomIndex];
nums[randomIndex] = temp;
}
}
所谓的组合随机,典型的应用就是在抽奖的时候进行两次判断:
一次不随机:根据预设好的确定数组,给予玩家对应的chest。
这一次主要是用于确定奖品品质。
一次真随机:从选中的chest中随机抽取一件物品给玩家。
这一次就是从对应品质的奖品堆中随机获取一件物品。
比如在游戏里指定了接下来第多少抽必定是紫卡,那我们第几次抽奖能中紫卡是完全确定的,但是具体抽到哪一张紫卡则是随机的。
在游戏中一般会用到 真随机 和 伪随机 两种方式。
可以说,真随机是一种自然的随机机制,用代码来实现也非常容易,只需要用一个随机数与一个常量进行比较,根据大于小于等于分别触发不同的结果就行了。
而伪随机则是人为创造出来的一种机制,他需要程序员写下更多的代码,也需要数值设计者做更多的计算。
那么,既然伪随机费时费力,还反自然,为什么在应用领域还要引入各种伪随机的算法呢?
其目的就在于——让用户得到更好的体验。
真随机,就是原始时代的怪物掉落,掉不掉全看运气。每次概率都是一模一样。
伪随机就是,如果该玩家第10次还未掉落该道具,则系统会强制必掉该道具。同时在获得该道具后,概率又恢复初始。还有一种做法,就是每次没有获得该道具,概率就增加,到第10次,概率是100%,必得。
概率是为了增加游戏的乐趣和期望,但是概率是不可控的。为了降低概率不可控所带来的挫败感,在游戏中,都增加了一些机制,来让概率的设计符合预期。
早期的游戏,概率只是游戏乐趣的一部分。而现在,概率成了游戏设计者赚钱的一种主要方式,说不上算好还是坏。
参考文章:https://blog.csdn.net/pbymw8iwm/article/details/120052438