#include
using namespace std;
template
struct LinkNode
{
T data;
LinkNode
LinkNode( T item)
{
data=item;
link=NULL;
}
};
template
class List
{
public:
List()//构造函数
{
first=new LinkNode
first->link=first;//头尾相连,循环链表,用它可以让你数到最后一个人的时候,他的下一个人就是队伍的第一个家伙
}
List(T x)
{
first=new LinkNode
first->link=first;
}
List(List
~List(){}
void Insert(int i,T x);
T getHead(){return first->data;}
LinkNode
void xiuf(LinkNode
LinkNode
protected:
LinkNode
};
template
List
{
T value;
LinkNode
LinkNode
destptr->data=srcptr->data;
while(srcptr->link!=first)
{
value=srcptr->link->data;
destptr->link=new LinkNode
destptr=destptr->link;
srcptr=srcptr->link;
last=srcptr;
}
};
template
LinkNode
{
if(i<0)return NULL;
LinkNode
int k=1;
while(k
{
current=current->link;
k++;
if(current==first)return NULL;
}
return current;
};
template
void List
{
LinkNode
if(current==NULL)return;
LinkNode
if(newNode==NULL)//当前指针为空,未取到数据的值
{
cout<<"存储分配错误!"< exit(1); } newNode->link=current->link; current->link=newNode; }; template void Josephus(List { LinkNode int i,j; for(i=1;i<=n/2;i++)//要扔入水里的人,一共是n/2=15人 { if(m==1)//如果没次只扔序号为1那个家伙,按顺序把每次第一个人扔下去 { cout<<"出列的人是:"< pre=p->link; //这个用来让first指向当前first下一个家伙 Js.xiuf(p->link); delete p; p=pre; } else { //从当前位置开始数m个人,这个人是p,pre是p的前一个家伙 for(j=1;j { pre=p; p=p->link; } cout<<"出列的人是"< //让pre连接着p pre->link=p->link; //如果是第一个家伙就把first改成first的下一个 if(p==Js.getfirst())Js.xiuf(p->link); //if(p=Js.getlast())Js.movelast(pre); delete p; p=pre->link; } } } void main() { List int i,n,m; cout<<"输入游戏者的人数和报数间隔:"< cin>>n>>m; for(i=1;i { clist.Insert(i,i+1); } Josephus(clist,n,m); } 数据元素相互之间的关系称为结构。有四类基本结构:集合、线性结构、树形结构、图状结构; 集合结构:除了同属于一种类型外,别无其它关系 线性结构:元素之间存在一对一关系常见类型有:数组,链表,队列,栈,它们之间在操作上有所区别.例如:链表可在任意位置插入或删除元素,而队列在队尾插入元素,队头删除元素,栈只能在栈顶进行插 入,删除操作. 树形结构:元素之间存在一对多关系,常见类型有:树(有许多特例:二叉树、平衡二叉树、查找树等) 图形结构:元素之间存在多对多关系,图形结构中每个结点的前驱结点数和后续结点多个数可以任意 我前几个视频讲了tuple对hashmap的封装和定制,这是写通用数据结构的前奏。接下来的两个视频继续讲后续的设计,但是很多人还是不知道通用数据容器的设计架构。今天让我来和你谈谈。 数据容器类图 让我们一个一个地看容器接口对象。这是一般的容器结构。如下图所示: 数据容器对象 它包含几个接口,序列化和反序列化,用来封装对象的所有数据。为了将对象数据存储在数据库中,或者跨服务传输对象数据,需要对其进行序列化。当然,这里还有优化的空间。哪些数据需要保存,跨服时哪些数据需要带过来。我们可以标记它,筛选它。的内部实现是遍历数据区m_data中的所有元组数据,并调用elementInterface结构中的序列化和反序列化方法。以下接口是用于添加、搜索、删除和遍历数据集的接口。这里的方法只是对不同类型数据集的hashmap操作。在进行添加和删除操作时,数据更新模块会增加一个更新标记,更新模块会在每次心跳更新时将更新后的增量数据推送到客户端或其他模块。这里还关联了事件模块,会触发数据变更的相关事件。 我们来谈谈elementInterface组件。 元组数据收集类 这是最小的数据集单元,有数据访问和修改接口,包括前面提到的序列化和反序列化接口。同一组关联数据可以定义在一个数据集中,并且可以通过objectobject接口进行查找和删除。我们通过配置文件定义成员的相关类型、数据集的名称类型等其他属性,然后通过解析器直接生成代码文件。如果不用配置文件生成代码文件,我们也可以直接宏定义,但是这样会破坏数据的可读性,而且比较繁琐。更新模块和事件模块在这里也是相关联的。当数据发生变化时,会更新相关标记,触发相关事件。 数据集的定义如下: 设置元组定义 所有数据集的名称、id、成员类型和其他属性都在这里定义。而且,它是由配置文件生成的,每个数据集都有唯一的全局定义。 先说一下整个过程。玩家有一套基本的属性,比如血量,等级,名字。这时,我们可以在配置文件中定义一个数据集。集合的名字叫做basedata,有三个成员:hp,lv,name。它们对应的类型是int,int,string。这时候我们调用解析器,直接生成一个叫做basedata的元组模板类型,里面包含三种对应类型的数据。由elementInterface封装。然后生成一个elementDefine数据,它定义了该类型的所有静态信息。对了,定义了成员和这个类的枚举。 我们在程序中实例化一个玩家的object对象。然后添加一个basedata类型的数据接口,就可以访问和操作了。例如,要访问或修改血容量,首先要通过object搜索basedata类型的数据集,得到指针后,可以调用get和set操作来修改血容量的属性成员。在这个过程中,会产生相应的更新标志和数据修改事件。然后,如果我们还有一些朋友数据要保存,我们可以定义朋友数据,就像图中一样: 朋友定义 这将生成一个名为friend的数据集。如果我们添加一个朋友,我们将调用object对象来添加一个朋友集。如果我们要删除一个好友,我们会通过id找到这个集合,然后删除。还可以遍历友元类型集,对所有友元数据进行操作。 这是我在前期工作中对通用数据容器设计的思考。 相关问答:嵌入式系统软件设计中的数据结构怎么样 、而且,个人觉得,嵌入式的前期基础课包含C,C++,数据结构,创客学院的嵌入式视频很适合提高你的编程能力。二、游戏技能的数据结构是怎样的
三、游戏开发常用数据结构
上一篇:数据结构和算法知识学习的游戏
下一篇:数据结构知识游戏举例说明