2010-11-25 12 views
14

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

मेरे साथ गड़बड़ करना कोड एक नोड से दूसरे में जाने के लिए कोड है। चूंकि प्रत्येक नोड चार अन्य नोड्स से जुड़ा होता है, इसलिए मुझे प्रत्येक विधि में कोड के बेहद समान ब्लॉक को दोहराना पड़ता है।

public static void zero() 
{ 
    ... adjacentNodes[] = {one(), two(), three(), four()}; 
} 

और फिर एक सामान्य विधि है कि सरणी भेजें, और यह खिलाड़ी भेजने:

मुझे क्या करना पसंद करते हैं क्या प्रत्येक नोड की शुरुआत में तरीकों की एक सरणी, इस तरह शामिल है दाएं नोड पर:

public static void move(...[] adjacentNodes, int index) 
{ 
    adjacentNodes[index]; 
} 

मैंने अपना कोड सरलीकृत किया, लेकिन यह सामान्य विचार है। क्या यह संभव है?

+4

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

+0

'एक()', 'दो()' आदि के विधि हस्ताक्षर क्या हैं? – missingfaktor

उत्तर

41

जब भी आप पॉइंटर-टू-फ़ंक्शन के बारे में सोचते हैं, तो आप एडाप्टर पैटर्न (या एक भिन्नता) का उपयोग करके जावा में अनुवाद करते हैं। यह कुछ ऐसा होगा:

public class Node { 
    ... 
    public void goNorth() { ... } 
    public void goSouth() { ... } 
    public void goEast() { ... } 
    public void goWest() { ... } 

    interface MoveAction { 
     void move(); 
    } 

    private MoveAction[] moveActions = new MoveAction[] { 
     new MoveAction() { public void move() { goNorth(); } }, 
     new MoveAction() { public void move() { goSouth(); } }, 
     new MoveAction() { public void move() { goEast(); } }, 
     new MoveAction() { public void move() { goWest(); } }, 
    }; 

    public void move(int index) { 
     moveActions[index].move(); 
    } 
} 
+0

ठीक है, मैं इसे आज़माने जा रहा हूं। सलाह के लिये धन्यवाद! –

+0

यह पूरी तरह से काम किया; आपकी मदद के लिए बहुत बहुत धन्यवाद! –

+0

ध्यान दें कि यह उदाहरण प्रति 'नोड' उदाहरण 4 'मूव क्रियाएं' बनाता है। इस कार्यान्वयन पर पुनर्विचार करके थोड़ा सा आप सभी उदाहरणों के लिए 'मूवएक्शन' ऑब्जेक्ट्स को तेज बना सकते हैं।इस मामले में, इसमें 'move()' 'move (नोड) 'को बदलना शामिल होगा, 4' मूवएक्शन 'को स्थैतिक वर्गों के रूप में कार्यान्वित करें, और' move 'को' move ')' पर कॉल करें। – gpeche

-3

आप विधियों की एक सरणी बनाने के लिए प्रतिबिंब वर्ग का उपयोग कर सकते हैं। http://java.sun.com/developer/technicalArticles/ALT/Reflection/

+9

नहीं, ऐसा मत करो। प्रतिबिंब के साथ ओओ डिजाइन को प्रतिस्थापित करने के लिए यह सिर्फ खराब प्रोग्रामिंग अभ्यास है। –

6

बस अपने नोड्स ऑब्जेक्ट्स हैं जो सभी एक ही इंटरफ़ेस का पालन करते हैं, तो आप उनके तरीकों को विश्वसनीय रूप से कॉल करने में सक्षम होंगे।

0

प्रतिबिंब के बिना समाधान के बारे में सोचने का प्रयास करें। यह enums हो सकता है, उदाहरण के लिए।

2

आपके डिज़ाइन में मौलिक त्रुटियां हैं। सामान्य ओओ डिजाइन में प्रत्येक "स्तर" एक वस्तु (वर्ग 'स्तर' या ऐसा कुछ) होगा। प्रत्येक 'अनौपचारिक क्षेत्र' भी एक वस्तु होगी, जो स्तर वस्तु के भीतर निहित है - शायद कक्षा के स्पष्टीकरण एरिया। 'अन्वेषण क्षेत्र' विभिन्न प्रकार के हो सकते हैं, इस मामले में आप उन्हें ExplorableArea के विभिन्न उप-वर्ग बनाते हैं।

+0

आप सही हैं; यह सबसे अच्छी संरचना नहीं है जिसके साथ मैं आ सकता था। मैं फिर से डिजाइन के बीच में हूं, लेकिन मैं इस समस्या को पहले –

4

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

करीबी अनुमान शायद एक विधि की एक प्रति उदाहरण कार्यान्वयन के साथ enums के रूप में स्तरों के लिए होगा:

public enum Level1 implements Explorable{ 
    ROOM1 { 
     public void explore() { 
      // fight monster 
     } 
    }, ROOM2 { 
     public void explore() { 
      // solve riddle 
     } 
    }, ROOM3 { 
     public void explore() { 
      // rescue maiden 
     } 
    }; 

} 

public interface Explorable{ 
    public abstract void explore();  
} 

public static void move(Explorable[] adjacentNodes, int index) 
{ 
    adjacentNodes[index].explore(); 
} 

हालांकि, इस enum अवधारणा का दुरुपयोग का एक सा है। मैं इसे एक गंभीर परियोजना के लिए उपयोग नहीं करता।

+0

सॉर्ट करना चाहता था, फिर भी, मैं इसे आज़मा दूंगा। पारितोषिक के लिए धन्यवाद! –

+0

यह काम कर रहा है; बहुत बहुत धन्यवाद –

संबंधित मुद्दे