游戲中的常見概率設計分析

前言

????????游戲中的概率真的是讓人又愛又恨,很多玩家因為自己的屌絲氣質(白嫖)而棄坑玩不下去的,比如人盡皆知的某陰陽師,除了氪金,還肝,而且如果你的臉真的非常的黑,那也是打不過那些0氪金的歐洲人的。

????????而在游戲中被吐槽的最多的就是概率問題,我們一遍一遍的刷副本,BOSS,就是為了湊齊一整套裝備,因為BOSS掉落是隨機的,我們也不知道什么時候能夠湊齊;為了獲得某個角色,連續的抽卡,期待歐皇的附身,但是結果是無法確定的。這就是游戲的魅力,有隨機性,有變數,有期望,有運氣。

游戲中常見的4種概率設計

1、常規做法,直接配置概率,程序直接判定

2、在1的基礎上,加個保底次數,當連續不發生的次數高于保底時,強制發生

3、設置基礎概率,事件不發生概率翻倍

4、設置數組,將事件發生概率變成數組元素

獨立隨機算法

????????每個怪物都會攜帶一些游戲道具(裝備,寶石,金幣,道具,任務物品等),被擊敗后,會根據概率隨機掉落。至于掉落的游戲道具是不是你想要的,就要看你的運氣了。

在游戲中:如果某個BOSS掉落某件極品裝備的概率是5%,那么就是每次BOSS被擊殺后,由系統隨機在1—100中生成一個數字,如果這個數字小于等于5,那么就會掉落該裝備,否則就不會掉落。這是獨立概率,每次的概率都是一樣的,不會變化。

但是概率其實是不可靠的,同樣的概率,有的人可能打1,2次就掉落了,有的人可能打30次才會掉落。這也是沒辦法的事情,真隨機就是這樣的。所以,在早期的網絡游戲中,如果你想獲得某個游戲道具,多花時間就好,打的次數多了,肯定就容易獲得你想要的道具。

沒錢的玩家可以多花時間,打裝備賣給有錢的玩家,以換取點卡。大家各取所需。這是早期游戲設計所決定的。那個時代,除了點卡消費,在游戲中,大家都是公平的。

開箱子or大轉盤

????當游戲進入免費時代,游戲設計者為了能夠賺到錢,就開始賣屬性。但是不能直接賣,要間接的賣,賣的巧妙,最好還能多賺錢。于是轉盤這種設計就出來了,不是賣裝備 ,是抽獎,能不能抽到看運氣。每個方格里有不同的道具,有普通道具,也有中級道具,更有高級道具。

看起來每個格子(轉盤)設計的大小,概率都一樣,其實不是這樣的,這只是看起來一樣,具有視角欺騙性,最終還是按概率來。可能高級道具的概率連1%都不到,要不停的轉才有可能得到,其實就是一個簡單版的打怪掉落程序,只不過不需要打怪,花錢就直接按概率掉落。


不過這種把戲后來慢慢被看穿了。于是,開箱子的方式改進了一下,就是已經抽到的道具不再參與轉盤。相當于每獲得一個格子中的道具,就減少一個道具,所有剩下的道具概率重新計算,每個道具的獲得概率提升了。
但是,你想獲得高級道具,仍然是要花大量的錢。

抽卡保底算法

????????當卡牌游戲開始流行后,抽卡這種模式就越來越受到大眾歡迎。抽卡就成了免費游戲的主要收入來源。簡單直接,而且隱秘。簡單是因為,只要點擊一次,就會從牌庫中,隨機獲得一張卡牌。隱秘是因為,牌庫是比轉盤還要復雜隱秘的,里面有太多道具,除了基本抽取的概率,內部每個道具的概率也是不一樣的。所以,需要不停的抽卡,因為牌庫太大,抽卡完全是看臉。


如果概率無法控制,其實對玩家是不太友好的。于是大部分的抽卡游戲都增加了保底功能,抽10次必得。就是為了防止連續抽多次也抽不出來的情況。還有一部分,采用幸運值累積的方法,每次抽卡如果沒中,就會累積幸運值,幸運值越高,就越容易獲得想要的道具,其實也是變相的提高概率。
這種其實是偽隨機。

