【发布时间】:2012-10-17 23:03:24
【问题描述】:
我在画布中编写了 HTML5 游戏,但遇到了问题。
我是这样使用 var 的:
var score = 0;
// another code
++score;
但用户可以编辑该变量(例如在 FireBug 或 Chrome 编辑器中) - 得分被黑。
有什么想法吗?
【问题讨论】:
标签: javascript jquery html canvas protection
我在画布中编写了 HTML5 游戏,但遇到了问题。
我是这样使用 var 的:
var score = 0;
// another code
++score;
但用户可以编辑该变量(例如在 FireBug 或 Chrome 编辑器中) - 得分被黑。
有什么想法吗?
【问题讨论】:
标签: javascript jquery html canvas protection
Javascript 是客户端执行的。客户端上发生的任何事情都可以由它控制。没有其他办法了。您可以尝试混淆您的代码,但这只会使找出如何作弊变得更加困难。它无法阻止一个足够坚定的人。
设计防作弊游戏的唯一方法是在服务器上完成所有游戏机制。这当然在技术上更具挑战性,当用户连接不良时会影响游戏体验,并且会因为您需要更多的服务器容量而花费您额外的资源,但这是唯一的方法。
顺便说一句:我们有一个姊妹网站http://gamedev.stackexchange.com,专门用于解答有关游戏开发的问题。你可能会在那里得到一些更好的答案。
【讨论】:
您实际上无法保护在客户端运行的任何代码!
因此,您无法保护变量的内容。就像 Guffa 说的那样,你只能让破解变得更加困难。
【讨论】:
您可以将分数变量作为局部变量放在类构造函数中,这样更难获得:
function MyClass() {
var score = 0;
this.somethingHappened = function() {
if (someondition) {
score++;
}
}
this.getScore = function() {
return score;
}
}
当然仍然可以破解代码,但它根本不像更改全局变量那么简单。
【讨论】:
您无法采取任何措施来避免这种情况。您可以通过混淆代码来增加难度,但仍然可以破解分数。
一种更难的方法是双重保存分数,并在循环或某些函数中检查它是否在游戏逻辑之外发生了变化,这样用户需要找到这两个变量。
如果第二个分值是另一个分值的两倍,则通过将当前分值与所有变量分值进行比较,更难找到。
【讨论】:
http://www.crockford.com/javascript/private.html
请参阅 Crockford 关于 js 中的私有和公共 var 的文章
【讨论】: