एक MUD- शैली पाठ आधारित दुनिया में स्तरों / कमरों का आयोजन


12

मैं एक छोटे से पाठ-आधारित साहसिक खेल को लिखने के बारे में सोच रहा हूं, लेकिन मुझे विशेष रूप से यकीन नहीं है कि मुझे तकनीकी दृष्टिकोण से दुनिया को कैसे डिजाइन करना चाहिए।

मेरा पहला विचार इसे एक्सएमएल में करना है, जिसे कुछ इस तरह बनाया गया है। एक्सएमएल के विशाल ढेर के लिए माफी, लेकिन मुझे यह महसूस करना महत्वपूर्ण था कि मैं क्या कर रहा हूं।

<level>
    <start>
        <!-- start in kitchen with empty inventory -->
        <room>Kitchen</room>
        <inventory></inventory>
    </start>
    <rooms>
        <room>
            <name>Kitchen</name>
            <description>A small kitchen that looks like it hasn't been used in a while. It has a table in the middle, and there are some cupboards. There is a door to the north, which leads to the garden.</description>
            <!-- IDs of the objects the room contains -->
            <objects>
                <object>Cupboards</object>
                <object>Knife</object>
                <object>Batteries</object>
            </objects>
            </room>
        <room>
            <name>Garden</name>
            <description>The garden is wild and full of prickly bushes. To the north there is a path, which leads into the trees. To the south there is a house.</description>
            <objects>
            </objects>
        </room>
        <room>
            <name>Woods</name>
            <description>The woods are quite dark, with little light bleeding in from the garden. It is eerily quiet.</description>
            <objects>
                <object>Trees01</object>
            </objects>
        </room>
    </rooms>
    <doors>
        <!--
            a door isn't necessarily a door.
            each door has a type, i.e. "There is a <type> leading to..."
            from and to are references the rooms that this door joins.
            direction specifies the direction (N,S,E,W,Up,Down) from <from> to <to>
        -->
        <door>
            <type>door</type>
            <direction>N</direction>
            <from>Kitchen</from>
            <to>Garden</to>
        </door>
        <door>
            <type>path</type>
            <direction>N</direction>
            <from>Garden</type>
            <to>Woods</type>
        </door>
    </doors>
    <variables>
        <!-- variables set by actions -->
        <variable name="cupboard_open">0</variable>
    </variables>
    <objects>
        <!-- definitions for objects -->
        <object>
            <name>Trees01</name>
            <displayName>Trees</displayName>
            <actions>
                <!-- any actions not defined will show the default failure message -->
                <action>
                    <command>EXAMINE</command>
                    <message>The trees are tall and thick. There aren't any low branches, so it'd be difficult to climb them.</message>
                </action>
            </actions>
        </object>
        <object>
            <name>Cupboards</name>
            <displayName>Cupboards</displayName>
            <actions>
                <action>
                    <!-- requirements make the command only work when they are met -->
                    <requirements>
                        <!-- equivilent of "if(cupboard_open == 1)" -->
                        <require operation="equal" value="1">cupboard_open</require>
                    </requirements>
                    <command>EXAMINE</command>
                    <!-- fail message is the message displayed when the requirements aren't met -->
                    <failMessage>The cupboard is closed.</failMessage>
                    <message>The cupboard contains some batteires.</message>
                </action>
                <action>
                    <requirements>
                        <require operation="equal" value="0">cupboard_open</require>
                    </requirements>
                    <command>OPEN</command>
                    <failMessage>The cupboard is already open.</failMessage>
                    <message>You open the cupboard. It contains some batteries.</message>
                    <!-- assigns is a list of operations performed on variables when the action succeeds -->
                    <assigns>
                        <assign operation="set" value="1">cupboard_open</assign>
                    </assigns>
                </action>
                <action>
                    <requirements>
                        <require operation="equal" value="1">cupboard_open</require>
                    </requirements>
                    <command>CLOSE</command>
                    <failMessage>The cupboard is already closed.</failMessage>
                    <message>You closed the cupboard./message>
                    <assigns>
                        <assign operation="set" value="0">cupboard_open</assign>
                    </assigns>
                </action>
            </actions>
        </object>
        <object>
            <name>Batteries</name>
            <displayName>Batteries</displayName>
            <!-- by setting inventory to non-zero, we can put it in our bag -->
            <inventory>1</inventory>
            <actions>
                <action>
                    <requirements>
                        <require operation="equal" value="1">cupboard_open</require>
                    </requirements>
                    <command>GET</command>
                    <!-- failMessage isn't required here, it'll just show the usual "You can't see any <blank>." message -->
                    <message>You picked up the batteries.</message>
                </action>
            </actions>
        </object>
    </objects>