那么什么是保底設計?保底設計準確來說是為運氣不好的人提供的一種保障,能夠獲得自己想要的卡牌。

設計保底的方案有多種,這里說下三種方案:

1.固定或浮動數值保底。這種方案在于你需要預先給對應保底的卡牌進行定價,比如價值1000 RMB,那么當玩家抽卡次數達到一定值N時(這里假設每次十連抽價格為188 RMB,N約為60,注意:卡牌定價≈N*抽卡價格 就可以),如果依舊沒有獲得保底卡牌,則必然會獲得一張,一旦玩家獲得保底卡牌后,N重置為0,重新開始計數。

這種方案比較簡單,N可以為固定數值也可以為一定的浮動值,這種方案主要為運氣不好的人服務,擋不住歐皇。

2.不重置抽卡。這種方案在于每個玩家抽卡前先將卡池設計好,比如卡池生成了1000張卡牌,900張R卡,90張SR卡,10張SSR卡。玩家每次抽卡都是從這個卡池中取卡,取出的卡牌不再加入這個卡池,直到玩家將這1000張卡牌全部抽完。再重新生成1000張卡牌,再次進行這個循環。

理論上來說,這種方案是最公平,所有玩家在抽完卡池后,獲得卡牌都是一樣的。但是這種方案在于大多數玩家抽不空卡池,更大的弊端在于一旦增加新卡進入卡池,這個卡池就要變換,導致達不到保底的效果。

3.浮動概率。這種方案有點類似于PRD算法。這種抽卡的機制在于每次抽完卡后調整所有卡牌的比例,讓單人整體抽卡的感覺更趨近與高斯分布,但是收斂的方式會更快,從而讓最終的結果接近于期望。

這種方案相對來說比較復雜,目前也只見過極少數項目用過,需要大量的數學公式,個人對這塊研究不深,就不展開了。

其實,我們看到在抽卡的概率上面設計者并沒有做太多的隱藏設計,但是為什么玩家怎認為是設計有缺陷,甚至調侃到玄學上面去呢?

我認為是基于兩方面,一方面是因為幸存者偏差,很多玩家更多將注意力放在抽到卡牌的玩家,而對于沒有抽到玩家沒有關注(全服通告也只會告知玩家誰抽到好卡,而不會告知多少玩家沒有抽到)。另外一方面在于抽卡的概率在大量玩家的基數上是平均的,但是對于單個玩家的概率并非平均。

從個人體驗設計來說,個人認為保底是必須,哪怕會打破真實概率,因為比起獲得卡牌的成功體驗,失敗的體驗設計對玩家來說是非常糟糕。甚至有些大R玩家直接會打電話給客服,寧愿花錢去購買卡牌,而不是讓自己一次次體驗失敗。

洗牌算法

洗牌算法最典型的應用莫過于音樂播放器的隨機播放。

在最早期的時候,播放器的隨機播放就是采用的真隨機,但是用戶很快就發現,經常會遇到接連播放同一首歌,或者連續多次在幾首歌之間來回切換,而另外某些歌曲幾百次也放不到。為了解決這個問題,播放器就把真隨機改為了洗牌算法。

所謂的洗牌算法就是:如果你的歌單有20首歌,就建立一個1到20的數組,再把這20個數字像洗牌一樣洗成亂序。
在洗完之后,如果第一個數字是n,第一次就播放歌單里的第n首歌。以此類推。

組合隨機算法

所謂的組合隨機,典型的應用就是在抽獎的時候進行兩次判斷:

一次不隨機:根據預設好的確定數組,給予玩家對應的chest。

這一次主要是用于確定獎品品質。

一次真隨機:從選中的chest中隨機抽取一件物品給玩家。

這一次就是從對應品質的獎品堆中隨機獲取一件物品。

最典型的例子就是《我叫MT》的手游。

在這個游戲里,你第幾次抽獎能中紫卡是完全確定的,但是你具體抽到哪一張紫卡則是隨機的。

在游戲中一般會用到真隨機和偽隨機兩種方式。

