天津seo公司网站,海报设计网站免费,北京seo网站结构优化,网站要多少钱 优帮云介绍 一般来说系统前期#xff0c;发放奖励#xff0c;就简单的发放道具就可以#xff0c;基本上是#xff0c;遇到一个配置一个#xff0c;不同的系统可能配置的方法不一样#xff0c;每次活动更是加不同的配置。 经历里这些不同的需求#xff0c;我们需要设计一个系统…介绍 一般来说系统前期发放奖励就简单的发放道具就可以基本上是遇到一个配置一个不同的系统可能配置的方法不一样每次活动更是加不同的配置。 经历里这些不同的需求我们需要设计一个系统它可以统一的管理这些满足各种奖励需求。 配置
Reward
RewardIdGroupIds奖励id组列表 可以在导表中将Item表中的数据直接放入这里可以很方便的配置道具这里每个组必定产出一个物品 RewardGroup
GroupIdItemIdsGroupItemRuleIdsWeights组id道具id列表道具规则列表权重列表 ItemIds GroupItemRuleIds 两个列表一一对应每个ItemId 对应一个RuleId可以重复使用相同的RuleId RewardGroupItemRule
GroupItemRuleIdMinCountMaxCount道具规则id单次产出最小值单次产出最大值 每次产出的数量范围[MinCount, MaxCount], 具体结合业务一般需要结合 ItemOutputCount 才能推出实际可以产出的数量 ItemOutputCount
ItemIdUserGotMaxCountGlobalGotMaxCount道具id玩家历史产出总计最大数量全服历史产出总计最大数量 控制一些道具的产出实际情况下很少使用 ^ ^但是如果在表里配置了相关的itemId, 并且设置一个很大的数量值这个也可以作为道具的产出记录使用 功能点
全局产出控制
个人产出控制 每个Item 产出时必须先检查 ItemOutputCount 表中的 全服历史产出总计最大数量 - 玩家历史产出总计最大数量 如果产出已经到达上限则这个道具的产出为0 动态权重 根据配表 RewardGroup 中的 的 Weights 来计算, 具体算法如下每个道具有个数字来表示它的权重查看一些负载均衡算法的应该熟悉则这个这个算是最简单的分配算法了 int GetIndexByWeights(Listint weights)
{int sum 0;for(int i 0; i weights.Count; i){sum weights[i];}if(sum 0) return -1;// [0.0, 1.0)int roundWeight Random.Shared.Next(1, sum 1);sum 0;for(int i 0; i weights.Count; i){sum weights[i];if(sum roundWeight) return i;}return -1;
}// 根据规则修改权重
Listint CheckRestictedItemAndModifyWeight(Listuint itemIds, Listint weights)
{// 检查全局 道具产出限制// 检查个人 道具产出限制// 这里可能存在费时的操作根据具体业务处理
}(uint itemId, int count) GetOuputItemIdAndCountByWeigths(Listuint itemIds, Listint weights)
{Listint newWeights CheckRestictedItemAndModifyWeight(itemIds, weights);var index GetIndexByWeights(newWeights);var itemId itemIds[index];// 1.先根据 RewardGroupItemRule 计算产出数量// 2.结合 全局、个人产出限制计算产出数量return (itemId, count)
}奖励流程
ListRewardData GetReward(uint rewardId)
{// 根据配表获取产出道具// 解析产出道具一般来说这里会处理一些 道具分解、替换的流程// 真正的创建道具结合业务创建相关物品// 推送相关信息
} 总结 后期一般如果做了这个功能就会慢慢的替换直接添加Item的操作保证添加Item只有一个入口就是在奖励处