为每个玩家分配一个唯一的ID?

对于我的游戏的多人对战和后端,每个玩家都被分配一个唯一的GlobalID和LocalID。 GlobalID用于跟踪所有玩家,LocalID用于跟踪特定房间中的玩家。 我怎样才能为每个玩家分配一个唯一的ID,以便在任何时候2个玩家都没有相同的GlobalID或LocalID? 我想我可以管理与分配给每个球员自己的GlobalID,让他们保持它注销后,但我绝对需要重用LocalID注意:我使用C#为我的服务器处理ID。

如果您使用的是服务器,即使仅用于匹配,只需将它们分配一个即可。 您可以在注册帐户时使用计数器。 或者你可以使用随机数字,并检查重复。 或者使用他们的屏幕名称作为唯一的ID。

您可以使用他们的电子邮件地址或其他独特数据的散列。

微软提出了一个生成全局唯一标识符(GUID)的系统。 它使用本地信息加上一些统计数据来保证每个生成的标识符都是唯一的。 这些提示可能是为了你想要的。 但是,既然你使用的是C#,你已经准备好了代码: https : //msdn.microsoft.com/en-us/library/system.guid.newguid(v=vs.110).aspx

好吧,所以我玩了一下ID的作业,想出了这个:

在每个玩家被分配和ID之后,该号码被放入一个名为TakenID的列表中。 for循环检查哪些编号不包含在TakenID中。 只要popup一个可用的数字,for循环就会中断,返回的数字将被添加到TakenID中。 当一个玩家离开时,他的ID从TakenIDs列表中被取走。

我join了一个重要的优化。 当玩家离开时,他的ID被存储在名为CachedIDs的列表中。 生成一个ID时,生成器首先检查CachedIDs中是否有任何ID。 如果存在,那么该数字将从CachedIDs中返回并删除。 如果没有,则继续逐步search。 cachingID列表是自我维护的,并且增加以适应玩家基础。

您可以生成一个随机ID,将其与现有的使用ID进行比较,如果生成的ID与其中一个现有ID匹配,则重新启动该进程。 你一直这样做,直到你有一个唯一的ID。 这里是C#中的一个例子:

//Lets assume you're using an array named 'idArray' filled the existing IDs Random rand = new Random(); int generatedID = -1; do { generatedID = rand.Next(1, int.MaxValue); foreach (int existingID in idArray) { if(generatedID == existingID) { generatedID = -1; break; } } } while (generatedID == -1); 

如果你的玩家有名字,你可以使用这个名字作为ID(因为它的多人游戏,我猜你不想有两个同名的玩家),或者你可以用这个名字作为生成器的种子来生成一个ID确保你有一个独特的来源生成的数字,有点像哈希如何工作。

下面是哈希的解释,如果你不熟悉它: http : //mathworld.wolfram.com/HashFunction.html

如果您使用本地ID的字节,则为每个房间创建一个具有256个插槽的IDarrays。 当玩家进入房间时,将其全局ID分配给arrays中的第一个空插槽,并且他们的本地ID可以是它们在arrays中的位置。 当他们离开只是将数组设置为一个保留的全局标识,表明它没有使用。 如果全局ID是128位,那么整个arrays将在服务器上占用4kb的空间,我想不出为什么你需要通过networking传输整个ID列表,使得不是4kb的networkingstream量。 ..