ताला और चाबी के साथ Pathfinding?


22

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

यह पहेली ज़ेल्डा-शैली की कालकोठरी के समान है, इस चित्र की तरह:

ज़ेल्डा कालकोठरी

लक्ष्य को प्राप्त करने के लिए, आपको बॉस को हराना होगा, जिसे गड्ढे के ऊपर जाने की आवश्यकता होती है, जिसमें पंख इकट्ठा करने की आवश्यकता होती है, जिसमें एक कुंजी को इकट्ठा करना पड़ता है

ज़ेल्डा डंगेन्स रैखिक होते हैं। हालांकि, मुझे सामान्य मामले में समस्या को हल करने की आवश्यकता है। इसलिए:

  • लक्ष्य को चाबियों के एक सेट की आवश्यकता हो सकती है। तो शायद आपको लाल कुंजी या नीली कुंजी प्राप्त करने की आवश्यकता है। या चारों ओर एक खुला दरवाजा हो सकता है!
  • एक तरह के कई दरवाजे और चाबियां हो सकती हैं। उदाहरण के लिए, नक्शे में कई लाल कुंजी हो सकती हैं, और एक को इकट्ठा करने से सभी लाल दरवाजों तक पहुंच मिल जाएगी।
  • लक्ष्य अप्राप्य हो सकता है क्योंकि बंद दरवाजों के पीछे सही चाबियां होती हैं

मैं ऐसे नक्शे पर पाथफाइंडिंग कैसे करूँगा? खोज ग्राफ़ कैसा दिखेगा?

नोट: दुर्गम लक्ष्यों का पता लगाने के बारे में अंतिम बिंदु महत्वपूर्ण है; उदाहरण के लिए A *, बेहद अक्षम है अगर लक्ष्य अप्राप्य है। मैं इससे कुशलतापूर्वक निपटना चाहूंगा।

मान लें कि AI जानता है कि नक्शे पर सब कुछ कहां है।


4
क्या एआई केवल उन चीजों को जानता और खोजता है, जो उन्हें अनलॉक करती हैं? जैसे, क्या यह पता है कि पंख बंद दरवाजे के पीछे है? क्या एआई अवधारणाओं को समझता है जैसे, "यह एक ताला है इसलिए मुझे एक कुंजी की आवश्यकता है" या कुछ और अधिक सरल है जैसे, "मुझे अपना रास्ता अवरुद्ध करना है, इसलिए उन सभी चीजों को आज़माएं जो मैंने इसे पाया है। दरवाजे पर पंख। नहीं।" दरवाजे पर चाबी? हाँ! "
टिम होल्ट

1
इस प्रश्न की पिछली कुछ चर्चा इस सवाल पर की गई थी कि आगे और पीछे के रास्ते के बारे में , जो आपके काम आ सकता है।
DMGregory

1
तो आप एक खिलाड़ी को अनुकरण करने की कोशिश नहीं कर रहे हैं, लेकिन एक अनुकूलित डंगऑन रन बनाने की कोशिश कर रहे हैं? मेरा जवाब निश्चित रूप से एक खिलाड़ी के व्यवहार का अनुकरण करने के बारे में था।
टिम होल्ट

4
दुर्भाग्य से एक दुर्गम लक्ष्य का पता लगाना काफी कठिन है। यह सुनिश्चित करने का एकमात्र तरीका है कि लक्ष्य तक पहुंचने का कोई रास्ता नहीं है, यह सुनिश्चित करने के लिए कि कोई भी एक लक्ष्य नहीं है, यह सुनिश्चित करने के लिए पूरी तरह से उपलब्ध जगह का पता लगाना है - जो कि A * करता है जो कि लक्ष्य के इतने अधिक कदम उठाता है। दुर्गम। कोई भी एल्गोरिथ्म जो अंतरिक्ष के कम जोखिमों को खोजता है, लक्ष्य के लिए उपलब्ध पथ को गायब कर देता है क्योंकि पथ उस स्थान के हिस्से में छिपा हुआ था जिसे खोज ने छोड़ दिया था। आप उच्च स्तर पर काम करके इसमें तेजी ला सकते हैं, हर टाइल या नवमेश बहुभुज के बजाय कमरे के कनेक्शन का ग्राफ खोज सकते हैं।
DMGregory

1
ऑफटॉपिक, मैंने सहज रूप से ज़ेल्डा :) के बजाय चिप के चैलेंज के बारे में सोचा :
फ्लेटर

जवाबों:


22

