वह कौन सी तकनीक है जो किसी गेम के अंदर प्रोग्रामिंग की अनुमति देती है?


27

कुछ खेल हैं जो खिलाड़ी को खेल में स्क्रिप्ट लिखने / बनाने की अनुमति देते हैं, उदाहरण के लिए: अंतरिक्ष इंजीनियर या साई

मैं या तो एक के समान कुछ का उपयोग करना चाहता हूं, लेकिन मेरे पास एक कठिन समय है ताकि मुझे जानकारी मिल सके।

क्या प्रोग्रामिंग की एक शाखा है जो उपयोगकर्ता द्वारा बनाए गए नए कोड को चलाने के लिए संकलित एक सॉफ्टवेयर की क्षमता को कवर करती है?

प्रोग्रामिंग की शाखा से मेरा मतलब है कि पीटीजी (प्रोसेडुरल टेरेन जेनरेशन) जैसा कुछ है।

किसी प्रश्न या राय के आधार पर अधिक व्यापकता से बचने के लिए , मुझे स्पष्ट रूप से बताएं कि मैं सीखने के लिए मार्गदर्शक या स्थान की तलाश नहीं कर रहा हूं, मैं इसमें शामिल तकनीक का नाम या परिभाषा (यदि कोई मौजूद है) चाहता हूं।


22
खैर, शायद "लेखन दुभाषियों"?
मैथ्यू रॉक

2
मैंने हाल ही में इसी तरह के सवाल का जवाब दिया , " वर्चुअल मशीन " पर चर्चा करते हुए उस सिस्टम के लिए शब्द के रूप में जो उपयोगकर्ता कोड चलाता है, और यह भी एक पारंपरिक दुभाषिया की तुलना में तेजी से इसे लागू करने के साधन के रूप में बायटेकोड पैटर्न पर गेम प्रोग्रामिंग पैटर्न लेख को संदर्भित करता है ।
DMGregory

3
इसे आमतौर पर "स्क्रिप्टिंग" कहा जाता है। आपको किसी खेल में स्क्रिप्टिंग को लागू करने के बारे में बहुत सारी सामग्रियां मिलेंगी, साथ ही बहुत सारे (विभिन्न) खुले स्रोत के नमूने और वास्तविक कोड भी। व्यापक दायरे में, कंपाइलर प्रोग्रामिंग का पूरा क्षेत्र है (जिसमें लेक्सिंग, पार्सिंग, संकलन, लिंकिंग, व्याख्या करना ...) शामिल है। व्यापक दायरे में (आवश्यक रूप से उपयोगी नहीं), यह बहुत अधिक किसी भी उपयोगकर्ता को आपके द्वारा किए गए इंटरैक्शन के लिए मजबूर करता है - एक स्क्रिप्टिंग इंजन वास्तव में एक मेनू से चयन करने के लिए बहुत अधिक जटिल तरीका है।
लुआन

2
एक पायथन कार्यक्रम पायथन स्क्रिप्ट की मेजबानी कर सकता है। इसे मेटाप्रोग्रामिंग कहा जाता है। अधिकांश व्याख्या की गई भाषाओं में वह है।
user6245072

1
स्पेस इंजीनियर्स में AFAIK, कोड को सैंडबॉक्स किए गए वातावरण में C # कोड संकलित किया गया है (गेम ओपन-सोर्स चला गया है, इसलिए आप जांच सकते हैं कि यह कैसे ऑनलाइन काम करता है: github.com/KeenSoftwareHouse/SpaceEngineers )। मूल रूप से C # कंपाइलर और कोड वाले गेम शिप केवल गेम के एपीआई फंक्शंस तक ही पहुँच प्रदान करते हैं, ताकि प्रोग्राम का दायरा केवल आप तक ही सीमित रहे। और यदि आप मल्टीप्लेयर खेल रहे हैं, तो कोड केवल आपकी मशीन पर चलता है (अन्य खिलाड़ी / सर्वर केवल ingame परिणाम देखते हैं)
फ्लोरियन कैस्टेलन

जवाबों:


42

स्क्रिप्टिंग / एम्बेडेड / व्याख्या की गई भाषाओं जैसे "लुआ", "लिस्प" या "एंजेलस्क्रिप्ट" ( यहां अधिक ) को खेल के दौरान अद्यतन किया जा सकता है [*] और फिर मक्खी पर व्याख्या (= निष्पादित) की जाती है।

