Hash表和TList的结合使用。

大家知道Hash表具有对于它的KEY进行高速检索的功能。而Tlist中有可以保存自己定义的各种结构。如果将他们两个结合起来使用会是什么情况呢?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

试想一下,如果在游戏中如果突然有哪个玩家断线,那么即便是我们知道这个玩家的Socket,但是要从所有玩家中检索出他的信息,也不是一件容易的事。

那我们为什么不能将Hash表和Tlist结合使用呢。在我开发的游戏中,我就是将Hash表和Tlist同时使用,来对玩家断线做相关的处理。

今天我就简单的写一下我是如何处理的。

假定有一个Tlist中(UserList)保存着游戏中某房间的所有玩家信息。玩家的信息结构如下:

RuserInfo = record

     Socket;Tsocket;

UserID:String[20];

Face:Byte;

Sex:Boolean;

Socre:Integer;

CurrStatus:Integer;

End;

PuserInfo = ^ RuserInfo;

我们来创建一个Hash表和一个Tlist表:

ScHash:= THashedStringlist.Create;

UserList:=Tlist.Create;

当某一玩家加入游戏时这样处理。

New(P_User)

P_User.Socket=3500

P_User.UserID:=’fxh7622’;

P_User.Face:=3;

P_User.Sex:=true;

P_User.Socre:=1000;

P_User.CurrStatus:=0;

Index:=ScHash.IndexOf(IntToStr(p_User.Socket));

if Index=-1 then

begin

  ScHash.AddObject(IntToStr(p_User^.Socket),TObject(Integer(p_User)));

end;

//这里将玩家的信息以Socket作为KEY来放入Hash表中。

UserList.Add(P_User);

//在这里将玩家的信息保存在一个Tlist表中。通过前面我的文章中介绍,大家可以知道在HASH表中和在Tlist表中保存的是同一个内容,也就是说:如果修改了某玩家在Tlist中保存的信息那么他在Hash表中保存的信息也将随着修改。

这样当玩家断线以后,我们可以快速的使用Hash表来检索出是哪个玩家断线。

function TUserBaseControl.Sel_Hash(sc:TSOCKET;var p_User:PUserSocket): Boolean;

var

  t_User:PUserSocket;

  t_Object:TObject;

  Index:Integer;

begin

  Result:=false;

  Index:=ScHash.IndexOf(IntToStr(sc));

  if Index<>-1 then

  begin

    t_Object:=ScHash.Objects[Index];

    p_User:=PUserSocket(t_Object);

    Result:=true;

  end;

end;

 

检索出玩家信息以后可以将玩家信息中的相关信息进行修改。

例如:p_User.CurrStatus:=5;

 

以上的例子只是对Hash表和Tlist使用的一个小小的窍门,但是的确可以加快服务器的处理速度。希望也对大家有一个帮助。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值