मानक पाथफाइंडिंग अच्छा पर्याप्त है - आपके राज्य आपके वर्तमान स्थान + आपकी वर्तमान सूची हैं। "मूविंग" या तो कमरे बदल रहा है या इन्वेंट्री बदल रहा है। इस उत्तर में कवर नहीं किया गया है, लेकिन बहुत अधिक अतिरिक्त प्रयास नहीं है, ए * के लिए एक अच्छा अनुमानी लिख रहा है - यह वास्तव में खोज को गति दे सकता है इससे दूर जाने के लिए चीजों को लेने से पहले, लक्ष्य के पास एक दरवाजे को खोलने के लिए प्राथमिकता देना। बहुत देर तक इधर-उधर खोजना, आदि।

इस उत्तर ने पहले से ही बहुत अधिक उत्थान प्राप्त किया है और इसमें एक डेमो है, लेकिन एक बहुत अधिक अनुकूलित और विशेष समाधान के लिए, आपको "इसे पीछे की ओर करना बहुत तेज है" उत्तर /gamedev/ पढ़ना चाहिए / एक / 150155/2624


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

पाथफाइंडिंग के बारे में सोचते समय शुरुआत करने के लिए, याद रखें कि सरल पाथफाइंडिंग एल्गोरिदम की उत्तराधिकारिणी है:

  • चौड़ाई पहली खोज के बारे में सरल के रूप में आप प्राप्त कर सकते हैं।
  • Djikstra का एल्गोरिथ्म चौड़ाई प्रथम खोज की तरह है, लेकिन राज्यों के बीच अलग-अलग "दूरी" के साथ
  • ए * जिरिकैस्टस है जहाँ आपके पास 'सही दिशा का सामान्य ज्ञान' है, जो एक अनुमानी के रूप में उपलब्ध है।

हमारे मामले में, एक "स्थिति + इन्वेंट्री" और "दूरी" के रूप में "आंदोलन या आइटम उपयोग" के रूप में एक "राज्य" को एन्कोडिंग करने से हमें अपनी समस्या को हल करने के लिए Djikstra या A * का उपयोग करने की अनुमति मिलती है।

यहां कुछ वास्तविक कोड आपके उदाहरण स्तर का प्रदर्शन कर रहे हैं। पहला स्निपेट केवल तुलना के लिए है - यदि आप अंतिम समाधान देखना चाहते हैं तो दूसरे भाग पर जाएं। हम एक Djikstra के कार्यान्वयन के साथ शुरुआत करते हैं जो सही रास्ता ढूंढता है, लेकिन हमने सभी बाधाओं और कुंजियों को अनदेखा कर दिया है। (इसे आज़माएं, आप इसे कमरे से 0 -> 2 -> 3-> 4-> 6-> 5) के लिए समाप्त होने के लिए बस beelines देख सकते हैं)

function Transition(cost, state) { this.cost = cost, this.state = state; }
// given a current room, return a room of next rooms we can go to. it costs 
// 1 action to move to another room.
function next(n) {
    var moves = []
    // simulate moving to a room
    var move = room => new Transition(1, room)
    if (n == 0) moves.push(move(2))
    else if ( n == 1) moves.push(move(2))
    else if ( n == 2) moves.push(move(0), move(1), move(3))
    else if ( n == 3) moves.push(move(2), move(4), move(6))
    else if ( n == 4) moves.push(move(3))
    else if ( n == 5) moves.push(move(6))
    else if ( n == 6) moves.push(move(5), move(3))
    return moves
}

// Standard Djikstra's algorithm. keep a list of visited and unvisited nodes
// and iteratively find the "cheapest" next node to visit.
function calc_Djikstra(cost, goal, history, nextStates, visited) {

    if (!nextStates.length) return ['did not find goal', history]

    var action = nextStates.pop()
    cost += action.cost
    var cur = action.state

    if (cur == goal) return ['found!', history.concat([cur])]
    if (history.length > 15) return ['we got lost', history]

    var notVisited = (visit) => {
        return visited.filter(v => JSON.stringify(v) == JSON.stringify(visit.state)).length === 0;
    };
    nextStates = nextStates.concat(next(cur).filter(notVisited))
    nextStates.sort()

    visited.push(cur)
    return calc_Djikstra(cost, goal, history.concat([cur]), nextStates, visited)
}

console.log(calc_Djikstra(0, 5, [], [new Transition(0, 0)], []))

तो, हम इस कोड में आइटम और कुंजियाँ कैसे जोड़ते हैं? सरल! हर "राज्य" के बजाय बस कमरा नंबर शुरू करें, यह अब कमरे और हमारे इन्वेंट्री राज्य का एक हिस्सा है:

 // Now, each state is a [room, haskey, hasfeather, killedboss] tuple
