Bagaimana saya bisa mewakili kamar dan tindakan serta inventaris terkait dalam game petualangan berbasis teks?


8

Saya baru mulai belajar membuat game. Saya telah membuat game berbasis teks sederhana di mana pengguna dapat berjalan di antara kamar dan berinteraksi dengan objek di setiap kamar. Namun, saya merasa pendekatan saya telah menyebabkan tumpukan kode spaghetti yang buruk. Saya tidak yakin bagaimana cara yang baik untuk menyusun game seperti ini.

Pendekatan saya adalah memiliki satu kelas dengan metode untuk setiap kamar dan semua objek dan interaksi yang dapat dilakukan di ruangan itu. Sebagai contoh, ini adalah metode untuk penelitian:

public static void Study() 
{
    bool studyexited = false;

    while (!studyexited) {
        string usercommand = Console.ReadLine ();
        usercommand.ToLower ();

        switch (usercommand) {
        case "turn left":
            GameEventText.StudyLeft ();
            break;
        case "turn right":
            GameEventText.StudyRight ();
            break;
        case "go forward":
            Notes firstsetofclues = new Notes ("First Note");
            GameEventText.StudyFront ();
            string firststudycommand = Console.ReadLine ();
            firststudycommand.ToLower ();

            if (firststudycommand == "read note") {
                firstsetofclues.Firstnotereading ();
            }

            Console.WriteLine ("Picking up this note would prove valuable");
            string secondstudycommand = Console.ReadLine ();
            secondstudycommand.ToLower ();

            if (secondstudycommand == "pick up note") {
                if (MainClass.PlayerInventory.AddItem (firstsetofclues)) 
                {
                    Console.WriteLine ("The note has been added to your inventory");
                } else {
                    Console.WriteLine ("Your inventory is full");
                }

                MainClass.PlayerInventory.Inventorydisplay ();
            }
        }
    }
}

Saya tidak merasa ini adalah pendekatan yang akan berkembang; yaitu, saya tidak bisa menulis fungsi seperti ini untuk setiap kamar. Saya percaya bahwa menggunakan file dengan cara tertentu akan menjadi strategi yang baik untuk menghindari "hard coding" yang saya lakukan saat ini. Tetapi saya tidak yakin bagaimana saya bisa mencapainya?


Ini benar-benar lebih dari topik pemrograman umum, kecuali mungkin bit tentang loop game dan semacamnya (yang sangat luas). Namun, sulit untuk mengatakannya, karena pertanyaan Anda sangat tidak jelas seperti yang tertulis.

saya tidak mengerti bagaimana itu tidak jelas karena saya mencoba yang terbaik untuk menjelaskan. mungkin Anda bisa membantu saya?
Mohamed Serry

Banyak yang harus demikian dengan kurangnya tanda baca, kapitalisasi dan jarak antar paragraf. Pada dasarnya itu terdengar seperti Anda bertanya bagaimana untuk menghindari keharusan kode keras satu kelas per kamar dalam permainan Anda. Apakah itu benar? Jika demikian, saya dapat membantu mengedit pertanyaan Anda.

sedikit banyak ya. Saya ingin menghindari pengkodean yang sulit pada dasarnya semua permainan.
Mohamed Serry

Jawaban:


10

Anda berada di jalur yang benar dengan gagasan Anda menggunakan file untuk membantu mengurangi jumlah perilaku hard-kode yang Anda miliki. Anda ingin membuat data game Anda didorong sebanyak mungkin: itu bukan konsep yang rumit, itu persis seperti apa itu. Dorong perilaku game melalui data daripada langsung melalui kode.

Pola pikir yang baik untuk diambil saat menentukan cara mengendarai beberapa sistem melalui data adalah mencari generalitas. Apa hal yang sama di antara semua contoh dari sistem ini? Kesamaan menjadi properti dari sistem, dan nilai-nilai properti tersebut adalah data. Kamar, misalnya, biasanya semua memiliki deskripsi dan daftar pintu keluar. Mereka mungkin juga memiliki "inventaris," daftar item yang ada di dalam ruangan.

