我只是为nethack游戏启动了一个AI机器人,而且我无法绕过源代码中的“人工检查”。我正在谈论的代码部分是nethack/sys/unix/unixunix.c:

#ifdef TTY_GRAPHICS
    /* idea from rpick%[email protected]
     * 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 shell子进程并告诉它启动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);

该程序的输出为:
stdout: You must play from a terminal.

child process exited with code 1

我可以使用哪种Node.js/JavaScript(如果可能的话,不要使用任何其他语言或框架)的黑魔法来解决此问题?

最佳答案

这有点a脚,因为ptys将在isatty()中返回true。 Pty代表Pseudo terminal,它允许程序伪装成终端。这就是Xterm和Screen的工作方式。如果该检查不允许您通过这些程序,则将无法在其中播放NetHack。

我从未使用过它,但是pty.js完全绑定(bind)到您将在C代码中使用的东西,并且该接口(interface)很有意义。

关于javascript - 如何从Node.js连接到nethack?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9815728/

10-09 15:31