可以說,真隨機是一種自然的隨機機制,用代碼來實現也非常容易,只需要用一個隨機數與一個常量進行比較,根據大于小于等于分別觸發不同的結果就行了。

而偽隨機則是人為創造出來的一種機制,他需要程序員寫下更多的代碼,也需要數值設計者做更多的計算。

那么,既然偽隨機費時費力,還反自然,為什么在應用領域還要引入各種偽隨機的算法呢?

其目的就在于——讓用戶得到更好的體驗。
真隨機,就是原始時代的怪物掉落,掉不掉全看運氣。每次概率都是一模一樣。

偽隨機就是,如果該玩家第10次還未掉落該道具,則系統會強制必掉該道具。同時在獲得該道具后,概率又恢復初始。還有一種做法,就是每次沒有獲得該道具,概率就增加,到第10次,概率是100%,必得。

概率是為了增加游戲的樂趣和期望,但是概率是不可控的。為了降低概率不可控所帶來的挫敗感,在游戲中,都增加了一些機制,來讓概率的設計符合預期。

早期的游戲,概率只是游戲樂趣的一部分。而現在,概率成了游戲設計者賺錢的一種主要方式,說不上算好還是壞。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444232.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444232.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444232.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個通用游戲后臺的設計模式實踐總結

搞業務開發的時候,發現有一些代碼的開發會讓人感覺非常簡便舒服,有一些代碼的開發卻有時候會讓人感覺心智負擔比較大。逐步總結的過程中,發現讓開發人員寫起來感覺舒服的代碼,大概率是因為當前模塊與其他模塊代碼耦合度低&#xf…

leetcode103. 二叉樹的鋸齒形層次遍歷

給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。 例如: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 …

大型游戲后臺實踐淺談

國家新聞出版署8月30日下發切實防止未成年人沉迷網絡游戲的通知,要求從今天(9月1日)起,所有網絡游戲企業僅可在周五、周六、周日和法定節假日每日20時至21時向未成年人提供1小時服務,其他時間均不得以任何形式向未成年人提供網絡游戲服務。通知發布后,各大游戲廠商火速回…

如何使用弱網環境來驗證游戲中的一些延遲問題

關于弱網 在當今移動互聯網盛行的時代,網絡的形態除了有線連接,還2G/3G/Edge/4G/Wifi等多種手機網絡連接方式。不同的協議、不同的制式、不同的速率,使移動應用運行的場景更加豐富。 從測試角度來說,需要額外關注的場景就遠不止斷網、網絡故障等情況了。對于弱網的數據定義…

使用nginx分片功能提升緩存效率,支持可拖拽式播放視頻

Nginx的slice模塊可以將一個請求分解成多個子請求,每個子請求返回響應內容的一個片段,讓大文件的緩存更有效率。 HTTP Range請求 HTTP客戶端下載文件時,如果發生了網絡中斷,必須重新向服務器發起HTTP請求,這時客戶端已經有了文件的一部分,只需要請求剩余的內容,而不需要…

Nginx 配置TCP和UDP負載均衡

前言 Nginx除了以前常用的HTTP負載均衡外,Nginx增加基于TCP協議實現的負載均衡方法。 HTTP負載均衡,也就是我們通常所有“七層負載均衡”,工作在第七層“應用層”。而TCP負載均衡,就是我們通常所說的“四層負載均衡”,工作在“網絡層”和“傳輸層”。例如,…

leetcode116. 填充每個節點的下一個右側節點指針

116. 填充每個節點的下一個右側節點指針 難度中等128 給定一個完美二叉樹,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每個 next 指針&am…

你的代碼是否按照高內聚、低耦合的原則來設計的?

我們一直強調軟件開發中要按照高內聚、低耦合的設計原則來做代碼結構設計。c語言和c++不同,c語言面向過程、c++面向對象。 真正的項目中,要對業務升級,原來的業務函數需要保留,要保證老的功能繼續維持,不能直接刪除,這時候c語言面向過程,通常使用回調的方法。c+…

leetcode117. 填充每個節點的下一個右側節點指針 II

給定一個二叉樹 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指針設置為 NULL。 初始狀態下,所有 next 指針都被…

你擔心大家會濫用的全局變量,大家(包括你自己)一定會濫用

