如何从Node.js连接到nethack?

我刚刚开始了一个游戏nethack的AI机器人,我不能绕过源代码中的“人工检查”。 我正在谈论的代码段是nethack/sys/unix/unixunix.c

 #ifdef TTY_GRAPHICS /* idea from rpick%ucqais@uccba.uc.edu * prevent automated rerolling of characters * test input (fd0) so that tee'ing output to get a screen dump still * works * also incidentally prevents development of any hack-o-matic programs */ /* added check for window-system type -dlc */ if (!strcmp(windowprocs.name, "tty")) if (!isatty(0)) error("You must play from a terminal."); #endif 

我正在使用JavaScript(更具体地说是Node.js),并且由于上述原因,即使我正在产生一个bash shellsubprocess并告诉它启动nethack ,它不会让我在程序中播放。 我需要找出一种方法来绕过上面,而不需要重新编译源代码。

我正在使用的当前代码是:

 "use strict"; var env = { TERM: 'tty' }; for (var k in process.env) { env[k] = process.env[k]; } var terminal = require('child_process').spawn('bash', [], { env: env, }); terminal.stdout.on('data', function (data) { console.log('stdout: ' + data); }); terminal.on('exit', function (code) { console.log('child process exited with code ' + code); }); setTimeout(function() { terminal.stdin.write('nethack'); terminal.stdin.end(); }, 1000); 

该scheme的输出是:

 stdout: You must play from a terminal. child process exited with code 1 

什么Node.js / JavaScript(而不是任何其他语言或框架,如果可能的话)黑魔法可以用来解决这个问题?

这是一种蹩脚的检查,因为ptys将在isatty()中返回true。 Pty代表伪terminal ,允许程序伪装成terminal。 这就是Xterm和Screen的工作原理。 如果这个检查不允许那些程序通过你将无法在其中玩NetHack。

我从来没有使用它,但pty.js绑定到你将在C代码中使用的接口是有道理的。