function State(room, k, f, b) { this.room = room; this.k = k; this.f = f; this.b = b }

अब परिवर्तन एक (लागत, कमरे) से टपल टू (कॉस्ट, अवस्था) में परिवर्तित हो जाते हैं, इसलिए तब "दूसरे कमरे में जाना" और "एक आइटम चुनना" दोनों को एन्कोड कर सकते हैं।

// move(3) keeps inventory but sets the room to 3
var move = room => new Transition(1, new State(room, cur.k, cur.f, cur.b))
// pickup("k") keeps room number but increments the key count
var pickup = (cost, item) => {
    var n = Object.assign({}, cur)
    n[item]++;
    return new Transition(cost, new State(cur.room, n.k, n.f, n.b));
};

अंत में, हम Djikstra फ़ंक्शन के लिए कुछ छोटे प्रकार से संबंधित परिवर्तन करते हैं (उदाहरण के लिए, यह अभी भी पूर्ण राज्य के बजाय लक्ष्य कक्ष संख्या पर मेल खा रहा है), और हमें अपना पूर्ण उत्तर मिलता है! ध्यान दें कि मुद्रित परिणाम पहले कुंजी लेने के लिए कमरा 4 में जाता है, फिर कमरे 1 में जाकर पंख उठाता है, फिर कमरे 6 में जाता है, बॉस को मारता है, फिर कमरे 5 में जाता है)

// Now, each state is a [room, haskey, hasfeather, killedboss] tuple
function State(room, k, f, b) { this.room = room; this.k = k; this.f = f; this.b = b }
function Transition(cost, state, msg) { this.cost = cost, this.state = state; this.msg = msg; }

function next(cur) {
var moves = []
// simulate moving to a room
var n = cur.room
var move = room => new Transition(1, new State(room, cur.k, cur.f, cur.b), "move to " + room)
var pickup = (cost, item) => {
	var n = Object.assign({}, cur)
	n[item]++;
	return new Transition(cost, new State(cur.room, n.k, n.f, n.b), {
		"k": "pick up key",
		"f": "pick up feather",
		"b": "SLAY BOSS!!!!"}[item]);
};

if (n == 0) moves.push(move(2))
else if ( n == 1) { }
else if ( n == 2) moves.push(move(0), move(3))
else if ( n == 3) moves.push(move(2), move(4))
else if ( n == 4) moves.push(move(3))
else if ( n == 5) { }
else if ( n == 6) { }

// if we have a key, then we can move between rooms 1 and 2
if (cur.k && n == 1) moves.push(move(2));
if (cur.k && n == 2) moves.push(move(1));

// if we have a feather, then we can move between rooms 3 and 6
if (cur.f && n == 3) moves.push(move(6));
if (cur.f && n == 6) moves.push(move(3));

// if killed the boss, then we can move between rooms 5 and 6
if (cur.b && n == 5) moves.push(move(6));
if (cur.b && n == 6) moves.push(move(5));

if (n == 4 && !cur.k) moves.push(pickup(0, 'k'))
if (n == 1 && !cur.f) moves.push(pickup(0, 'f'))
if (n == 6 && !cur.b) moves.push(pickup(100, 'b'))	
return moves
}

var notVisited = (visitedList) => (visit) => {
return visitedList.filter(v => JSON.stringify(v) == JSON.stringify(visit.state)).length === 0;
};

// Standard Djikstra's algorithm. keep a list of visited and unvisited nodes
// and iteratively find the "cheapest" next node to visit.
function calc_Djikstra(cost, goal, history, nextStates, visited) {

if (!nextStates.length) return ['No path exists', history]

var action = nextStates.pop()
cost += action.cost
var cur = action.state

if (cur.room == goal) return history.concat([action.msg])
if (history.length > 15) return ['we got lost', history]

nextStates = nextStates.concat(next(cur).filter(notVisited(visited)))
nextStates.sort()

visited.push(cur)
return calc_Djikstra(cost, goal, history.concat([action.msg]), nextStates, visited)
o}

console.log(calc_Djikstra(0, 5, [], [new Transition(0, new State(0, 0, 0, 0), 'start')], []))

सिद्धांत रूप में, यह बीएफएस के साथ भी काम करता है और हमें जिक्स्ट्रा के लिए लागत फ़ंक्शन की आवश्यकता नहीं थी, लेकिन लागत होने से हमें यह कहने की अनुमति मिलती है कि "एक कुंजी को उठाना आसान नहीं है, लेकिन एक मालिक से लड़ना वास्तव में कठिन है, और हम बल्कि पीछे रह जाएंगे बॉस से लड़ने के बजाय 100 कदम, अगर हमारे पास विकल्प था ":