前言 不要使用全局變量的道理大家都懂,基本上在大家學習編程過程中很早就會被教育到,但是有時候我們也會禁不住誘惑用到一些似非實是的全局變量,只不過這些全局變量會穿上馬甲,讓你不會一下看穿它的巨大危害,濫用全局變量會引申帶來其它更為嚴重的結構性系統問題。…

Android Studio下載安裝教程及開發環境搭建

Android Stuio是本次Google io的一大亮點啊,一大早起來就趕緊下載來玩玩了。。。 如果你不幸被墻了,可以去這個帖子下載,我已經上傳到百度盤里面了。 [Android利器]Android Studio下載地址來啰 。。http://www.eoeandroid.com/thread-275380-…

leetcode124. 二叉樹中的最大路徑和

難度困難314 給定一個非空二叉樹,返回其最大路徑和。 本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。 示例 1: 輸入: [1,2,3]1/ \2 3輸出: 6示例 2: 輸入: …

深入剖析阻塞式socket的timeout

前言 網絡編程中超時時間是一個重要但又容易被忽略的問題,對其的設置需要仔細斟酌。 本文討論的是socket設置為阻塞模式,如果socket處于阻塞模式運行時,就需要考慮處理socket操作超時的問題。 所謂阻塞模式,是指其完成指定的操作之前阻塞當前的進程或線程,直到操作…

leetcode165. 比較版本號 超級重要的細節

比較兩個版本號 version1 和 version2。 如果 version1 > version2 返回 1&#xff0c;如果 version1 < version2 返回 -1&#xff0c; 除此之外返回 0。 你可以假設版本字符串非空&#xff0c;并且只包含數字和 . 字符。 . 字符不代表小數點&#xff0c;而是用于分隔數…

游戲服務器緩存系統如何設計

前言 不管是在業界開源領域,還是內部分享中,很少會有專門針對游戲業務特征進行專門設計的組件、類庫或者框架。我們從游戲的客戶端方面來看,一款專業的游戲客戶端引擎,已經是游戲開發的標配,flash,Cocos,Unity,Unreal等,但是服務器端,我們幾乎找不到同樣重量級的產品…

leetcode574. 當選者(SQL)

表: Candidate -------------- | id | Name | -------------- | 1 | A | | 2 | B | | 3 | C | | 4 | D | | 5 | E | -------------- 表: Vote ------------------- | id | CandidateId | ------------------- | 1 | 2…

使用KCP 加速游戲消息,讓全球玩家流暢聯網

定義 kcp協議是傳輸層的一個具有可靠性的傳輸層ARQ協議。 它的設計是為了解決在網絡擁堵情況下tcp協議的網絡速度慢的問題。 kcp力求在保證可靠性的情況下提高傳輸速度。 kcp協議的關注點主要在控制數據的可靠性和提高傳輸速度上面,因此kcp沒有規定下層傳輸協議,一般用udp作為…

leetcode584. 尋找用戶推薦人(SQL)

給定表 customer &#xff0c;里面保存了所有客戶信息和他們的推薦人。 ----------------------- | id | name | referee_id| ----------------------- | 1 | Will | NULL | | 2 | Jane | NULL | | 3 | Alex | 2 | | 4 | Bill | NULL | …

剖析KCP以及KCP在游戲中是如何使用的

親愛的各位讀者你們好,由于前段時間忙于部分項目的重構和優化,未能及時更新文章,不少讀者催更,哈哈,我還是很開心能抽出時間給大家再來分享下kcp的相關技術內幕,以及之前完善自己的網絡庫增加了KCP的客戶端服務器收發支持(結尾會分享封裝的客戶端服務器C++源碼)。 KCP概…

leetcode585. 2016年的投資(SQL)

寫一個查詢語句&#xff0c;將 2016 年 (TIV_2016) 所有成功投資的金額加起來&#xff0c;保留 2 位小數。 對于一個投保人&#xff0c;他在 2016 年成功投資的條件是&#xff1a; 他在 2015 年的投保額 (TIV_2015) 至少跟一個其他投保人在 2015 年的投保額相同。 他所在的城…