2012-03-22 30 views
5

मैं खेल nethack के लिए अभी एआई बॉट शुरू कर रहा हूं, और मैं स्रोत में 'मानव-जांच' को बाईपास नहीं कर सकता। कोड के बारे में मैं बात कर रहा हूँ की धारा nethack/sys/unix/unixunix.c है: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 

मैं, और इसके बाद के संस्करण की वजह जावास्क्रिप्ट, (खासतौर पर Node.js) में काम कर रहा हूँ, यह मेरे कार्यक्रम से खेलने जाने नहीं देंगे , भले ही मैं एक बैश शैल बाल प्रक्रिया को जन्म दे रहा हूं और इसे 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/जावास्क्रिप्ट (और नहीं किसी भी अन्य भाषा या ढांचे, अगर संभव) काला समस्या क्या मैं इस समस्या को हल करने के लिए उपयोग कर सकता हूं?

+1

मुझे इस बारे में निश्चित नहीं है, आप नोड के [टीटीवी मॉड्यूल] (http://nodejs.org/api/tty.html) में देखना चाहेंगे। इसके अलावा, [यह धागा] (http://groups.google.com/group/nodejs/browse_thread/thread/6fd25d16b250aa7d) ब्याज का हो सकता है। –

+0

हाँ, मैंने टीटीवी मॉड्यूल की जांच की है: ऐसा लगता है कि v0.6 + 'tty.open() 'विधि को हटा देता है, जो कुछ ऐसा हो सकता है जो मैं चाहता हूं, लेकिन वह विधि बहिष्कृत' process.binding ('stdio') 'कॉल, जिसे मुझे कोई दस्तावेज नहीं मिल रहा है। हालांकि मैं धागा की जांच करूंगा। धन्यवाद। – chrisdotcode

उत्तर

3

यह एक लंगड़ा जांच है क्योंकि ptys isatty() में सच हो जाएगा। Pty Pseudo terminal के लिए खड़ा है जो एक प्रोग्राम को टर्मिनल होने का नाटक करने की अनुमति देता है। इस तरह Xterm और स्क्रीन काम करता है। यदि उस चेक ने उन कार्यक्रमों को आपके माध्यम से अनुमति नहीं दी है तो वे उनमें नेटहैक नहीं खेल पाएंगे।

मैंने कभी इसका उपयोग नहीं किया है, लेकिन pty.js सी कोड में उपयोग करने के लिए बिल्कुल ठीक है और इंटरफ़ेस समझ में आता है।

+0

यह सही दिखता है, धन्यवाद :-) – chrisdotcode