编程游戏是一种计算机游戏,其中两个或多个程序相互竞争。编程游戏的基本要求是什么?它们可以在浏览器中实现吗?使用 JavaScript 吗?
4 个基本要求
有 4 个基本要求。竞争程序
- 必须与主程序隔离运行。
- 必须以定义的方式与主程序通信。
- 应该并行运行。与主程序并行,彼此之间也并行。
- 应该以简单的方式注入到游戏环境中。
传统的 JavaScript 是同步运行的,无法隔离子程序。但时代在变,现代 JavaScript 拥有更多功能。那么 Web Workers 呢?它们旨在使 JavaScript 更快,在浏览器中运行昂贵的计算而不阻塞用户界面。但 Web Workers 可以做更多事情。它们满足了我们对编程游戏的要求!它们与主程序隔离运行,通过事件与主程序通信,并行运行,并且借助新的文件 API,它们可以本地注入。
Web Worker 竞赛
就是这样。使用 Web Workers 创建编程游戏非常简单。为了展示这个想法,我在 2014 年 5 月启动了一个基于 Web Workers 的简单编程游戏,即 Web Worker 竞赛。游戏本身是一个简单的数学挑战:如何征服一个 100×100 格的方块。从随机点开始,玩家必须通过简单的移动(上、下、左、右)来征服 100×100 格的游戏区域。
一个新的格子只能在之前没有被对手程序占据的情况下才能占据。玩家没有关于游戏区域的任何信息。他们收到的唯一信息是他们选择的移动是否可行。因此,Web Worker 使用 postMessage()
发送他们的新移动。并且通过 onmessage()
事件,他们会收到他们的移动是否可行(简单的 true
或 false
)。主程序反过来操作。它通过 onmessage()
接收移动,在游戏区域执行移动,并通过 postMessage()
发送成功信息。
最终,你的代码如下所示
// - worker1.js -
// makeMove() calulates the next move
onmessage = function (event) {
var success = event.data.success;
var direction = makeMove(success);
postMessage({
direction: direction
});
};
// - main program -
// makeMoveWorker1() executes the move
var worker1 = new Worker('worker1.js');
worker1.onmessage = function(event) {
var direction = event.data.direction;
var success = makeMoveWorker1(direction);
worker1.postMessage({
success: success
});
};
现在,只需使用以下命令启动游戏
// analogously for a second worker
woker1.postMessage({
success: true
});
它就开始全速运行了。
完整的代码 可在 GitHub 上获取。
主要挑战:机器时间的均衡分配
使用 Web Workers 进行编程游戏的主要挑战是将机器时间均衡地分配给两个 Web Workers。有两个单独的时间问题。一个是在加载阶段,另一个是在游戏阶段。
在开始游戏之前,必须加载两个 Web Workers(远程或本地)。因此,在开始游戏之前,必须等到两个 Web Workers 都加载完成。不幸的是,Web Workers 没有 onload 事件。当然,我们可以做一些事情来解决这个问题:在开始时,主程序向玩家发送一个“准备就绪”的帖子,并在两个 worker 都确认该帖子后开始游戏。
游戏阶段期间的机器时间均衡通常不受主程序控制。可能会发生一个玩家在另一个玩家可以移动之前执行大量移动的情况。为两个玩家获得平等的条件对浏览器引擎和操作系统都是一个挑战。但也有可能一个玩家试图通过持续发射(使用 postMessage
循环)来阻止另一个玩家。为了防止这种情况,主程序会连同成功信息一起发送一个随机 ID。玩家必须在下次移动时重新发送此 ID(否则会被取消资格)。通过此限制,机器时间得到了充分的均衡分配。
更多 视频可在 YouTube 上获取。
竞赛和编程游戏
Web Worker 竞赛非常活跃。在 4 周内,超过 200 名程序员编写了超过 700 个程序,努力寻找征服该领域的最佳策略。
在浏览器中编程游戏是可行的。借助 Web Worker 技术,我们拥有实现它们的工具。而且在浏览器中进行编程游戏对参与者来说非常方便。无需安装游戏环境。只需访问网站,编写代码,测试并上传即可。
关于 Stefan Trenkel
住在不莱梅(德国),热爱 JavaScript,并在 team neusta 担任软件工程师。
关于 Robert Nyman [荣誉编辑]
Mozilla Hacks 的技术布道师和编辑。发表关于 HTML5、JavaScript 和开放网络的演讲和博客文章。Robert 是 HTML5 和开放网络的坚定支持者,自 1999 年以来一直从事 Web 前端开发工作——在瑞典和纽约市。他还在 http://robertnyman.com 定期发表博客文章,并且喜欢旅行和结识新朋友。