Bagaimana menerapkan "kartu efek khusus" permainan kartu perdagangan?

16

Saya mencoba menulis semacam permainan kartu perdagangan di sini, dalam beberapa hal, ini mirip dengan Magic The Gathering , atau Yu-Gi-Oh! permainan kartu.

Bagi Anda yang tidak terbiasa dengan hal itu, pada dasarnya, dalam permainan, ada jenis kartu khusus (kartu Eja / kartu Perangkap / dll.), Yang memiliki efek khusus yang dapat mengubah aturan permainan. Apa yang saya benar-benar tidak tahu adalah, bagaimana menerapkan logika kartu-kartu ini. Saya mempunyai ide untuk menyimpan data kartu dengan beberapa bendera yang dapat menandakan kemampuan seperti apa yang dimilikinya, tetapi itu akan sangat terbatas pada apa yang dapat dilakukannya (hanya beberapa modifikasi statistik sederhana, mungkin).

Untuk memberi Anda gambaran tentang efek apa yang dapat dimiliki kartu-kartu ini, berikut adalah beberapa contoh efek kartu mantra yang ada di Yu-Gi-Oh! permainan kartu:

  • Bangkit kembali makhluk yang telah dihancurkan
  • Kendalikan makhluk lawan
  • Ubah statistik makhluk berdasarkan beberapa kondisi (mis. Jumlah makhluk dengan nama tertentu yang telah dihancurkan)
  • Panggil khusus makhluk tertentu jika beberapa persyaratan terpenuhi.
  • Fuse dua atau lebih makhluk menjadi makhluk yang lebih kuat.
  • Kekebalan terhadap beberapa efek kartu khusus.

Konami telah membuat beberapa video game, lengkap dengan AI dan ribuan kartu. Saya pikir itu tidak mungkin untuk membuat seluruh kode dengan hard-code, bukan?

Sekarang, tentu saja apa yang saya coba lakukan adalah tidak ada yang serumit game-game itu, tetapi saya ingin tahu, bagaimana mereka mengimplementasikannya?

hndr
sumber

Jawaban:

17

Ada beberapa proyek sumber terbuka seperti ini, dengan pendekatan yang berbeda untuk menerapkan aturan. Berikut adalah entri blog dari pencipta salah satu implementasi MtG yang lebih terkenal, CardForge. Ini mungkin bukan daftar lengkap, tetapi berisi beberapa proyek sumber terbuka di mana Anda dapat menelusuri kode, atau mengunjungi forum untuk pertanyaan spesifik.

Sebagai jawaban aktual: Taruhan terbaik Anda untuk kerangka kerja yang kuat adalah dengan menggunakan Pemrograman Berorientasi Objek secara ketat. Setiap Tindakan, setiap Pemicu, setiap Kemampuan adalah objek. Zona seperti Tangan, Perpustakaan adalah objek juga, tak perlu dikatakan. Di mesin Aturan, jangan pernah berikan benda-benda bodoh seperti string atau integer untuk menggambarkan objek game, tetapi hanya objek Anda.

Setiap tindakan menempatkan sejumlah pemicu pada tumpukan, di mana setiap kemampuan lain dapat memeriksa apakah mereka peduli dengan pemicu tertentu atau tidak, dan jika mereka melakukannya, mereka memecat tindakan mereka sendiri, berpotensi menciptakan pemicu baru, dan sebagainya.

Kemudian Anda mengerjakan tumpukan itu sesuai dengan aturan permainan, sampai tumpukan kosong, pada titik mana tindakan baru dapat diambil dll.

Idealnya, jika Anda menerapkan aturan permainan dengan sempurna, kode aturan Anda tidak mengandung satu kartu hardcode. Kartu hardcoding dapat membuat cara pintas yang nyaman, tetapi dalam jangka panjang, ini akan menggembungkan kode Anda dan membuat potensi jebakan, seperti ketika kartu baru dirilis yang berinteraksi dengan kartu-kartu itu dengan cara yang baru. Dalam permainan seperti MtG dengan lebih dari 12.000 kartu unik dan tanpa akhir yang terlihat, ada BANYAK interaksi seperti itu.

Hackworth
sumber
1
Jawaban yang bagus. Datang dari dunia pemrograman fungsional, saya ingin setiap kartu menjadi penutup atas lingkungan permainan, untuk menjadi lebih generik. Misalnya, sebuah kartu dapat dengan mudah membuat "Area" baru dengan menambahkan daftar kartu ke daftar area. Konkret: Zombie Monster Mayhem: Semua makhluk yang dikalahkan dihidupkan kembali di "Pemakaman Komunal" baru tanpa kemampuan khusus mereka, dan secara acak menyerang pemain berdasarkan lemparan dadu.
brice
Tautan tambahan: github.com/Fluorohydride/ygopro-core untuk implementasi YGO open source yang terkenal, karena YGO juga disebutkan dalam pertanyaan.
SK19
2

Tugas yang cukup sia-sia untuk mencoba menggabungkan semuanya dengan sakelar dan variabel saja. Anda harus memiliki fungsi kode keras atau, lebih mungkin, memiliki skrip yang Anda interpretasikan selama runtime. Anda akan mengekspos fungsi yang diperlukan untuk memeriksa status board dan deck dan kuburan ke skrip dan fungsi untuk mengeksekusi tindakan, dan sebagainya. Skrip kemudian hanyalah string sederhana untuk disimpan bersama dengan variabel lain yang terkait dengan kartu.

Toni
sumber
Atau seperti hackworth disarankan, memiliki semacam blok umum yang digabungkan untuk mendapatkan perilaku yang diperlukan. Itu akan memerlukan beberapa blok logika juga di samping apa yang dia sarankan, saya pikir. Memiliki blok perilaku yang dibagi dapat memudahkan untuk memfilter kartu yang memiliki semacam kualitas bersama.
Toni
1

Saya juga merencanakan permainan kartu menggunakan bahasa web dengan mysql db. Saat ini saya akan membuat pengaturan yang sangat umum sehingga sangat fleksibel untuk kartu unik baru. Misalnya, bukannya:

reduceHitPoints() { } 
reduceMana() { }
reduceSpeed() { }

bisa dengan mudah:

reduce($attacker, $target, $reduceWhat, $amount) { }
massReduce($attacker, Array $targets, $reduceWhat, $amount) { }

menerapkan konsep ini untuk semua tindakan akan menyederhanakan kelas, memungkinkan kartu baru dibuat dengan hanya menambahkan satu baris ke tabel kartu Anda.

Semua opsi dan kemampuan akan ditentukan dalam db dalam satu baris itu.

appthat
sumber