狐思亂想企劃筆記【09】亂數、排表以及加入權重值的隨機亂數

在設計遊戲的時候,經常會使用到各式各樣的亂數。特別是在遊戲中,如果我們想要做每日任務的話,常見的作法就是製作許多的任務,然後透過一個亂數的機制每天隨機挑選幾個出來,這樣玩家每天上線時就會面對不同的任務。

不過呢,所謂的亂數,在取樣很少的狀況下經常會給人不是那麼亂的感覺。舉個簡單的例子來說,拿一個六面的骰子擲六次,通常不會那麼巧的六個數字各出現一次,而且偶而還會發生某個數字在短暫的期間出現的頻率特別高的現象。雖然說放大取樣的次數就可以得到差不多每個數字出現的機率是差不多1/6的這個結論,不過這個放大的取樣通常要大到非常大,才能夠達到平均出現的結果。

同樣的,我們在製作每日任務的時候,如果將每天出現那些任務的工作完全交給亂數來決定,那麼也很有可能會出現某個任務在某段期間出現的頻率非常高的這個現象。這樣的現象,如果發生在某些玩家特別想要解某個隨機出現的每日任務而它又總是不出現的時候,那麼就會給玩家一種「為什麼每日任務就是故意不出我想解的那個任務」的感覺。這種感覺如果頻繁的發生,給玩家的觀感就不會太好。

就讓銀狐拿最近剛好有在玩的《魔獸世界 (World of Warcraft)》來舉例好了。在這個版本的《魔獸世界》中,有個名叫「特使任務」的東西。在大地圖上有許多的世界任務,分別屬於不同的陣營。隨著資料片開放到現在,會輪替的陣營共有九個。每一天系統會從這張資料片的所有陣營中隨機挑選一個陣營作為當天的特使任務,玩家在三天內完成該陣營的世界任務,就可以獲得額外的獎勵。不過玩一段時間之後,玩家就會發現幾個陣營的特使任務出現頻率似乎不是很平均,有時某些陣營會頻繁的出現。

像是這種由系統從幾個固定的選項中隨機挑選一個的機制,在很多的遊戲中都可以看得到。在很多遊戲中的每日任務,也都是類似的機制。通常,當我們在要設計這樣的機制時,最常想到的作法就是亂數以及排表。以下就先針對這兩種作法來說明:

亂數

用亂數來決定每天要出現那個特使任務,是大多數遊戲最常用的方式。遊戲內就直接建立一個陣營的列表(以《魔獸世界》這個版本來說就是九個陣營),然後每天讓系統從這個列表中隨機挑選一個出來。這樣的作法最簡單,不過它很容易發生前面文章中銀狐所提到的某些陣營出現得很頻繁,給玩家不好的感覺的狀況。因為當你把這一切都丟給亂數時,就很難控制實際上會出現什麼狀況。

排表

排表,則是另外一個常見的作法。建立一個列表,將每天要出現的陣營一一列在上面,然後系統就依這個列表上的順序,每天把輪到的陣營挑出來。偷懶一點的作法,就是有幾個陣營需要輪替,這個列表就只有這幾個項目。然後當列表用到最後項時,下一天就再從第一項開始。

如果覺得這樣太過單調,玩家一下子就會摸出它的順序,那麼就把表建得大一點,遊戲中有九個陣營需要隨機就建個九的倍數的列表,然後表中隨機排列,控制一下讓每個陣營出現的數量相同,就可以解決亂數時不好控制平均出現的問題。當然,表建得再大,還是有可能會被玩家抓出規律的,就失去了隨機的感覺。

像是之前Ubisoft的《全境封鎖 (Tom Clancy’s : The Division)》中的每日任務,則是採用了更笨的方式。遊戲中的每日任務是由製作人員人工填表的,隨著遊戲的營運持續的依據日期填寫對應的每日任務。這種作法容易出錯,而且又持續需要人力去不斷的維護。結果在每日任務推出的初期,果然出了許多問題。(當時銀狐有寫一篇「在遊戲中製作每日隨機任務」的文章來分析該遊戲每日任務為什麼出這麼多問題)

加入權重值的隨機亂數

那麼,如果我們不想要採用排表的笨方法,又不希望全交給亂數出現的不良狀況時,有什麼解決方案呢。就銀狐個人的經驗,我會選擇使用亂數加上權重值的作法。所謂的權重值,就是在要被亂數挑選的項目後方加上一個數值,每個項目出現的機率則是這個數值除以所有項目的數值總值。當某個項目被亂數挑選出來之後,其他項目後方的數值就會增加,這樣讓它下一次出現的機率就會降低。

舉例來說,九個陣營一開始後面的數值都是1,這樣每個陣營出現的機率就是1/9。當某個陣營第一天被亂數挑中之後,它後面的數值維持1不變,同時其餘的陣營後方的數值則是+1,這樣再下一次亂數挑選時,前一天被挑中的那個陣營出現的機率就會變成1/17;其餘的八個陣營各別的機率則是2/17,在這樣的狀況下,前一天被挑中的那個陣營雖然還是有機率被挑中,不過機率相對低很多。然後第二天被挑中的那個陣營後面的數值降回1,就這樣持續下去。如果有一個陣營一直沒有被挑中,那麼它的數值就會持續的增加,它在隔天被挑中的機率就會越來越高。

採用這樣的作法,某個程度還是隨機,但是每個項目出現的機率則會因為它有沒有出現過而不斷的變動,因此玩家想要抓出各陣營出現的機率就不是那麼容易,就可以達到我們想要隨機,但又不想隨機得無法控制的狀況。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *