背包模块的设计(日常任务模块, 武器排行榜, 战术, 英雄战斗力, 活动模块)

前言

游戏中背包模块设置关系到游戏整体设置, 一个背包模块设置好的 可以给玩家好体验, 在玩家可以清楚知道自己的物品的数据, 选择什么样的成长方式

正文

思维导图

一, 功能分类

1, 英雄的战斗力的计算
2, 日常任务模块
3, 排行榜
①, 武器排行榜
4, 物品的分类
①, 大的类别
  1. 消耗品
  2. 碎片 .合成材料
  3. 杂项
  4. 武器
  5. 情报
  6. 工具
  7. 芯片
②, 子的类别
  1. 体力
  2. 主角经验书
  3. 英雄经验书
  4. 宝箱
  5. 生命药剂
  6. 疲劳药剂
  7. BUFF药剂
  8. 钥匙串
5, 物品管理类的接口定义
①, 服务器使用的接口
  1. 增加物品
  2. 删除物品
  3. 分离物品
②, 客户端的接口定义
  1. 使用物品
  2. 打开宝箱
  3. 碎片合成
  4. 销售物品
  5. 武器强化
  6. 武器改造
  7. 武器分解

二, 数据结构的设置

背包的模块的数据玩家查询的次数是最多的, 在服务器的效率首选 红黑树结构, 使用std::map结构是平衡二叉树查询的效率

key-value形式, 服务器端自动生成一个key 的int类型, value使用指针类型

查看源码 find方法

iterator find(const key_type& _Keyval)
{	// find an element in mutable sequence that matches _Keyval
iterator _Where = lower_bound(_Keyval);
return (_Where == end()
	|| _DEBUG_LT_PRED(this->_Getcomp(),
		_Keyval, this->_Key(_Where._Mynode()))
			? end() : _Where);
}

const_iterator find(const key_type& _Keyval) const
{	// find an element in nonmutable sequence that matches _Keyval
const_iterator _Where = lower_bound(_Keyval);
return (_Where == end()
	|| _DEBUG_LT_PRED(this->_Getcomp(),
		_Keyval, this->_Key(_Where._Mynode()))
			? end() : _Where);
}
1, key

lower_bound方法lower_bound 返回一个迭代器,指向第一个“不小于”给定值的元素 (公开成员函数) [编辑]

iterator lower_bound(const key_type& _Keyval)
{	// find leftmost node not less than _Keyval in mutable tree
return (iterator(_Lbound(_Keyval), &this->_Get_data()));
}

const_iterator lower_bound(const key_type& _Keyval) const
{	// find leftmost node not less than _Keyval in nonmutable tree
return (const_iterator(_Lbound(_Keyval), &this->_Get_data()));
}

调用_Lbound方法

// 声明
typedef typename _Alloc_types::_Node _Node;
typedef typename _Alloc_types::_Nodeptr _Nodeptr;
// ----

template<class _Other>
_Nodeptr _Lbound(const _Other& _Keyval) const
{	// find leftmost node not less than _Keyval
_Nodeptr _Pnode = _Root();
_Nodeptr _Wherenode = this->_Myhead();	// end() if search fails

while (!this->_Isnil(_Pnode))
	if (_Compare(this->_Key(_Pnode), _Keyval))
		_Pnode = this->_Right(_Pnode);	// descend right subtree
	else
		{	// _Pnode not less than _Keyval, remember it
		_Wherenode = _Pnode;
		_Pnode = this->_Left(_Pnode);	// descend left subtree
		}

return (_Wherenode);	// return best remembered candidate
}

这个没有什么说的

2, value

返回一个迭代器再查看const_iterator类型

你会发现在xtree模块中有这两个声明

typedef _Tree_comp_alloc<_Traits> _Mybase;
typedef typename _Mybase::const_iterator const_iterator;
typename _Mybase::iterator>::type iterator;

在查找一下_Tree_comp_alloc基类中有两个声明

typedef _Tree_const_iterator<_Tree_val<_Val_types> > const_iterator;
typedef _Tree_iterator<_Tree_val<_Val_types> > iterator;

value是一个大结构体,这会导致搜索时的内存频繁被交换出去,而导致效率低下, 所以我们使用指针类型

结语

不同游戏有着不同背包设置理念, 但只有一个目的就是适应玩家习惯。

个人博客地址:https://chensongpoixs.github.io

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我来为你解答这个问题。 01背包问题是动态规划中比较经典的问题,其主要目的是在给定物品的重量和价值以及背包的容量的情况下,找到一种最优的装包方式,使得背包能够装下的最大价值最大化。 以下是01背包问题的实验步骤: 1. 确定物品列背包容量 2. 根据物品列背包容量创建一个二维数组 3. 初始化二维数组,将第一行和第一列都赋值为0 4. 依次遍历物品列,计算每个物品放入背包和不放入背包时的最大价值,填充二维数组 5. 根据填充后的二维数组,得到最大价值 6. 根据填充后的二维数组,反向推导出最优的装包方式 算法原理: 01背包问题的核心思想是动态规划,即将问题划分为若干个子问题,通过将子问题的解组合起来得到原问题的解。具体地,我们用dp[i][j]示前i个物品放入容量为j的背包中所获得的最大价值。那么,01背包问题的状态转移方程为: dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]) 其中,w[i]示第i个物品的重量,v[i]示第i个物品的价值。 测试数据: 测试数据可以包括以下几个方面: 1. 物品的数量和重量、价值的范围 2. 背包的容量和承重范围 3. 物品的重量和价值是否有负数 4. 多组数据测试,包括边界值和一般情况 程序主要流程: 1. 输入物品列背包容量 2. 创建二维数组并初始化 3. 依次遍历物品列,填充二维数组 4. 根据二维数组得到最大价值 5. 根据二维数组反向推导出最优的装包方式 6. 输出最大价值和装包方式 主要模块功能: 1. 输入模块:负责输入物品列背包容量 2. 初始化模块:负责创建二维数组并初始化 3. 填充模块:负责依次遍历物品列,计算最大价值并填充二维数组 4. 最大价值模块:负责根据二维数组得到最大价值 5. 装包方式模块:负责根据二维数组反向推导出最优的装包方式 6. 输出模块:负责输出最大价值和装包方式 数据结构设计: 在01背包问题中,我们需要使用一个二维数组dp来记录每个子问题的最优解。具体地,dp[i][j]示前i个物品放入容量为j的背包中所获得的最大价值。 算法时间复杂度: 01背包问题的时间复杂度为O(N*C),其中N示物品的数量,C背包的容量。由于需要遍历整个物品列,因此时间复杂度与物品的数量成正比;同时,由于需要计算每个子问题的最优解,因此时间复杂度与背包的容量成正比。因此,算法的时间复杂度为O(N*C)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值