2012-03-22 14 views
5

Właśnie uruchamiam bota dla sztucznej inteligencji dla gry nethack i nie mogę ominąć "testu ludzkiego", który znajduje się w źródle. Część kodu mówię o to nethack/sys/unix/unixunix.c:Jak połączyć się z nethack z Node.js?

#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 

Pracuję w JavaScripcie (dokładniej node.js) oraz w związku z powyższym, nie pozwoli mi grać z programu , mimo że spawnuję proces potomny powłoki bash i mówię, aby uruchomił nethack. Muszę wymyślić sposób na ominięcie powyższego bez rekompilacji źródła.

Obecny kod używam jest:

"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); 

Wyjście programu jest:

stdout: You must play from a terminal. 

child process exited with code 1 

Co node.js/JavaScript (a nie jakiegokolwiek innego języka lub ramy, jeśli możliwe) czarnej magii mogę użyć, aby rozwiązać ten problem?

+1

Nie jestem tego pewien, możesz zajrzeć do modułu [moduł TTY] w węźle (http://nodejs.org/api/tty.html). Również [ten wątek] (http://groups.google.com/group/nodejs/browse_thread/thread/6fd25d16b250aa7d) może być interesujący. –

+0

Tak, sprawdziłem moduł TTY: wygląda na to, że v0.6 + odbiera metodę 'tty.open()', co może być czymś, czego mogę chcieć, ale ta metoda używa przestarzałego 'proces.binding ('stdio') 'call, którego nie mogę znaleźć na żadnej dokumentacji. Sprawdzę jednak wątek. Dzięki. – chrisdotcode

Odpowiedz

3

To rodzaj lame wyboru, ponieważ ptys zwróci true w isatty(). Pty oznacza Pseudo terminal, co pozwala programowi udawać terminal. Tak działają Xterm i Screen. Jeśli ta kontrola nie pozwoli ci na używanie tych programów przez ciebie, nie będzie w stanie grać w NetHack.

Nigdy go nie używałem, ale pty.js wiąże się dokładnie z tym, czego używałbyś w kodzie C, a interfejs ma sens.

+0

To wygląda idealnie, dzięki :-) – chrisdotcode