通过网络比较游戏状态?

时间:2016-02-04 16:15:17

标签: c#

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

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

现在我的问题是:我应该覆盖所有州级别的GetHashCode,还是有更好/更简单的方式?

游戏仍处于早期开发状态,并且状态不断变化,因此每次在我的状态下添加或更改某些内容时,我都必须更新GetHashCode方法,这将非常烦人。这就是为什么我还没试过覆盖它,希望有一种更简单的方法。

注意:我在Unity工作,显然是c#第3版。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

例如:

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

转2:玩家2 - >玩家1:嘲讽+上一个哈希:此信息经过哈希处理(Sha256)

转3:重复开启等等......

使用此方法,您可以从客户端查询哈希信息,并确定谁(如果有人)具有不同的哈希值。 具有不同散列的人很可能是篡改了他们的转弯数据的人。

唯一需要注意的是,您需要在数据中包含某种标题信息,以确定每个人都在使用什么。 例如:您不希望将玩家1标记为篡改数据的人,只是因为他们还有玩家2尚未收到的转弯信息。 既然如此:当哈希通过网络发送时,您可以将转弯号码或索引附加到传输中。因此,如果玩家2收到他尚未得到的转弯哈希值,那么他会尊重并保存它。 然而,如果他得到一个他已经拥有的转弯的哈希值 - 他应该与其他玩家核实,看看他们在同一回合中有什么哈希值。

注意:这为您提供了验证游戏中整个转弯历史的方法,并检查每个人是否同步。

它的灵感来自比特币。

答案 1 :(得分:0)

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