多人遊戲中,獎勵的分配也是很重要的設計。設計
例如多我的對一個NPC進行攻擊,NPC被幹死的時候,會給每一個參與攻擊的玩家一些獎勵。會顯示擊殺,助攻等等。排序
好了,問題來了,怎麼計算功勞呢?隊列
通常的設計是,最後一刀爲勝利者,獎勵最大。參與攻擊的,都是助攻。遊戲
然而這個設計並不公平,例如「搶人頭」,就是一個玩家使出吃奶的勁打了半天,眼看就要手到擒來,忽然殺出來個咬金,一刀結束了最後的戰鬥。get
辛辛苦苦卻得了個助攻的名頭。ast
並且多人助攻的狀況下,一概給予相同的獎勵,有失公平。List
公平的作法是,經過計算玩家對NPC攻擊的總次數和總傷害來給予獎勵。遍歷
由於不一樣玩家的屬性攻擊力等不一樣,攻擊次數並不等於攻擊的傷害。設計攻擊次數,是爲了「有苦勞」的玩家給予相應的獎勵。統計
這是設計上的思路,接下來是實現方案。這個很簡單了,我稱之爲,冤有頭,債有主。數據
以被攻擊的NPC爲單位,每受一次傷害,記錄攻擊者,次數,以及傷害值,使用隊列保存數據。當此NPC死亡時,開始統計參與擊殺此NPC的人員。
若是計算頭功?頭功,即最後一刀,經過隊列排序,方式很簡單,只須要把最後的攻擊者放在隊列末尾便可。最後的攻擊者即爲頭功。
如何統計輔助者?遍歷隊列。
如何論功行賞?經過計算傷害值排序,傷害值相同的,按攻擊次數排序。
僞代碼以下:
結構體:
Person{ count , damage,att}
NPC{List< Person >}
Void Attack(){
Person.count++;
Person.damage+=person.att;
If(!List.cons(person)){
List.add(person);
}
Sort(List);
}
Void getBigRew(){
Return List.GetLast();
}
Void CountReward(){
//按攻擊次數和傷害值排序
List.SortIf(person.cout);
List.SortIf(person.damage);
}
Void GetPersons(){
Return List;
}
OK,這樣,經過簡單的代碼就夠就能論功行賞了。雖然搶人頭貌似好玩刺激一些,可是公平的戰鬥獎勵也不失爲激勵玩家進行遊戲的方案。並且在代碼實現上也並非多麼困難的事情。
補充:方案被鄙視了,說正是由於不公平和隨機性才刺激,搶人頭簡單暴力拉仇恨,更能刺激玩家消費!好吧,我持保留意見
話說回來,生活中到處不公平,即便遊戲也是這樣,最後以麻花藤的名言結束:沒錢玩個幾把。