आप उन लिपियों से तत्वों को अपने मूल संकलित कोडिंग (C ++ इत्यादि) से बाँध सकते हैं ताकि लिपियाँ आपके आवेदन के लिए तर्क निष्पादित कर सकें। ई। जी। एक विशिष्ट कमांड जिसे उपयोगकर्ता स्क्रिप्ट में डाल सकता है, परिणामस्वरूप खेल की दुनिया में एक निश्चित दूरी से इन-गेम चरित्र को स्थानांतरित करता है।

कुछ प्रासंगिक जुड़े हुए प्रश्न:


[*] या तो उपयोगकर्ता खेल के भाग के रूप में या एप्लिकेशन को पुनः आरंभ किए बिना तेज पुनरावृत्ति / परीक्षण के लिए devs द्वारा


14
मुझे कुछ "व्याख्या की गई भाषा" कहते समय सावधानी बरतनी चाहिए। सबसे अच्छा यह बहुत ही विवादित शब्द है।
वंड्रा

1
कंप्यूटरक्राफ्ट (मिनीक्राफ्ट मॉड) खेल के भीतर कार्यों को करने के लिए एक स्क्रिप्टिंग भाषा के रूप में एलयूए का उपयोग करता है।
टिकेब

20
मैं वास्तव में उपद्रव नहीं समझता। लिस्प की व्याख्या और संकलन दोनों हो सकते हैं। हम यहां यह नहीं interpretedबता रहे हैं कि भाषाओं को कैसे वर्गीकृत किया जाए और क्या यह एक अच्छी स्थिति है; हम ओपी को बता रहे हैं कि कौन इस तथ्य से अनजान है कि भाषा को संकलित करने की आवश्यकता नहीं है, लेकिन इसकी व्याख्या की जा सकती है - और हम कुछ भाषाओं को एक उदाहरण के रूप में देते हैं। क्या लिस्प की व्याख्या की गई है? हाँ। क्या यह संकलित है? हाँ भी! लेकिन वह दायरे से बाहर है। उत्तर शब्दांकन के साथ गलत हो सकता है, लेकिन यह उद्देश्य के लिए ठीक है; यह ओपी को सही दिशा में धकेलता है और यही मायने रखता है। यहाँ, मेरी +1 लें।
मैथ्यू रॉक

1
अच्छी तरह से भले ही एक भाषा केवल संकलन हो, आपको अपने खेल में एक आईडीई, कंपाइलर और रनटाइम एम्बेड करने से क्या रोकता है? बजट को छोड़कर, यानी।
13:27 पर ऑडरस

3
@DanielJour जबकि मैं सहमत हूँ कि सैद्धांतिक रूप से एक भाषा इसके कार्यान्वयन से अलग हो सकती है (मशीन कोड के लिए संकलित बनाम एक vm के लिए bytecode के लिए संकलित), यह अभी भी एक उपयोगी समय-बचत धारणा है कि सी को संकलित किया जाता है जब तक कि यह निर्दिष्ट नहीं किया जा सकता (और क्या आप कल्पना कर सकते हैं) लगता है कि यदि आप पूछते हैं, "प्रतीक्षा करें, सी या संकलित सी?" हर बार)। ओपी के उद्देश्य के लिए, उसे उन भाषाओं को देखना होगा जो व्याख्या का समर्थन करते हैं; उन्हें संकलित किया जा सकता है या नहीं, यह एक गैर-मुद्दा है क्योंकि यह नहीं है कि वह इसका उपयोग कैसे करेंगे।
ब्लैकहॉक

12

एंबेडेड भाषा उचित तकनीकी शब्द है। व्यवहार में, जो भाषाएं अन्य अनुप्रयोगों (जैसे खेल) के अंदर उपयोग की जाती हैं, उन्हें अक्सर स्क्रिप्टिंग या यहां तक ​​कि व्याख्या की गई भाषाओं के रूप में संदर्भित किया जाता है , हालांकि उन्हें नियमित कार्यों को स्वचालित करने के लिए आवश्यक रूप से व्याख्या या उपयोग नहीं किया जाना चाहिए। खेलों के लिए "स्क्रिप्टिंग भाषाओं" को गुगली करना शायद "एम्बेडेड भाषाओं" की खोज की तुलना में अधिक उपयोगी परिणाम देगा।