</level>

जाहिर है कि इसे इससे कहीं अधिक होना चाहिए। लोगों और दुश्मनों के साथ-साथ मृत्यु और पूर्णता के साथ सहभागिता आवश्यक जोड़ हैं। चूंकि XML के साथ काम करना काफी मुश्किल है, मैं शायद किसी तरह का विश्व संपादक बनाऊंगा।

मैं जानना चाहता हूं कि क्या इस पद्धति में कोई कमी है, और यदि कोई "बेहतर" या इसे करने का अधिक मानक तरीका है।


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

अच्छी बात। हालाँकि, मैंने देखा है कि खेल पहले भी इस तरह की शैलियों का उपयोग करते हैं और वे वास्तव में प्रतिबंधक बने हैं। इस मामले में, हालांकि, खेल का प्रवाह और तर्क काफी सरल है, इसलिए यह अच्छी तरह से काम कर सकता है और मुझे स्क्रिप्टिंग इंजन को लागू करने से बचा सकता है। मुझे मुख्य रूप से दिलचस्पी है कि इस तरह की एक निश्चित संरचना (अलग कमरे, दरवाजे, ऑब्जेक्ट, एक परिभाषा फ़ाइल में चर कहीं) व्यवहार्य है या नहीं।
बहुपद

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

जवाबों:


13

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

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