if (n == 4 && !cur.k) moves.push(pickup(0, 'k'))
if (n == 1 && !cur.f) moves.push(pickup(0, 'f'))
if (n == 6 && !cur.b) moves.push(pickup(100, 'b'))

हां, खोज ग्राफ़ में इन्वेंट्री / कुंजी स्थिति सहित एक समाधान है। मैं हालांकि बढ़ी हुई अंतरिक्ष आवश्यकताओं के बारे में चिंतित हूँ - 4 कीज़ वाले एक मानचित्र में की-लेस ग्राफ़ की 16 गुना जगह की आवश्यकता होती है।
कॉंगसबोंगस

8
@congusbongus एनपी-पूर्ण यात्रा विक्रेता समस्या का स्वागत करते हैं। कोई सामान्य समाधान नहीं है जो कि बहुपद समय में हल करेगा।
शाफ़्ट फ्रीक

1
@ congusbongus मुझे आमतौर पर नहीं लगता कि आपका खोज ग्राफ़ इतना ओवरहेड होने जा रहा है, लेकिन यदि आप अंतरिक्ष के बारे में चिंतित हैं, तो बस अपना डेटा पैक करें - आप कमरे के संकेतक के लिए 24-बिट्स का उपयोग कर सकते हैं (16 मिलियन कमरे चाहिए) किसी के लिए भी पर्याप्त हो) और आपके द्वारा अंतर के रूप में उपयोग की जाने वाली वस्तुओं के लिए थोड़ा सा (8 अद्वितीय तक)। यदि आप कल्पना करना चाहते हैं, तो आप निर्भरता का उपयोग करके वस्तुओं को और भी छोटे टुकड़ों में पैक कर सकते हैं, अर्थात "कुंजी" और "बॉस" के लिए एक ही बिट का उपयोग कर सकते हैं, क्योंकि
जिमी

@ जिम्मी भले ही यह व्यक्तिगत नहीं है, मैं अपने जवाब के उल्लेख की सराहना करता हूं :)
जिब स्मार्ट

13

पीछे की ओर A * चाल चलेगा

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

इस उत्तर के निचले भाग में मेरा ब्रेक-डाउन है कि यह आपके द्वारा दिए गए उदाहरण को कैसे संभालता है।

विस्तार से

आरंभ से गंतव्य तक पथप्रदर्शक। यदि, आपके पाथफाइंडिंग में, आप एक बंद दरवाजे के पार आते हैं, तो आपके पास आपके पाथफाइंडिंग के लिए एक नई शाखा है जो कि दरवाजे के माध्यम से जारी रहती है जैसे कि इसे अनलॉक किया गया हो, मुख्य शाखा दूसरे रास्ते की तलाश में जारी रहती है। शाखा जो दरवाजे के माध्यम से जारी रहती है जैसे कि यह अनलॉक हो गई है, अब एआई एजेंट की तलाश नहीं कर रही है - यह अब एक कुंजी की तलाश में है जो दरवाजे से गुजरने के लिए उपयोग कर सकती है। ए * के साथ, इसकी नई हेयूरिस्टिक एआई एजेंट से दूरी + की दूरी है, बजाय एआई एजेंट से दूरी के।

यदि अनलॉक-डोर ब्रांच को कुंजी मिलती है, तो यह एआई एजेंट की तलाश जारी रखता है।

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

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


लड़ाई में

अपने विशिष्ट उदाहरण में, लक्ष्य से प्रारंभ तक की राह बनाना:

  1. हम जल्दी से एक बॉस के दरवाजे का सामना करते हैं। शाखा ए दरवाजे के माध्यम से जारी है, अब लड़ने के लिए एक मालिक की तलाश में है। ब्रांच बी कमरे में अटका रहता है, और जल्द ही यह समाप्त हो जाएगा जब यह पता चलता है कि कोई रास्ता नहीं है।

  2. शाखा ए मालिक को ढूंढती है और अब स्टार्ट की तलाश कर रही है, लेकिन एक गड्ढे का सामना करती है।

  3. शाखा ए गड्ढे के ऊपर जारी है, लेकिन अब यह पंख की तलाश कर रहा है, और तदनुसार पंख की ओर मधुमक्खी रेखा बना देगा। ब्रांच सी बनाई गई है जो गड्ढे के चारों ओर एक रास्ता खोजने की कोशिश करती है, लेकिन यह जल्द ही समाप्त हो जाती है। यह, या इसे थोड़ी देर के लिए नजरअंदाज कर दिया जाता है, अगर आपका ए * ह्यूरिस्टिक पाता है कि शाखा ए अभी भी सबसे आशाजनक दिख रही है।

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

  5. ब्रांच डी जल्दी से पंख ढूंढता है और कुंजी की तलाश जारी रखता है। इसे फिर से बंद दरवाजे से गुजरने की अनुमति है, क्योंकि यह अभी भी कुंजी की तलाश में है (और यह समय में पीछे की ओर काम कर रहा है)। लेकिन एक बार यह कुंजी हो जाने के बाद, यह बंद दरवाजे से नहीं गुजर पाएगा (क्योंकि यह चाबी मिलने से पहले ही बंद दरवाजे से नहीं गुजर सकता था)।

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

  7. शाखा डी जीतता है। इसका उल्टा रास्ता मिल गया है। अंतिम रास्ता है: प्रारंभ -> कुंजी -> पंख -> बॉस -> गोल।


