背包模块的设计

日常任务模块, 武器排行榜, 战术, 英雄战斗力, 活动模块

Posted by chensong on 2018-12-24 03::23::51

前言

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

正文

思维导图

一, 功能分类

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. 武器分解

二, 客户端的信息设置

1, 显示根据物品的类型

三, 服务器的数据结构的设置

背包的模块的数据玩家查询的次数是最多的, 在服务器的效率首选 红黑树结构, 使用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是一个大结构体,这会导致搜索时的内存频繁被交换出去,而导致效率低下, 所以我们使用指针类型

四, 背包模块 一些异常的处理方案

  1. 背包个数的上线

结语

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