2013-02-26 95 views
7

मैं सिर्फ नेटहैक के साथ खेल रहा था क्योंकि मैं अपने लिए एक सरलीकृत संस्करण कोडिंग की प्रक्रिया में हूं। मेरा सवाल है, गलियारे कैसे लागू किए जाते हैं? मैं कुछ दिनों के लिए दृष्टिकोण के बारे में सोचने की कोशिश कर रहा हूं और कुछ भी उचित नहीं हो सकता।नेटहाक गलियारा कार्यान्वयन

उत्तर

7

नेथैक में मानचित्र निर्माण mkmap.c में होता है। विधि join_map निर्धारित करती है कि कौन से कमरे जुड़े रहना चाहिए। Sp_lev.c में dig_corridor विधि वास्तविक खुदाई करता है।

ब्याज की तर्ज:।

if (tx > xx)  dx = 1; 
else if (ty > yy) dy = 1; 
else if (tx < xx) dx = -1; 
else   dy = -1; 

इस तुलना "वर्तमान एक्स और वाई" के साथ "लक्ष्य एक्स और वाई" दिशा है कि हम शुरू में में खुदाई पता लगाया जाएगा कि

while(xx != tx || yy != ty) { 
    /* loop: dig corridor at [xx,yy] and find new [xx,yy] */ 
    if(cct++ > 500 || (nxcor && !rn2(35))) 
    return FALSE; 

हम कुछ अपवादों के साथ, हम लक्ष्य तक पहुंचने तक जारी रहेगा: यदि "गलियारा गिनती" cct 500 है, तो हमने एक लंबा सफर खोला है और छोड़ना चाहता हूं। यदि nxcor सत्य है, तो गलियारे को मृत अंत की अनुमति है। rn2 एक यादृच्छिक संख्या जनरेटर है, इसलिए यदि कोई मृत अंत संभव है, तो प्रत्येक लूप के दौरान एक छोटा सा मौका है जिसे हम छोड़ देंगे।

crm = &levl[xx][yy]; 
    if(crm->typ == btyp) { 
    if(ftyp != CORR || rn2(100)) { 
     crm->typ = ftyp; 
     if(nxcor && !rn2(50)) 
      (void) mksobj_at(BOULDER, xx, yy, TRUE, FALSE); 
    } else { 
     crm->typ = SCORR; 
    } 

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

/* do we have to change direction ? */ 
    if(dy && dix > diy) { 
    register int ddx = (xx > tx) ? -1 : 1; 

    crm = &levl[xx+ddx][yy]; 
    if(crm->typ == btyp || crm->typ == ftyp || crm->typ == SCORR) { 
     dx = ddx; 
     dy = 0; 
     continue; 
    } 
    } else if(dx && diy > dix) { 
    register int ddy = (yy > ty) ? -1 : 1; 

    crm = &levl[xx][yy+ddy]; 
    if(crm->typ == btyp || crm->typ == ftyp || crm->typ == SCORR) { 
     dy = ddy; 
     dx = 0; 
     continue; 
    } 
    } 

तो वर्तमान स्थिति और लक्ष्य स्थिति के बीच खींची गई रेखा की "ढाल" पर्याप्त रूप से 45 डिग्री से दूर है, हम दिशा बदलने के लिए प्रयास करना; अगर हम एक्स अक्ष के साथ आगे बढ़ रहे हैं, तो हम वाई अक्ष के साथ आगे बढ़ना शुरू करते हैं; और इसके विपरीत। यह ठेठ squiggly सीढ़ी के आकार के गलियारे का कारण बनता है जो दो विकर्ण कमरे को जोड़ता है। यदि दिशा बदलने से हमें बाधा आती है (अन्य कमरे, लावा, इत्यादि), तो हम केवल उस दिशा में जा रहे हैं जिसमें हम जा रहे थे।

+0

यह पता लगाने के लिए धन्यवाद कि वास्तव में कोड कहां था! मैं चाहता था, लेकिन मैं आलस्य से रोक दिया गया था। – MrLeap

2

आप अपने लिए स्रोत देख सकते हैं! Link

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

तब सीढ़ियों/दरवाजे/आदि आबादी वाले थे।

जो आप खोज रहे हैं वह Maze generation algorithm है। बहुत सारे हैं