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?
Jawaban:
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:
Struktur sederhana ini mendefinisikan apa yang saya sebutkan di atas. Kelas cooresponding
Room
akan memiliki properti untukDescription
, aList<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 beberapaList<T>
item.Daripada meletakkan
while
loop dalam fungsi untuk setiap kamar (yang tidak dapat Anda lakukan sekarang karena Anda hanya memiliki satuRoom
kelas), Anda membuat loop utama yang lebih umum:Perhatikan bahwa
Command.Parse
fungsi 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.
sumber
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.
sumber