11

आप कोड को कुछ कार्यों में बदलने का एक तरीका ढूंढ रहे हैं। ठीक यही है दुभाषियों कर रहे हैं।

अजगर को देखो। आप इसे चलाते हैं, और बाम! आप REPL ( R ead E val P rint L oop) में उतरें।

आप एक फ़ंक्शन "हैलो" को परिभाषित करते हैं जो "हैलो, वर्ल्ड" प्रिंट करता है। आखिर तुमने इसे हासिल कर ही लिया है!

ध्यान दें कि आपने कुछ भी संकलित नहीं किया है; दुभाषिया ने मक्खी (रनटाइम के दौरान) पर फ़ंक्शन बनाने के लिए कुछ जादू किया और अब आप इसे कॉल करने में सक्षम हैं।

खेलों पर भी यही बात लागू होती है। REPL होने के बजाय, आपके पास REPL मॉड्यूल के साथ एक गेम है। खेल शायद आरईपीएल शुरू करता है और फिर इस आरईपीएल में बाकी सब कुछ चलाता है, इसलिए आपके पास डेटा तक पहुंच है और इसे सक्रिय रूप से संशोधित कर सकते हैं।

यदि आप C ++ जैसी विशाल भाषाओं के साथ काम कर रहे हैं, तो वे कम गतिशील होते हैं और शायद संकलित होते हैं। आप कुछ आसान चाहते हैं। आप या तो अपनी भाषा बनाते हैं, या कुछ मौजूदा (जैसे कॉफ़स्क्रिप्ट, गिलहरी, लुआ, योजना, ...) का उपयोग करते हैं

इन्हें अक्सर स्क्रिप्टिंग लैंग्वेज कहा जाता है , क्योंकि आप इनका इस्तेमाल उन स्क्रिप्ट को लिखने के लिए करते हैं जो किसी अन्य भाषा (जैसे C ++) में विकसित गेम इंजन पर बनाई जाती हैं।


2

यदि इन-गेम प्रोग्रामिंग भाषा केवल गेम के उद्देश्य के लिए डिज़ाइन की गई थी, तो यह एक डोमेन विशिष्ट भाषा है

डोमेन विशिष्ट भाषाओं का लाभ (और नुकसान) यह है कि भाषा खुद को सीमित कर सकती है कि उपयोगकर्ता क्या कर सकता है (यानी आप इंटरनेट से कनेक्ट करना अस्वीकार कर सकते हैं)। आप एक ऐसी भाषा डिज़ाइन कर सकते हैं जो सामान्य उद्देश्य की भाषा की तुलना में विशिष्ट गेम कार्यों को अधिक आसान बनाती है। नुकसान यह है कि उपयोगकर्ता को एक नई भाषा सीखना है।

बस अपने खेल के भीतर से एक सामान्य प्रयोजन की भाषा (जैसे अजगर या पर्ल) में असंसदीय उपयोगकर्ता कोड चलाना , उपयोगकर्ता को उन चीजों के साथ गड़बड़ करने की अनुमति दे सकता है जिनके साथ उसे गड़बड़ नहीं करना चाहिए। लेकिन यह आपके खेल पर निर्भर करता है। यदि आप उपयोगकर्ताओं को अपने खेल के भीतर से नई खिड़कियाँ खोलने या जो कुछ भी वे पसंद करते हैं, करने का मन नहीं करते हैं, तो आप एक सामान्य उद्देश्य भाषा का उपयोग कर सकते हैं और अपने खेल की दुनिया की कुछ विशेषताओं के लिए बाइंडिंग को उजागर कर सकते हैं।


1

दो उदाहरण हैं जो मैं अपने सिर के ऊपर से सोच सकता हूं। दोनों बिल्कुल वही करने लगते हैं जो आपके लिए पूछ रहे हैं।

पहला है स्क्रीप्स। https://screeps.com/ आप इस बारे में बहुत कुछ पढ़ सकते हैं कि यह http://support.screeps.com/hc/en-us/articles/205960931-Server-side- RGBecture- overview पर इस लक्ष्य को कैसे पूरा करता है

