9

我在画布中编写了 HTML5 游戏,但遇到了问题。

我像这样使用var:

var score = 0;
// another code 
++score;

但用户可以编辑该变量(例如在 FireBug 或 Chrome 编辑器中)——得分被黑。

有任何想法吗?

4

5 回答 5

7

Javascript是客户端执行的。客户端上发生的任何事情都可以由它控制。没有其他办法了。您可以尝试混淆您的代码,但这只会使找出如何作弊变得更加困难。它无法阻止一个足够坚定的人。

设计防作弊游戏的唯一方法是在服务器上完成所有游戏机制。这当然在技术上更具挑战性,当用户连接不良时会损害游戏体验,并且会因为您需要更多服务器容量而花费您额外的资源,但这是唯一的方法。

顺便说一句:我们有一个姊妹网站http://gamedev.stackexchange.com专门针对有关游戏开发的问题。你可能会在那里得到一些更好的答案。

于 2012-10-28T10:22:06.403 回答
4

您实际上无法保护在客户端运行的任何代码!

因此,您无法保护变量的内容。你只能让破解变得更加困难——就像 Guffa 说的那样。

于 2012-10-28T10:21:11.360 回答
3

您可以将 score 变量作为局部变量放在类构造函数中,这样更难获得:

function MyClass() {
  var score = 0;

  this.somethingHappened = function() {
    if (someondition) {
      score++;
    }
  }

  this.getScore = function() {
    return score;
  }

}

当然仍然可以破解代码,但它根本不像更改全局变量那么简单。

于 2012-10-28T10:19:37.683 回答
3

您无法采取任何措施来避免这种情况。您可以通过混淆代码使其更难,但仍然有可能破解分数。

一种更难的方法是双重保存分数,并在循环或某些函数中检查它是否在游戏逻辑之外发生了变化,这样用户需要找到这两个变量。

如果第二个分值是另一个分值的两倍,则通过将当前得分与所有变量得分进行比较,更难找到。

于 2012-10-28T10:15:37.070 回答
1

http://www.crockford.com/javascript/private.html

请参阅 Crockford 的关于 js 中的私有和公共 var 的文章

于 2012-10-28T10:22:42.707 回答