لعب ألعاب المغامرات النصية هو متعة خالصة ، لكن المتعة تستهلك الكثير من العقول. ولكن اليوم لدينا كل هذه القدرات المعالج الخمول.
ماذا لو جعلنا الكمبيوتر يمر باللعبة بمفردنا ، ويمكننا أن نميل فقط على الكرسي ومشاهدته؟ نحن لسنا بحاجة إلى كل هذه الشبكات العصبية الجديدة ، بل إلى القوة الغاشمة البسيطة.
نحن فقط نسقط مجموعة من النص شبه العشوائي عند مدخل اللعبة النصية ونرى ما سيحدث. في عالم أمن المعلومات ، وهذا ما يسمى الغموض.
سيكون الهدف هو Z-Machine ، وهو مترجم آلي افتراضي تم تطويره بواسطة Joel Berez و Mark Blanck في عام 1979 ، قلب ألعاب Infocom. هذا هدف مثالي للمغامرة ، حيث إنه موثق جيدًا وله العديد من الأدوات والمكتبات الداعمة.
إطلاق Zork على جهاز Atari 800XL (Sebastian Grunwald، CC 3.0)ميني زورك
اللعبة التي
سنشعر بها -
MINI-ZORK-1: The Great Underground Empire . هذا إصدار تجريبي من Infokomovsky أولاً Zorka ، مصمم للتشغيل من شريط كاسيت ، وليس من قرص مرن. في الأساس ، كان إعلانًا تم نشره في التسعينات من القرن العشرين لمجلة المستخدم البريطاني في Commodore ،
Zzap! 64 .
بالنسبة لأولئك الذين لم يلعبوا Zork ، إليك ما تراه بعد تحميل اللعبة:
MINI-ZORK I: The Great Underground Empire Copyright (c) 1988 Infocom, Inc. All rights reserved. ZORK is a registered trademark of Infocom, Inc. Release 34 / Serial number 871124 West of House You are standing in an open field west of a white house, with a boarded front door. You could circle the house to the north or south. There is a small mailbox here. >
تلميح> يدعو المستخدم لإدخال أوامر مثل OPEN MAILBOX أو GO NORTH للتقدم في اللعبة. الهدف هو "العثور على كنوز الإمبراطورية العظيمة الكبرى وجمعها في صندوق المسروقات الخاص بك" على طول الطريق لحل الألغاز وسقوط الأعداء.
هيا نلعب البحث عن الأفعال (والأسماء)
دليل المستخدم الكامل مع Zork يعطي أمثلة على الأوامر المحتملة مثل OPEN THE WOODEN DOOR و WARLOCK ، خذ SPELL SCROLL THEN FOLLOW ME. ومع ذلك ، كان على المستخدمين أن يخمنوا بشكل مستقل كيفية حل لغز معين.
الأفعال مثل GET و DROP (GET / DROP) واضحة تمامًا ، مثل النقاط الأساسية الثمانية القياسية وأعلى / لأسفل (UP / DOWN) ، وفي الوقت نفسه داخل وخارج (IN / OUT). لكن كان على المستخدمين أيضًا استخدام ATTACK و POOL و PRAY ، وكذلك نطق الكلمات السحرية التي لم تكن موجودة في الدليل. الوضع عندما لم تقدم اللعبة أدلة كافية للاعبين ، أطلقوا على السخرية "صيد الأفعال".
لإنشاء أوامر ، سيحتاج fuzzer إلى قائمة بالكلمات المقبولة من قبل اللعبة ، والمفردات الخاصة بها. تحدد Z-machine هذه القائمة كقاموس لعبة (وهي موجودة في مكان قياسي في ملف كل لعبة).
(هذا نوع من عملية الاحتيال ، نعم! ولكن في الحقيقة لا توجد طريقة أخرى لتوضيح ما تستخدمه للكمبيوتر ، لأن بعض الأفعال لم يتم ذكرها في أي مكان في النص.)
أسهل طريقة لإنشاء أوامر هي أن تأخذ بشكل عشوائي كلمة أو أكثر ، في حالتنا ، واحدة أو كلمتين. لا نعرف الكلمات التي هي أفعال ، وأي أسماء ، لذلك نحن نولد الكثير من الأوامر الغريبة مثل "SEE OOPS" و "DRIVER BELOW".
من الواضح أن هذا غير فعال تمامًا ، لأنه يتعين علينا فرز مجموعات N * N (حيث N هو حجم المفردات) للعثور على الأمر ذاته مثل "KILL TROLL".
ومع ذلك ، يمكننا خداع قليلا. سنقوم بمسح جميع الكلمات في إخراج النص للعبة وسوف نختار الكلمات الموجودة في قاموسنا. واختر كلمة من هذه القائمة (بدلاً من القاموس الكامل). على سبيل المثال ، إذا رأينا NORTH و WEST و HOUSE و MAILBOX في النص ، فمن الأرجح أن نستخدم هذه الكلمات.
البحث عن علامات القصة
بمجرد إعطاء أوامر عشوائية ، نحصل على الكثير من الهراء الذي يقسم به المحلل اللغوي:
>about painti [ !] >leathe guideb [ "leathe" , .]
(كلمات المفردات لا يزيد طولها عن ستة أحرف في Z-Machine ، لذلك نقوم بإنشاء كلمات مثل "leathe".)
ومع ذلك ، فإن مثل هذا ستومب على الفور يستغرق إلى الأبد. كيف يمكننا تحديد المسارات الأكثر وعدًا من غيرها؟ سوف نبحث عن علامات للترويج للقصة.
يحتوي Z-Machine على تعليمات PRINT التي تطبع النص على وحدة التحكم. غالبًا ما تكون هذه الأجزاء من الأوصاف ، مثل "غرب المنزل" و "الزجاجة المحطمة". سنقوم بتسجيل كل منهم كعلامة.
كلما رأينا علامة جديدة ، فإننا نحفظ المقطع الحالي - قائمة بالفرق التي أداؤها في اللعبة الحالية.
نحن نربط هذه القائمة مع العلامة الحالية ، حتى نتمكن من (نأمل) الحصول على النص نفسه في الإخراج بعد إعادة تشغيل نفس الأوامر.
يحدد كل إطلاق للعبة علامة هدف محددة ، وبالتالي ، الممر المرتبط بها. تحدد خوارزمية البحث علامات جديدة أكثر من العلامات القديمة.
لن نعيد عرض الفرق حرفيًا في كل لعبة ، لكننا سنضيف بعض الفرق العشوائية ، ونمزج الترتيب. عندما نرى علامة جديدة ، سنزيد معلمة "النجاح" ، والتي سيظهر نموها أنه من الممكن تغيير قائمة الأوامر في كثير من الأحيان. عندما تنمو هذه المعلمة بشكلٍ كافٍ ، نحتفل بهذه العلامة على أنها "مستقرة" ، نظرًا لوجود مرور يمكن التنبؤ به يؤدي إلى ذلك.
تبحث عن طريق قصير
غالبًا ما تكون الطرق التي نمارسها في اللعبة غير فعالة. فيما يلي قائمة بالأوامر التي تم استخدامها لإنشاء علامة "Wheeeeeeeeee !!!!!":
curse, art, body gate, incant count, the, the egg, repent, from the, the consum, what, leathe, trap- see, breath here, what intnum, about here, leathe guideb, about, about here, pot, here, see, here about, about, self, here about, mangle, see, rug, the, reply, elvish, say, stilet beetle, say toss, pray, gate about, what bolt, guideb, wooden, say knock, say sit, trail and, here, pray leathe, intnum, one, pray one, jump
كل ما نحتاج فعلاً هو إدخال الأمر الأخير: JUMP (أو DIVE). لكن خوارزمية البحث لا تعرف أيًا من الأوامر السابقة المطلوبة لعرض "Wheeeeeeeeee !!!!!"
نحن بحاجة إلى الحد من مرور - لجعلها قصيرة قدر الإمكان. عندما نرى علامة ، فإننا نستبدل المقطع المرتبط بقائمة قصيرة من الأوامر ، إن أمكن. هذا يقودنا إلى علامة الهدف بشكل أسرع ، مما يتيح لنا المزيد من التحركات للتجربة بعد الوصول إلى الهدف.
العديد من العلامات ، مثل "Wheeeeeeeeee !!!!!" ، ليست مثيرة للاهتمام ، حيث يمكننا تحقيقها في وقت واحد في بداية اللعبة. بتقليل قائمة الأوامر الخاصة بهم ، سنكون قادرين في النهاية على تأكيد أن هذه هي الحالة ، وبالتالي إزالتها من قائمة العلامات المستهدفة المحتملة.
أكثر من الكلمات
نظرًا لأن لدينا إمكانية الوصول المباشر إلى الحالة الداخلية للجهاز Z ، يمكننا استخدام شيء آخر غير إخراج النص للتحكم في بحثنا. على سبيل المثال ، يمكننا إصلاح عندما ينتقل كائن من غرفة إلى أخرى ، أو عندما تتغير خصائص وأعلام أخرى على الكائن. يطلق عليه علامات VM (علامات الجهاز الظاهري) ، وإصلاح لهم بالتوازي مع علامات النص:
@mv_30_15 (#30) #15 @f_176_10_1 "" (10) ""(#176)
نحن بحاجة إلى هذا لأن إخراج النص لا يخبرنا القصة بأكملها. على سبيل المثال ، عند التقاط السيف أو المصباح ، سنصل إلى نفس العلامة "Taken". وستحدد علامة VM خوارزمية البحث عند الوصول إلى حالة جديدة من الجهاز الظاهري ، على سبيل المثال ، عندما ينتقل اللاعب إلى غرفة جديدة ، أو عندما يتم التقاط كائن أو إلقاؤه.
كسر الجهاز الظاهري
التحقيق في حالة اللعبة هو عملية بطيئة إلى حد ما. إحدى المهام الأولى في اللعبة هي قتل القزم ، الذي لا يسمح لك بالمضي قدمًا. ومع ذلك ، قبل ذلك ، يحتاج اللاعب إلى العثور على سيف في المنزل أعلى قليلاً.
من أجل تسريع عملية البحث ، سنقوم بتكسير Z-machine وننقل حالة اللعبة إلى ما رأيناه سابقًا. على سبيل المثال ، قمنا بطرح السيف بطريق الخطأ في يد اللاعب ، مما مكّن من تنفيذ الأمر "STAB" بنجاح. ("ATTACK TROLL" لن تعمل إلا إذا أضفنا "WITH SWORD" ، ولكن "STAB" (الطعن) يعني بالفعل وجود كائن حاد وبالتالي يعمل.)
سنقوم فقط بتكسير علامات مستقرة ، لذلك إذا تمكنا من تكرار اللعبة بشكل موثوق وتبين أن أيدي اللاعب هي سيف ، فسوف نسمح باختراق هذه الحالة: "السيف في يد اللاعب". ثم يمكننا الجمع بين الفرق المستخدمة لرفع السيف مع الفرق التي اعتادت النزول في الأبراج المحصنة ، ومعرفة الطريقة التي يجب أن نهاجم بها القزم.
مثال القزم هو اليسوعي بشكل خاص ، لأنه ، كقاعدة عامة ، يتطلب الأمر عدة ضربات لإنهائه ، ويعطي كل هجوم نتيجة عشوائية. نظرًا لأن الخوارزمية تفضل التمريرات الأقصر ، فمن الأفضل الالتزام بتوقعات متفائلة بشأن قدراتنا القتالية.
بعد 530،000 تجول و 10،600،000 فريق (200 فريق لكل لعبة) ، اكتشفنا أخيرًا كيفية مهاجمة القزم:
north, east, open window, into, west, light, lift trap, small hi, get, west, light, tug large, lift trap, down, north, stab
لا تزال هناك بعض الأوامر غير الضرورية ، وما زلنا لا نفهم أن علينا ضربه عدة مرات ، لكن يمكننا التعامل معه.
هواية قاتلة
لا تعرف خوارزمية البحث الفرق بين تجميع الكائنات ورمي الأشياء ونقل اللاعب من غرفة إلى أخرى. الطريقة الوحيدة التي يحدد بها التقدم هي رؤية علامات التاريخ تتقدم.
هذا يتطور بسرعة في خوارزمية البحث طعم ل ... القتل! لقتل لاعب ، على وجه الخصوص ، لأنه سهل وبسيط: أدخل "الهجوم":
>attack [ ] , ! **** **** , , . , . c-. , .
في Mini Zorka ، الوفاة الأولى ليست نهاية اللعبة ، حيث يقوم اللاعب بالانتقال إلى مكان آخر ، وتنتشر الأشياء الخاصة بك. بالنسبة لخوارزمية البحث ، الموت هو مجرد كائن ينتقل من غرفة إلى أخرى ، مما يخلق علامات لتحريك القصة على طول الطريق. تؤدي هذه الهواية إلى كشف أخطاء مضحكة أخرى في اللعبة ، مثل قدرة اللاعب على رمي يديه في النهر.
تسجل اللعبة من 0 إلى 350 نقطة ، بناءً على حل الألغاز وجمع الكنوز. عندما يموت اللاعب ، يتم تخفيضه بمقدار 10 نقاط. يمكننا استخدام الحساب كمرشد إرشادي ، ولكن هذا يمكن أن يقلل بشكل مفرط من السلوك المحفوف بالمخاطر - حب التجول في الأماكن المظلمة ، أو قتال المتصيدون.
تهتم أيضًا خوارزمية البحث بشدة بما لا يراه اللاعب ، مثل التنقل بين الغرف. على سبيل المثال ، تشير العلامة @ mv_112_37 إلى حركة لص إلى غرفة معينة. تمكن خوارزمية البحث من إعادة إنتاج هذه العلامة عن طريق تنفيذ أوامر Z أو WAIT بشكل متكرر ، متوقعًا أن يصل اللص إلى الغرفة المستهدفة.
يحب أيضًا التقاط الأشياء ورميها في أماكن مختلفة ، لأن كل حركة للكائن هي علامة جديدة. من يعرف ربما يؤدي رمي هذه الورقة على طريق الغابة إلى النصر في اللعبة! (الراوي: لا ، لن.)
يعرّف الدمج الأخطاء في البرنامج ، وهذه اللعبة لا تختلف ، على الرغم من أنها لا تزال قائمة. اكتشف كيف تولد كلمة "كلرتاترقق" في بداية اللعبة:
>tie up [ ] With a Clrthatrqdc!?!
يبدو أن هذا متغير غير مهيأ يشير إلى بيانات غير نصية. يكون ترميز النص المضغوط في Z-machine في الغالب أبجديًا ، لأنك لا ترى الكثير من البيانات العشوائية العشوائية كما هو الحال عند محاولة طباعة ملف ثنائي مثل ASCII. (حاليًا ، هذه الكلمة
ليست سوى مرتين على Google (
بالفعل أربع مرات تقريبًا. ترجمة. ).)
غش
للفوز باللعبة ، سيتعين علينا سحب بضائعنا المنهوبة إلى صندوق المسروقات وإدخال كل شيء فيها. ستحتاج خوارزمية البحث البسيطة إلى وقت طويل حتى يتعثر هذا السلوك ، خاصة بالنظر إلى ميلها إلى إضاعة القوة والوقت في نقل الكائنات من غرفة إلى أخرى.
يستغرق تعقيد خوارزمية من البحث العشوائي وقتًا ، لذلك يجب أن نكون انتقائيين عند إضافة ميزات جديدة. نريد أيضًا تجنب المعرفة المسبقة في اللعبة - وبعبارة أخرى ، نحن نريد فقط الغش قليلاً.
إذا كنت ترغب في التجربة ،
تحقق من الكود المصدري على GitHub ، والذي يستخدم
JSZM (مترجم Z-Machine Daniel Legenbauer). تتوفر العديد من
الألعاب (يتم دعم الإصدارات فقط حتى 3.)
تتوفر أيضًا وثيقة Graham Nelson
Z-Standards Standards ، التي تتعامل مع Z-Machine منذ عدة عقود.
هل أحتاج إلى إضافة دعم Z-Machine في
متجر 8bitworkshop ؟ اسمحوا لي أن أعرف!