多人游戏中,奖励的分配也是很重要的设计。设计
例如多我的对一个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,这样,经过简单的代码就够就能论功行赏了。虽然抢人头貌似好玩刺激一些,可是公平的战斗奖励也不失为激励玩家进行游戏的方案。并且在代码实现上也并非多么困难的事情。
补充:方案被鄙视了,说正是由于不公平和随机性才刺激,抢人头简单暴力拉仇恨,更能刺激玩家消费!好吧,我持保留意见
话说回来,生活中到处不公平,即便游戏也是这样,最后以麻花藤的名言结束:没钱玩个几把。