2016-02-04 140 views
0

我正在c#中进行一个基于回合的多人游戏,并希望在每次移动/命令/回合后检查状态是否同步。状态太大,无法每次发送,所以我正在研究类似哈希的问题。通过网络比较游戏状态?

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

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

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

注:我在Unity工作,所以它显然是c#版本3。

谢谢!

+0

不,您没有别的办法可以生成您自己的检查程序。即使是散列也不是一个好主意,因为在同一个散列上会有不同的值。 – Gusman

+1

C#* 2 *?你确定?请仔细检查您正在使用的C#版本。现在C#2已经很老了(2006)。 – Amy

+0

Unity是c#5 ... – Gusman

回答

1

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

例如:

转到1:玩家1 - >播放器2:攻击:该信息进行散列(SHA256?)

转到2:球员2 - >播放器1:嘲讽+前一哈希:这信息散列(SHA256)

3回合:重复上和和..

使用这种方法,您查询从客户端的哈希信息,并确定谁,如果任何人,有不同的哈希值。 具有不同散列的人最有可能是篡改了他们的转数据的人。

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

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

它受比特币启发。

0

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

+0

你能举个例子吗,我不太清楚你的意思。 –

+0

你必须记录每一个动作。我不知道它是什么类型的游戏,但也许你需要存储一个X和Y坐标。所以这些举动必须存储一个ID,你可以通过生成一个新的序列来获得这个ID。有一种方法可以获取最后一次移动ID,如果客户端不是最新的,可以获取最后的移动。 –