दूसरा है ComputerCraft http://www.computercraft.info/ वे इस बारे में अधिक विस्तार में नहीं जाते कि यह कैसे काम करता है, लेकिन थोड़ा उनके विकि पर देखा जा सकता है http://www.computercraft.info/wiki/Main_Page

संक्षेप में, मुख्य खेल एक अलग धागे में दुभाषिया चलाता है, फिर उस धागे को एपीआई कॉल के माध्यम से खेल की दुनिया में हेरफेर करने की अनुमति देता है।

दोनों उदाहरणों में, जबकि भाषा लगभग असीमित है (केवल कुछ कॉल सुरक्षा कारणों से अवरुद्ध) जोड़तोड़ एपीआई कॉल द्वारा सीमित किए जा सकते हैं जिन्हें बनाया जा सकता है।

आमतौर पर बहुत कम काम के लिए कुछ इस तरह की शुरुआत की आवश्यकता होती है। आप की जरूरत है

  • एक थ्रेड मैनेजर जो आपके गेम के लूप की सुरक्षा करता है (एक थ्रेड को लूप को लॉक नहीं करने देता है या कई संसाधनों का उपभोग करता है)। दोनों उदाहरण एक समय आधारित सीमक का उपयोग करते हैं।
  • भाषा चलाने के लिए दुभाषिया। LUA इन दिनों बहुत आम है।
  • एपीआई कॉल का एक सेट जो खेल की दुनिया को संशोधित करता है। यदि आप इसके साथ कुछ नहीं कर सकते हैं, तो एक प्रोग्रामिंग भाषा क्या मज़ेदार है।
  • एक संसाधन प्रबंधन कार्यान्वयन। दूसरे शब्दों में कोड फ़ाइलों को स्टोर करने और उन्हें गेम में संदर्भित करने का एक तरीका है।

प्रोग्रामिंग की एक भी शाखा नहीं है जो इन सभी चिंताओं को संभालती है। लेकिन आपको मल्टी-थ्रेडिंग में एक मजबूत नींव की आवश्यकता होगी, और एक सामान्य ज्ञान कि दुभाषिया कैसे काम करता है।


0

संकलित निष्पादन योग्य में एक पार्सर होना चाहिए जो बाहरी प्रोग्राम कोड को पढ़ने में सक्षम हो । प्रोग्राम कोड को C या Python या xyz की तरह नहीं दिखना चाहिए - यह किसी भी प्रकार का वर्णनात्मक डेटा हो सकता है जो प्रश्न में उद्देश्य के लिए उपयुक्त है। उदाहरण के लिए सनी, या मोर्स।

बाहरी प्रोग्राम कोड को एक सिंटैक्स की आवश्यकता होती है , ताकि पार्सर इसे समझता है क्योंकि यह चरित्र द्वारा इसे पढ़ता है। सिंटैक्स का वर्णन (और कोड हो सकता है) पहचानकर्ता, संख्यात्मक मान, ऑपरेटर आदि हो सकता है

पार्सर तय (संकलित) है, लेकिन यह लचीला, बाहरी कोड पर काम करता है।

संकलित निष्पादन योग्य के पास प्रासंगिक कार्यक्षमता के लिए एक आंतरिक एपीआई होना चाहिए । ताकि पार्सर कार्रवाई कर सके। सबसे अधिक संभावना है कि निष्पादन योग्य के आंतरिक डेटा तक (द्वि-दिशात्मक) पहुंच होनी चाहिए, या पार्सर को किसी प्रकार का डेटा भंडारण और हाउसकीपिंग प्रदान करना होगा।

पार्सर निष्पादन के पर बाहरी प्रोग्राम कोड को पढ़ सकता है स्टार्टअप , या यह (के कुछ हिस्सों) पढ़ सकते हैं यह तदर्थ , या यह कर सकते हैं फिर से पढ़ें यह प्रत्येक फ्रेम प्रति (अक्षम हो जाएगा), या कोड भी हो सकता है हाथ से टाइप किया और पार्सर को पोस्ट किया गया क्योंकि यह तैयार हो जाता है (जैसे: "यूनिट एक्स को 5 कदम आगे बढ़ाएं" [दर्ज करें])।

