سؤال

أنا في محاولة لإكمال اللعبة آر بي جي على المشروع ، ولكن ليس لديهم فكرة عن كيفية جعل خريطة اللعبة.أنها لا تحتاج إلى أن تكون رسومية ، ولكن رمز الخريطة كلها و كل البلاط يجب أن تكون صحيحة.

حتى الآن, أنا فكرت في جعل غير matricial الخريطة (كما طلب الأستاذ) باستخدام ArrayList التي تحتوي على جميع مرتبطة البلاط.

public abstract class Casella {
/** 
 * @uml.property name="tabellone"
 * @uml.associationEnd multiplicity="(1 1)" inverse="casella:Tabellone"
 * @uml.association name="contains"
 */

private int id;
private boolean free = true;
private List adjacent;
private List items;
private Tabellone tabellone = null;

public void in(){
    free = false;
}

public void out(){
    free = true;
}

}

كان هذا هو رمز البلاط واحد (الذي يحتوي على 3 فصول من أن يمتد ذلك).أنا لا تزال لديها أي فكرة عن كيفية وضع معا وتوليد خريطة.

شكرا لك على وقتك.

هل كانت مفيدة؟

المحلول 6

وتمكنت بذلك عن طريق استخدام قوائم الجوار. وكل خلية لها ArrayList تحتوي على فهارس الخلايا المجاورة. هذه المؤشرات هي التي الخلية وقال لها في خريطة ArrayList من الخلايا.

http://en.wikipedia.org/wiki/Adjacency_list

نصائح أخرى

ولا تبدأ تنفيذ، وتبدأ مع الطريقة التي ترغب في استخدام الخريطة. وهذا يعطيك بعض القيود كيفية تنفيذ ذلك. على سبيل المثال:

عند رسم الخريطة، كيف يمكن الوصول إليها؟ بواسطة تنسيق؟ أو "الذهاب غربا من البلاط X"؟

[تحرير] أقترح أن تبدأ مع الحلقة الرئيسية للعبة RPG. ستحتاج إلى وضع حرف / رمز في مكان ما (أي أنه يحتاج إلى نوع من العلاقة إلى البلاط).

وبعد ذلك تحتاج إلى نقل الحرف. يجب أن يكون شخصية قادرة على فحص البلاط الحالي (المعارضين، والبنود، النوع). انها تحتاج الى وسيلة لمعرفة كيف يمكن ان تتحرك (أي وجود الجدار إلى الحق؟)

وهذا يمنحك واجهة لخريطتك: الخدمات التي تجعل لكائنات أخرى في اللعبة. عندما يكون لديك فكرة عن ما يجب على واجهة أن تقدم، ينبغي أن تعطيك فكرة عن كيفية تنفيذ خارطة (هيكل البيانات).

وأما بالنسبة لتوليد الخريطة، استخدام عدد المولدات عشوائي بالإضافة إلى بعض "الحس السليم". إلقاء نظرة على البلاط المجاورة: عندما تكون كل مدينة، وهذا البلاط هو على الارجح المدينة أيضا. نفسه بالنسبة السهول. التلال هي العناصر الفريدة، وهي الأقل شيوعا.

وتشغيل هذا الرمز، طباعة الخريطة كما ASCII ( "C" إيتي "P" المزيد "H" سوء) لمعرفة ما اذا كان يعمل.

توليد خريطة مثل هذا دون استخدام مصفوفة أوصي بدءا من مركز بلاط ثم ملء الخريطة الخارج باستخدام تعديل اتساع أول خوارزمية البحث.أولا سوف تحتاج إلى شيء أفضل قليلا من قائمة من البلاط المجاورة.هل يمكن أن يكون ببساطة أربعة متغيرات ، واحدة لكل اتجاه محلات البلاط المقبل, على هذا النحو:

private Tabellone up = null;
private Tabellone down = null;
private Tabellone left = null;
private Tabellone right = null;