Satu opsi yang dapat Anda bujuk adalah menggunakan teks biasa atau file XML (keduanya cukup mudah untuk diuraikan dalam C #) untuk menyimpan data dan konten ruang.

Pertimbangkan file terstruktur XML seperti ini:

<room name="Study">
  <description>
  You enter a well-furnished study. A heavy wooden desk sits in one corner, an ugly lamp illuminating its surface.
  </description>
  <exits>
    <exit command="north">Hallway</exit>
  </exits>
  <items>
    <item name="Pen">
  </items>
</room>

Struktur sederhana ini mendefinisikan apa yang saya sebutkan di atas. Kelas cooresponding Roomakan memiliki properti untuk Description, a List<T>keluar (yang merupakan referensi ke kamar lain dan perintah "pergi" yang digunakan untuk sampai ke sana, dalam contoh di atas pergi ke utara akan membawa pemain ke lorong). Ada juga beberapa List<T>item.

Daripada meletakkan whileloop dalam fungsi untuk setiap kamar (yang tidak dapat Anda lakukan sekarang karena Anda hanya memiliki satu Roomkelas), Anda membuat loop utama yang lebih umum:

while(!done) {
  Console.WriteLine(currentRoom.Description);
  var command = Command.Parse(Console.ReadLine());
  switch(command.Verb) {
    case "go":
      nextRoom = allRooms[currentRoom.GetExitForDirection(command.Object)];
      if (nextRoom == null) {
        Console.WriteLine("You cannot go that way.");
      }
      else {
        currentRoom = nextRoom;
      }
      break;
    ...
  }
}

Perhatikan bahwa Command.Parsefungsi tersebut dibiarkan sebagai excersize untuk Anda, tetapi pada dasarnya harus mem-parsing input pengguna dan mengembalikan semacam pasangan "kata kerja / objek" atau sejenisnya (lihat pertanyaan ini untuk kickstart dalam melakukannya, itu sedikit di luar ruang lingkup Anda pertanyaan). Dalam contoh di atas, kata kerjanya akan "pergi" dan objeknya mungkin "utara" atau "selatan" atau apa pun.

Namun di luar itu, apa yang dilakukan loop ini adalah menghadirkan kamar-kamar secara umum; setiap kali lewat, Anda mencetak deskripsi kamar, menunggu input pengguna. Jika input pengguna adalah "pergi ke ruangan lain," Anda menemukan pintu keluar dari ruangan saat ini sesuai dengan arah yang dimasukkan pengguna. Jika tidak ada jalan keluar ke arah itu, katakan demikian, jika tidak, atur kamar saat ini ke kamar baru itu. Lalu ulangi.

Anda dapat terus memperbaiki pendekatan ini (misalnya, di atas mencetak deskripsi kamar setelah setiap perintah; dapatkah Anda melihat bagaimana membuatnya mencetak deskripsi hanya saat pertama kali memasuki ruangan? Bagaimana kalau ditambah ketika Anda mengetik "tampilan "perintah?). Anda juga dapat mengukurnya untuk mencakup penanganan item dengan cara yang serupa.


Terima kasih banyak atas josh dukungan Anda. Saya akan mencoba ini dan mencoba mengembangkan kemajuan sebanyak yang saya bisa
Mohamed Serry

1

Jika Anda tahu html, Anda bisa menganggap kamar sebagai halaman web, keluar sebagai tautan, tindakan mungkin sebagai jangkar dan permainan itu sendiri sebagai browser. Satu-satunya hal tambahan yang perlu dikelola oleh game adalah inventaris dan NPC, yang pada dasarnya adalah satu atau dua kelas statis dengan status setiap item dan karakter dalam game, sudah diambil, apakah sudah digunakan / diajak bicara, sudahkah telah dihancurkan / dikalahkan.

Jika Anda menggunakan html alih-alih xml murni dengan cara yang mirip dengan yang dijelaskan Josh, Anda bisa men-debug di browser, setidaknya sejauh navigasi berjalan.


Jawaban josh lebih teknis menyeluruh dan langsung relevan, tetapi analogi ini cukup bagus dan dapat membantu memahami konsep keseluruhan
jhocking
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.