如何保护基于javascript的多人游戏

时间:2014-06-30 06:53:10

标签: javascript game-engine

首先,我理解这个问题可能不是主题,也不在stackoverflow的范围内,但我仍然决定问,因为我不知道任何其他更好的地方。

<小时/> 我的问题是,如果我基于用javascript编写的游戏引擎制作在线游戏,例如CreateJS。游戏代码将在客户端计算机上运行,​​并且由于javascript被解释,客户端可以查看它。

因此,如果正在制作一个用户可以互相竞争的多层游戏,那么采取了哪些措施来防止作弊。我问,因为游戏来源是可见的,任何人都可以简单地修改游戏来源并可能作弊。

<小时/> 编辑:对于游戏的想法,让我们做一个非常简单的。想象一下,我们正在制作像FlappyBird这样的游戏,或者在线性地图中进一步游戏的游戏,你叠加得越多。

在游戏结束时,您的分数将通过http请求提交。

现在是什么阻止用户编辑游戏,导致积分加快10倍?导致更高的分数被提交?

编辑2 或者是什么阻止用户通过cURL提交包含错误分数的请求而无需玩游戏?

3 个答案:

答案 0 :(得分:2)

多人游戏通常只是通过验证游戏步骤来防止作弊,而不仅仅是完整的游戏输出。由于所有其他玩家需要知道其他玩家的行为,因此您必须告知服务器的每一步,并让服务器“模拟”游戏并检查这些步骤是否实际有效。在这种情况下作弊的唯一方法是在浏览器中编写AI,然后生成一组可行的步骤,以获得良好的结果。

您还必须将这些播放器步骤发送给其他人。由于在连续环境中玩家可以每秒执行如此多的操作(例如移动和转弯),因此您需要确保最小化要发送的更新量。例如。例如,当以直线行走时,魔兽世界每500ms只发送一次更新。它们也可能不一定模拟和验证您采取的每一步,而只是每X步都可以避免人们穿过墙壁或跳过整个建筑物等。

请注意,使用AJAX通话时,任何快节奏的游戏都无法正常运行。只要通过已建立的连接发送数据包,只需设置连接就可以花费很多倍。这就是为什么你想在这种情况下使用Websockets。

当然,缩小和混淆你的代码会给骗子带来一些影响,但是根据系统的漏洞,它们可能做的很少,因为通常很容易找到需要注意的代码发送和接收数据包或游戏的其他核心方面,无论它有多么混乱。

答案 1 :(得分:1)

如果你开发了一个多人游戏&#34;基于游戏,你应该将数据保存在服务器上,由游戏中的ajax集中访问。

你是对的,有人可能&#34;欺骗&#34;在通过http请求(ajax)发送数据之前,通过使用firebug或Greasemonkey覆盖代码。

为了防止这种情况,您可以加载ajax代码以动态保存数据。您只能通过更难以覆盖代码来防止它。例如,在虚拟会话中使用单向令牌,例如OAuth中使用的令牌,例如ajax调用的票证。没有正确令牌的每次其他电话都应该被驳回。

答案 2 :(得分:1)

由于您无法相信您的客户,因此您应该制作authoritative server and dumb clients model;

对于想要实现多人游戏的人来说,articles充满了宝石

  

游戏状态仅由服务器管理。客户发送他们的   对服务器的操作。服务器定期更新游戏状态,   然后将新游戏状态发送回刚刚呈现它的客户端   在屏幕上。

     

从您的角度来看,发生的事情是您按下右侧   箭头,但十分之一秒没有发生任何事情;然后你的   角色终于向右移动了一个方格。这种感知滞后   你的输入和它的后果之间可能听起来不是很多,但是   它是显而易见的 - 当然,延迟半秒不仅仅是   值得注意的是,它实际上让游戏无法播放。

因此,您必须实施 Client-side prediction and a Server reconciliation