अनिवार्य रूप से, बाहरी कोड तय नहीं है - यह किसी भी वर्ष, दिन या मिनट को बदल सकता है, लेकिन फिर भी निष्पादन योग्य आवश्यकता को फिर से संकलित नहीं किया जाना चाहिए। केवल परिणामी व्यवहार, निष्पादन योग्य द्वारा होस्ट किया गया, बदलता है।

अभी आप जो पाठ पढ़ रहे हैं, वह (तरह, और इससे भी अधिक अगर यह बोला गया था) व्याख्या की गई है क्योंकि आप इसे पढ़ते समय अपने दिमाग में इसे "निष्पादित" करते हैं, बिना यह जाने कि अगला वाक्य क्या कहता है (या यहां तक ​​कि अगर यह संभवतः, चुपके से सही बदलता है अभी व)। स्टैक ओवरफ्लो (पूर्व) के विरोध के रूप में आपके दिमाग में पूरी कहानी को बायटेकोड में संकलित किया जाता है, जो तब इसे क्रियान्वित करता है - और toc तो यह किसी भी लंबे समय तक नहीं बदल सकता है।

Phenomen चल interpretion है। स्क्रिप्टिंग केवल एक deSCRIPTION बनाने या लिखने का कार्य है । सभी कंप्यूटर कोडिंग इमो स्क्रिप्टिंग है - हम वर्णन करते हैं कि हम क्या होना चाहते हैं। शब्द "स्क्रिप्टिंग" का अर्थ कुछ हद तक झुका हुआ है, लेकिन इतना ठीक है। हम जानते हैं कि हमारा क्या मतलब है।

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

sock = Socket.New (AddressFamily.InterNetwork, SocketType.Stream ProtocolType.Tcp) [ENTER]

... और फिर 30 के लिए जाना ... नहीं, 45 मिनट कॉफी ब्रेक :-)। लौटते समय, "जुर्राब" मौजूद होता है और हाथ से अधिक टाइप करके आगे के उपयोग के लिए तैयार होता है, या दुभाषिया के स्वचालन को जारी रखने देता है।


एक आम गलत धारणा है कि व्याख्या की जाने वाली भाषा धीमी होनी चाहिए। यह सच नहीं है। विभिन्न कारकों पर निर्भर करता है जो इस चर्चा को टिप्पणियों के लिए बहुत व्यापक बनाते हैं, व्याख्या की गई भाषा एक परिमाण या कम धीमी हो सकती है, जितनी तेजी से या कुछ संचालन के लिए भी नियंत्रण भाषा की तुलना में तेज हो सकती है जिसे तेजी से माना जाता है (आमतौर पर सी)। सॉकेट वाला उदाहरण संभवतः C की तरह अधिक या कम काम करेगा, इसलिए उदाहरण भ्रामक है। आप कुछ भाषाओं में रनटाइम पर संकलित कार्यों को फिर से परिभाषित कर सकते हैं, और व्याख्या करने का मतलब यह नहीं है कि "उस समय एक निर्देश" जा रहा है।
मैथ्यूॉक

ज़रूर, एक व्याख्या की गई भाषा और भी तेज़ी से प्रदर्शन कर सकती है - आखिरकार यह बायटेकोड है जो निष्पादित करता है, और दुभाषिया के स्वचालन के आधार पर निष्पादन बेहतर तरीके से अनुकूलित किया जा सकता है। इसके अतिरिक्त, कुछ दुभाषिए, कोड से, कोड के कुछ हिस्सों को बायटेकोड (और निष्पादित), एड हॉक में संकलित कर सकते हैं, उदाहरण केवल स्वतंत्रता का एक उदाहरण है, "समय पर एक निर्देश जा रहा है"? अच्छी तरह से कि एक oversimplification है, शायद "भविष्य कोड लचीला है, जबकि" जोड़ें।
स्टॉर्मविंड

एक फिल्म स्क्रिप्ट की तरह "स्क्रिप्ट" के बारे में सोचें - आपको अभी भी अभिनेताओं की ज़रूरत है, और ये सीधे जीव विज्ञान और समाजशास्त्र के संदर्भ में परिभाषित किए जाते हैं, न कि थियेटर विज्ञान (हालांकि ये अंत में जीव विज्ञान और समाजशास्त्र पर आधारित हैं), क्योंकि ये भाषाएं अधिक हैं उस उद्देश्य के लिए उपयुक्त है, लेकिन अन्य नहीं :)
रैकैंडबॉमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.