6

संपादित करें : यह एक AI के दृष्टिकोण से लिखा गया है जो एक लक्ष्य का पता लगाने और खोजने के लिए बाहर है, और समय से पहले चाबियाँ, ताले या गंतव्य का स्थान नहीं जानता है।

पहले, मान लें कि AI में किसी तरह का समग्र लक्ष्य है। उदाहरण के लिए, अपने उदाहरण में "बॉस खोजें"। हाँ, आप इसे हरा देना चाहते हैं, लेकिन वास्तव में इसे खोजने के बारे में है। यह मान लें कि लक्ष्य को पाने का कोई विचार नहीं है, बस यह मौजूद है। और जब यह मिल जाएगा तब इसे पता चल जाएगा। एक बार लक्ष्य पूरा होने के बाद, एआई समस्या को हल करने के लिए काम करना बंद कर सकता है।

इसके अलावा, मैं यहां सामान्य शब्द "लॉक" और "की" का उपयोग करने जा रहा हूं, भले ही यह एक चैस और पंख हो। यानी, पंख "चैस" को "लॉक" अनलॉक करता है।

समाधान दृष्टिकोण

ऐसा लगता है कि आप पहले केवल एक एआई के साथ शुरू करेंगे जो मूल रूप से एक भूलभुलैया एक्सप्लोरर था (यदि आप अपने नक्शे को भूलभुलैया के रूप में सोचते हैं)। उन सभी जगहों की खोज करना और उनकी मैपिंग करना, जो मुख्य रूप से AI का ध्यान केंद्रित करेंगे। यह विशुद्ध रूप से कुछ सरल पर आधारित हो सकता है, जैसे "हमेशा मेरे द्वारा देखे गए निकटतम मार्ग पर जाएं लेकिन अभी तक नहीं गए।"

हालांकि, कुछ नियमों की खोज करते हुए कि प्राथमिकता बदल सकती है ...

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

उस अंतिम बिंदु पर एक नोट। यदि इसे एक अनएक्सप्ले किए गए क्षेत्र की जाँच करने के लिए चुनना है, तो यह एक नए अनलॉक किए गए पथ के पीछे एक अस्पष्टीकृत क्षेत्र के पहले (लेकिन दौरा नहीं किया गया) है, इसे नए अनलॉक किए गए पथ को प्राथमिकता देना चाहिए। शायद यही वह जगह है जहाँ नई चाबियाँ (या ताले) हैं जो उपयोगी होंगी। यह एक बंद रास्ता मानता है शायद एक व्यर्थ मृत अंत नहीं होगा।

"लॉकेबल" कुंजी के साथ आइडिया का विस्तार करना

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

इसलिए कुछ नियमों को जोड़ते हुए ...

  • यदि कोई कुंजी नहीं ली जा सकती है (यह बंद है), तो हर उस कुंजी को आज़माएं जो आपके पास पहले से है
  • यदि आपको कोई कुंजी मिलती है जिसे आप अनलॉक नहीं कर सकते हैं, तो इसे बाद के लिए याद रखें
  • यदि आपको कोई नई कुंजी मिलती है, तो इसे हर ज्ञात लॉक की और साथ ही लॉक किए गए पथ पर आज़माएं

मुझे इस बात की भी पूरी जानकारी नहीं है कि किस तरह एक निश्चित कुंजी को ले जाने से दूसरी कुंजी के प्रभाव को नकारा जा सकता है (कोलोसल केव्स, रॉड डराता है पक्षी को और पक्षी को उठाए जाने से पहले गिरा दिया जाना चाहिए, लेकिन जादुई पुल बनाने के लिए बाद में आवश्यक है) ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.