多人游戏中,奖励的分配也是很重要的设计。
例如多个人对一个NPC进行攻击,NPC被干死的时候,会给每个参与攻击的玩家一些奖励。会显示击杀,助攻等等。
好了,问题来了,怎么计算功劳呢?
一般的设计是,最后一刀为胜利者,奖励最大。参与攻击的,都是助攻。
然而这个设计并不公平,例如“抢人头”,就是一个玩家使出吃奶的劲打了半天,眼看就要手到擒来,突然杀出来个咬金,一刀结束了最后的战斗。
辛辛苦苦却得了个助攻的名头。
而且多人助攻的情况下,一律给予相同的奖励,有失公平。
公平的做法是,通过计算玩家对NPC攻击的总次数和总伤害来给予奖励。
因为不同玩家的属性攻击力等不同,攻击次数并不等于攻击的伤害。设计攻击次数,是为了“有苦劳”的玩家给予相应的奖励。
这是设计上的思路,接下来是实现方案。这个很简单了,我称之为,冤有头,债有主。
以被攻击的NPC为单位,每受一次伤害,记录攻击者,次数,以及伤害值,使用队列保存数据。当此NPC死亡时,开始统计参与击杀此NPC的人员。
如果计算头功?头功,即最后一刀,通过队列排序,方式很简单,只需要把最后的攻击者放在队列末尾即可。最后的攻击者即为头功。
如何统计辅助者?遍历队列。
如何论功行赏?通过计算伤害值排序,伤害值相同的,按攻击次数排序。
伪代码如下:
结构体:
Person{ count , damage,att}
NPC{List< Person >}
Void Attack(){
Person.count++;
Person.damage+=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,这样,通过简单的代码就够就能论功行赏了。虽然抢人头貌似好玩刺激一些,但是公平的战斗奖励也不失为激励玩家进行游戏的方案。而且在代码实现上也并不是多么困难的事情。