比较网络上的游戏状态

本文关键字:游戏 状态 网络 比较 | 更新日期: 2023-09-27 18:33:11

我正在用 c# 制作一个回合制多人游戏,并希望进行简单的检查,以查看每次移动/命令/回合后状态是否同步。状态太大,无法每次都发送,所以我正在研究哈希之类的东西。

但是,如果我理解正确,在 C# 中,类的默认GetHashCode基于对象的指针,因此这对于检查网络上的相等性不起作用。

现在我的问题:我应该覆盖我所有状态类的GetHashCode,还是有更好/更简单的方法?

游戏仍处于非常早期的开发阶段,状态也在不断变化,所以每次我在我的状态中添加或更改某些内容时,我还必须更新GetHashCode方法,这将是非常烦人的。这就是为什么我还没有真正尝试覆盖它,希望有一种更简单的方法。

注意:我正在使用 Unity,所以它显然是 c# 版本 3。

谢谢!

比较网络上的游戏状态

如果您正在开发回合制游戏,那么您可能会对区块链方法感兴趣。它可能允许您检测篡改客户端。

例如:

回合 1 : 玩家 1 -> 玩家 2 : 攻击 : 此信息经过哈希处理 (Sha256?

回合 2 : 玩家 2 -> 玩家 1 : 嘲讽 + 前一个哈希 : 此信息已哈希 (Sha256(

转3:重复,再重复。

使用此方法,可以从客户端查询哈希信息,并确定谁(如果有的话(具有不同的哈希。具有不同哈希值的人很可能是篡改其回合数据的人。

唯一需要注意的是,您需要在数据中包含某种标头信息,以确定每个人的开启方式。例如:您不想将玩家 1 标记为篡改数据的人,只是因为他们拥有玩家 2 尚未收到的回合信息。在这种情况下:当哈希通过网络发送时,您可以将轮次号或索引附加到传输中。因此,如果玩家 2 收到他尚未获得的回合的哈希值,那么他将尊重它并保存它。然而,如果他得到了他已经拥有的回合的哈希值 - 他可能应该与其他玩家核实,看看他们在同一回合中有多少哈希值。

注意 :这为您提供了一种验证游戏中整个回合历史的方法,以及检查每个人是否同步的方法。

它的灵感来自比特币。

让托管的人有一个序列,并在进行移动时生成一个数字。通过获取当前序列进行同步,并确保客户端具有相同的编号,如果没有,则获取具有该序列 ID 的所有移动到该点的移动。