/ / Prolog उपयोगकर्ता इनपुट में समय सीमा (पढ़ें) - समय, प्रस्तावना, सीमा, दुभाषिया

Prolog उपयोगकर्ता इनपुट में समय सीमा (पढ़ें) - समय, prolog, सीमा, दुभाषिया

मैं एक खेल के लिए दुभाषिया लिख ​​रहा हूं। उपयोगकर्ता दुभाषिया के लिए अपनी चाल में प्रवेश करता है और कार्यक्रम उस चाल को निष्पादित करता है।

अब मैं प्रत्येक निर्णय के लिए एक समय सीमा लागू करना चाहता हूं। खिलाड़ी को एक चाल लिखने और एन्टर प्रेस करने के लिए 30 सेकंड से अधिक सोचने में सक्षम नहीं होना चाहिए।

call_with_time_limit प्रासंगिक लग रहा था, लेकिन यह ठीक से काम नहीं करता है जैसे:

call_with_time_limit (30, पढ़ें (X)), समस्या, लेखन (समस्या)।

इस मामले में, यह इनपुट की प्रतीक्षा करता है, और जब इनपुट दर्ज किया जाता है, तो टाइमर बाद में शुरू होता है। लेकिन मैं चाहता हूं कि शुरुआत में टाइमर शुरू हो।

मैं यह कैसे कर सकता हूं?

उत्तर:

जवाब के लिए 3 № 1

यदि आप I / O संबंधित टाइमआउट में रुचि रखते हैं, तो कृपया विचार करें wait_for_input/3 या set_stream/2। आप में निर्मित पाया, call_with_time_limit/2 एक सरल और विश्वसनीय इंटरफ़ेस नहीं है।

संपादित करें: मैं सिर्फ यह देखता हूं कि आप उपयोग करते हैं read/1 इनपुट के लिए कृपया ऊपर दिए गए दस्तावेज़ों में पढ़ें कि कैसे ब्लॉक करने से बचें read/1। यह मेरे लिए स्पष्ट नहीं है कि आपको इसकी आवश्यकता क्यों है, लेकिन एक उपयोगकर्ता बस दर्ज कर सकता है वापसी, जिससे शुरुआती टाइमआउट को दरकिनार किया गया। read/1 अब वह पढ़ेंगे "n" लेकिन फिर आगे इनपुट के लिए इंतजार करना होगा - बिना टाइमआउट के, जबकि उपयोगकर्ता जवाब के लिए विकिपीडिया की बहुत प्रशंसा करता है ... शायद एसओ पर सवाल भी पूछ सकता है ...


उत्तर № 2 के लिए 1

आपका दृष्टिकोण समझदार लगता है: SWI- प्रोलॉग डॉक्स से: "read_term / 3 के टाइमआउट विकल्प का उपयोग करके I / O को अवरुद्ध किया जा सकता है।"

यह वास्तव में जानकारीपूर्ण नहीं है: उपयोगकर्ता पर बदलते समय कुछ बग की ओर जाता है (I "अधिक परीक्षण करेगा और उपयुक्त होने पर SWI_prolog मेलिंग सूची को रिपोर्ट करेगा), यहां तक ​​कि कैच / 3 के तहत भी।

निम्नलिखित काम करने लगता है

...,
current_input(I),
wait_for_input([I], A, 30),
...

यदि इनपुट नहीं दिया गया है (परीक्षण के लिए कम समय ...)

?- current_input(I), wait_for_input([I],A,5).
I = <stream>(0x7fa75bb31880),
A = [].

संपादित करें: चर ए सूची में रखेंगे सूची में शामिल हैंतैयार इनपुट के साथ धाराओं की सूची: मैंने अभी उस मामले की सूचना दी है, जहां उपयोगकर्ता समय समाप्त होने से पहले कुछ भी नहीं कहता है। वास्तविक इनपुट प्राप्त करने के लिए, आपके आपूर्ति किए गए कोड का उपयोग करना:

tql :-
current_player(I),
writef("Its %d. players turn: ", [I]),
flush_output,
current_input(Input),
wait_for_input([Input], [Input], 5),
read(Input, Move),
writeln(Move).

current_player(1).

HTH