أقول نبدأ مع مركز-معظم البلاط.كل ما عليك القيام به الآن هو معرفة كيفية العديد من الاتجاهات فارغة, وخلق جديد Tablellone كائن لكل اتجاه ، مع التأكد من ضبط كل من المتغيرات في هذا الكائن الحالي ووضع المناسبة المعاكس متغير كائن تم إنشاؤه.

Tabellone adj = new Tabellone();
up = adj;
adj.setDown(this);

مرة واحدة كنت قد ملأت كل الاتجاهات على هذا البلاط ، ثم اختيار واحد من البلاط الأخرى التي قمت بإنشائها و تنفيذ نفس العملية.هذا هو حيث اتساع الأول خوارزمية البحث يأتي في.يمكنك استخدام قائمة الانتظار للذهاب من خلال كل البلاط لقد خلقت و ملء الاتجاهات.لجعل خوارزمية تتوقف ببساطة وضع حد على عدد البلاط الذي تريد إنشاء واستخدام عداد لتتبع كم تم إنشاؤها.

int count = 0;
ArrayList<Tabellone> queue = new ArrayList<Tabellone>()
queue.add(/*center tile*/);
while (count < 100) { //if we want 100 tiles
  //take out the center tile from the beginning of the array list, create a tile for each direction and add those tiles to the array list, then increment count by 1.
}

ملاحظة: هذه الخوارزمية كما هو عليه سيتم إنشاء الماس على شكل خريطة ، إذا كنت تريد مربع, كنت بحاجة إلى متغير لكل قطري الاتجاه أيضا.

بالطبع, إذا كان هذا يبدو قليلا أكثر تعقيدا مما كنت تريد ، أنصح تنسيق النظام.

والجدران، عربات التي تجرها الدواب، والمناطق هي حاويات خاصة، والتي سوف تعقد جميع الجدران، عربات التي تجرها الدواب ومجالات اللعبة.

private String level =
          "    ######\n"
        + "    ##   #\n"
        + "    ##$  #\n"
        + "  ####  $##\n"
        + "  ##  $ $ #\n"
        + "#### # ## #   ######\n"
        + "##   # ## #####  ..#\n"
        + "## $  $          ..#\n"
        + "###### ### #@##  ..#\n"
        + "    ##     #########\n"
        + "    ########\n";