किसी भी प्रकार के बाइनरी को अधिकांश आधुनिक इंटरेक्टिव फिक्शन दुभाषियों द्वारा चलाया जा सकता है (पुराने दिनों में, आपको अक्सर ग्लूक्स गेम्स से ZMachine गेम से TADS गेम्स के लिए अलग-अलग दुभाषियों की आवश्यकता होती थी। लेकिन शुक्र है, उन दिनों मूल रूप से अब खत्म हो चुके हैं। इंटरप्रेनर्स बस के लिए उपलब्ध हैं। किसी भी मंच के बारे में आप चाहते हैं; Mac / PC / लिनक्स / बीएसडी / iOS / Android / Kindle / ब्राउज़र / आदि। तो आप पहले से ही क्रॉस-प्लेटफ़ॉर्म अच्छी तरह से प्राप्त कर चुके हैं और सही मायने में ध्यान रखते हैं।

अधिकांश प्लेटफार्मों के लिए, वर्तमान में अनुशंसित दुभाषिया गार्गॉयल है , लेकिन अन्य बहुत सारे हैं, इसलिए प्रयोग करने में संकोच न करें।

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

"My Game" by Polynomial

Kitchen is a room. "A small kitchen that looks like it hasn't been used in a 
while. It has a table in the middle, and there are some cupboards. There is a 
door to the north, which leads to the garden."

In the Kitchen is a knife and some cupboards.  The cupboards are fixed in 
place and closed and openable.  In the cupboards are some batteries.

Garden is north of Kitchen. "The garden is wild and full of prickly bushes. 
To the north there is a path, which leads into the trees. To the south there 
is a house."

Woods is north of Garden.  "The woods are quite dark, with little light bleeding 
in from the garden. It is eerily quiet."  

Trees are scenery in the Woods.  "The trees are tall and thick. There aren't any 
low branches, so it'd be difficult to climb them."

जबकि TADS एक पारंपरिक प्रोग्रामिंग भाषा की तरह दिखता है, और TADS में एक ही खेल इस तरह दिखता है:

#charset "us-ascii"
#include <adv3.h>
gameMain: GameMainDef
    initialPlayerChar = me
;
versionInfo: GameID
    name = 'My Game'
    byline = 'by Polynomial'
;
startroom: Room                  /* we could call this anything we liked */ 
    roomName = 'Kitchen'         /* the displayed "name" of the room */ 
    desc = "A small kitchen that looks like it hasn't been used 
            in a while. It has a table in the middle, and there 
            are some cupboards. There is a door to the north, 
            which leads to the garden." 
    north = garden         /* where 'north' will take us */ 
; 

+me: Actor
; 

cupboards: OpenableContainer
    vocabWords = 'cupboard/cupboards' 
    name = 'cupboards' 
    isPlural = true
    location = startroom 
; 
battery: Thing
    name = 'battery'
    location = cupboards
;
knife: Thing
    name = 'knife'
    location = startroom
;
garden: Room
    roomName = 'Garden'
    desc = "The garden is wild and full of prickly bushes. To the 
            north there is a path, which leads into the trees. To 
            the south there is a house." 
    north = woods
    south = startroom
; 
woods: Room
    roomName = 'Woods'
    desc = "The woods are quite dark, with little light bleeding 
            in from the garden. It is eerily quiet."
    south = garden
;
trees: Decoration
    desc = "The trees are tall and thick. There aren't any low 
            branches, so it'd be difficult to climb them."
    location = woods
;

दोनों प्रणालियां स्वतंत्र रूप से उपलब्ध हैं, बहुत बार उपयोग की जाती हैं, और ट्यूटोरियल प्रलेखन के प्रचुर मात्रा में उपलब्ध हैं (ऊपर दिए गए लिंक से उपलब्ध है), इसलिए यह उन दोनों की जांच करने और आपको पसंद करने वाले को चुनने के लायक है।

ध्यान दें कि दोनों प्रणालियों में अलग-अलग मानक व्यवहार हैं (हालाँकि दोनों को संशोधित किया जा सकता है)। यहाँ खेल का एक स्क्रीनशॉट खेला जा रहा है, जो सूचना स्रोत से संकलित किया गया है:

स्क्रीनशॉट को सूचित करें

और यहाँ खेल खेला जा रहा है (टर्मिनल के अंदर - टाइपोग्राफी इस से बहुत अच्छे हो सकते हैं), जैसा कि टैड्स स्रोत से संकलित किया गया है:

TADS3 स्क्रीनशॉट

नोट करने के लिए दिलचस्प बिंदु: TADS आपको डिफ़ॉल्ट रूप से शीर्ष दाईं ओर एक 'स्कोर' डिस्प्ले देता है (लेकिन आप इसे बंद कर सकते हैं), जबकि इंफो (लेकिन आप इसे चालू नहीं कर सकते)। सूचना डिफ़ॉल्ट रूप से आपको कमरे के विवरण में वस्तुओं के खुले / बंद राज्यों को बताएगी, टैड्स नहीं करेंगे। खिलाड़ी आदेशों को पूरा करने के लिए टैड्स स्वचालित रूप से आपके लिए कदम उठाता है (जब तक कि आप इसे नहीं बताते हैं), जहां सूचित न करें (जब तक आप इसे नहीं बताते)।

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


यह बहुत अच्छा और जानकारीपूर्ण है, लेकिन imo सवाल का जवाब नहीं देता है। मैं मूल रूप से यह सटीक एक ही सवाल पूछने जा रहा था। मैं इस बारे में अधिक जानना चाहूंगा कि यह XML एक वैध दृष्टिकोण है या नहीं या अगर इसमें कोई कमी या खामी है।
DLeh

1
@DLeh प्रश्न था "मैं जानना चाहता हूं कि क्या इस पद्धति में कोई कमी है, और यदि कोई" बेहतर "या इसे करने का अधिक मानक तरीका है" तो यह उत्तर बेहतर-और-मानक-तरीका-का- प्रदान करता है कर रहा है
ट्रेवर पॉवेल

लेकिन जब से आपने "कमियों और कमजोरियों" के बारे में पूछा: इंफॉर्म इंप्लीमेंटेशन 19 लाइन लंबी है। TADS का उदाहरण 40 लाइनों का है। एक्सएमएल कार्यान्वयन के लिए 126 लाइनों की आवश्यकता होती है (और यह तब भी लंबा होगा जब यह शब्द 80-स्तंभों पर लिपटा हुआ था और इसमें सुस्पष्टता के लिए व्हाट्सएप था, जिस तरह से सूचना और टाड्स कार्यान्वयन करते हैं)।
ट्रेवर पॉवेल

बहुत कम होने के अलावा, इंफो और टाड्स उदाहरण भी अधिक सुविधाओं का समर्थन करते हैं। उदाहरण के लिए, उन दोनों में आप चाकू को अलमारी में रख सकते हैं, जो XML संस्करण में बिल्कुल भी समर्थित नहीं है।
ट्रेवर पॉवेल

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