وهذا هو مستوى اللعبة. باستثناء الفضاء، وهناك خمسة أحرف. تجزئة (#) لتقف على الجدار. يمثل الدولار ($) مربع للتحرك. يمثل الحرف النقطة (.) المكان الذي يجب علينا نقل مربع. وفي حرف (@) هو Sokoban ل. وأخيرا حرف سطر جديد (\ ن) يبدأ صف جديد من العالم.

هو سرعة الذاكرة أو مصدر قلق كبير لهذا المشروع ؟ إذا لم يكن كذلك ، لماذا لا تستخدم مجموعة 2d?

شيء مثل

Casella map [][] = new Casella[xSize][ySize];

من هنا فإنه من السهل تصور فقط الصورة مثل جدول بيانات excel حيث كل خلية البلاط على الخريطة.

الطريقة التي تسير على ما يرام على الرغم من مجرد قليلا من الصعب تصور في بعض الأحيان.لديك قائمة من البلاط المجاورة.لذلك ، عند إنشاء الخريطة الخاصة بك عليك أن تبدأ في مكان ما ، وربما أعلى اليسار ، والذهاب من هناك.

هل يمكن استخدام متداخلة للحلقات من أجل إعداد الخريطة ، والمساعدة في تحديد حافة البنود.

for(int i = 0; i < XSIZE ; ++i)
    for(int j = 0; j < YSIZE ; ++j)
        if(j==0) //found left edge (i.e. no adjacent ones to the left)
        if(j==(YSIZE)) //found right edge (you get the picture) 

وجهة استخدام الحلقات ، والتحقق من الحواف ، هو أن كنت بحاجة الى الذهاب الى رابط إلى الوراء وإلى الأمام ، صعودا وهبوطا في كل أرض من البلاط إلا عند الحواف ، حيث سيكون لديك إما 2 أو 3 روابط بدلا من 4.

والرمز يحتاج أن يكون صحيحا حقا ليس شرطا وظيفية، لذلك من الصعب أن نقول بالضبط ما هو الصحيح من دون معرفة المزيد عن لعبتك / خريطة.

وعلى افتراض لديك خريطة لديه البلاط X ولا الجوار أمر حل غير مطرسي هو أفضل، حل مشترك هو مجرد نموذج وكأنه الرسم البياني باستخدام القائمة الجوار للالجوار أو الإصابة قائمة غير متماثل للالجوار متماثل . إذا كنت تستخدم قائمة حدوث تحتاج كائن الحافة التي تحتوي على القمم حافة يتم الاتصال، إذا كنت تستخدم قائمة الجوار و<لأ href = "http://www.java2s.com/Code/Java/Collections-Data-Structure /MultiMapextendsAbstractMap.htm "يختلط =" نوفولو noreferrer "> قد يكون multimap بارد للاستخدام.

إذا كنت ترغب في حل غير مطرسي مع الجوار أمر AlbertoPL لديه حل لذلك.

وعلى افتراض لديك خريطة ل thats البلاط X واسعة وY البلاط طويل القامة والبلاط التي هي بجانب بعضها البعض والمجاور، بحيث يكون لكل بلاط و في أقصى 4 و 2 دقيقة البلاط المجاورة هل يمكن استخدام مصفوفة للوصول إلى البلاط وتمثل أيضا الجوار التي كتبها الجوار مطرسي. والفكرة هي أن خريطة [Y] [X] المجاور لخريطة [Y + 1] [X] وتعيين [Y] [X + 1] وباتجاهين معاكسين. هذا الحل يمكن أن يصلح أيضا بحد أقصى 6 ودقيقة 3 البلاط الجوار إذا البلاط [Y + 1] [X + 1] المتاخمة للبلاط [Y] [X]. الاتجاه الصعودي لهذا هو أنه يمكنك بسهولة تحليل الخريطة، وأنه لديه 2 أبعادها الطبيعية لنموذج من هذا القبيل. الجانب السلبي هو أنه بمجرد أن يتم تعيين البلاط، وكنت غير قادر على تغيير الجوار من دون تغيير المصفوفة. كما ليس هذا ما كنت اقترح أستاذ أنك قد لا تريد أن تفعل ذلك، ولكن إذا كان لديك (جامدة) أمر الجوار وهذا قد يكون أسهل طريقة للقيام بذلك.

إذا انها خريطة القائم على البلاط، ثم كل غرفة على علاقة ثابتة مع الغرف المجاورة لها. قد لا تحتاج للقلق حول تنسق (على الرغم من أنه قد يكون أسهل إذا كان البلاط مربع)، ولكن سوف تحتاج للقلق حول الاتجاهات.

وإذا كان البلاط مربع، والاتجاهات الأساسية (ن، ق، ه، ث) قد يكون كل ما تحتاجه يهمك. لو انهم البلاط عرافة، يمكنك ترقيم المخارج الخاصة بك 1-6 (ربما مع ثوابت نهائية ثابتة). ثم قد تكون مرتبطة كل بلاطة المجاور لهذا واحد جنبا إلى جنب مع الخروج.

وكما قال هارون ، عليك أن تقرر أولا كيف الإحداثيات maping سيكون.

ولكن لا مقيدة من قبل نظام الإحداثيات X-Y-Z. على سبيل المثال، يمكن ربط كل البلاط إلى أي حجر آخر على الخريطة. كل هذا يتوقف على الطريقة التي تريد لبنائه.

وأنت تقول أنك بناء لعبة آر بي جي، ثم تحتاج إلى أن يكون وجهة نظر جيدة من التضاريس المحيطة الطابع الخاص بك. هو متعدد المستويات؟ كيف يمكن نقل حرف من البلاط إلى آخر؟ هي حركة في اتجاه واحد؟

وهناك، حرفيا، عشرات السؤال الذي يتعين طرحه عند تصميم الخريطة للحصول على لعبة.

وتحتاج إلى تخطيط جيدا جدا أولا، قبل البدء في الترميز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top