Atribut untuk menghitung hit dalam game berbasis giliran atau Roguelikes

22

Saya mencoba mencari formula yang bagus untuk menentukan pukulan ketika pemain menyerang musuh di Roguelike. Saya ingin membuat sesuatu yang sederhana tapi, tetap benar dengan cara itu dilakukan di D & D atau Roguelikes populer seperti AngBand atau NetHack.

Apa yang saya miliki sejauh ini adalah menambahkan perbedaan antara atribut pemain dan musuh, bersama dengan integer acak:

if ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + random_integer_below_6()) >= 10) {
    hit(enemy);
}

Ini membuat gameplay yang tidak wajar: pemain tidak pernah kehilangan musuh yang lemah dan sebaliknya untuk yang kuat. Apakah ada yang tahu panduan untuk pertarungan berbasis atribut yang digunakan dalam permainan berbasis giliran dll? Haruskah saya (dan bisakah saya) menyalin aturan D & D kata demi kata?

Jdeseno
sumber

Jawaban:

18

Saya akan mencari tahu apa yang Anda inginkan untuk peluang "tembakan terjamin" dan "jaminan kehilangan" (yaitu peluang bagi anak kucing untuk menabrak seekor naga dan seekor naga untuk kehilangan seekor anak kucing). Simpan hasil acak Anda, dan sebelum menerapkan perbedaan kekuatan, tandai hit jika berada dalam batas tersebut. Itu akan mencegah masalah hit / miss chance 100% ... meskipun ada opsi lain untuk selalu memberikan peluang hit, dirinci di bawah ini.

D & D adalah sistem "datar", di mana probabilitas didistribusikan secara merata di seluruh hasil roll yang mungkin. Sistem lain menggunakan distribusi yang lebih melengkung, biasanya dicapai dengan menggulirkan beberapa dadu dan menambahkannya. Cukup mudah untuk membuat kurva seperti ini (rand () + rand ()) / 2 muncul di pikiran).

Kemungkinan lain adalah "dadu meledak." Dalam sistem seperti Shadowrun dan Savage Worlds, menggulirkan hasil cetakan maksimum yang memungkinkan memungkinkan Anda mengulangi yang mati dan menambahkan hasil baru. Dalam gim Anda, Anda akan menguji untuk melihat apakah hasil acak Anda di atas ambang tertentu, dan jika demikian, gulir lagi. Jika Anda membiarkan dadu meledak tanpa batas waktu, maka bahkan goblin paling rendah pun memiliki kesempatan untuk menabrak dewa, dan Anda tidak perlu mekanik yang "dijamin hit".

Jadi salah satu pendekatan yang mungkin dengan gulungan melengkung, peluang dijamin hilang, dan meledak dadu akan menjadi sesuatu seperti:

function getRoll():Number
{
  var result:Number = (rand() + rand()) * 3; //Curved result from 0 to 6
  if(result > 5.75) result += getRoll(); //Explode over a certain threshold, recursively
  return result;
}

function attackHits():Boolean
{
  var roll:Number = getRoll();
  if(roll < 0.25) return false; //Guaranteed chance of miss
  else return ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + roll) >= 10; //Your original test.
}

Tentu saja, itu belum diuji dan tidak seimbang; Anda ingin menyesuaikan semua angka ajaib itu sampai terasa benar.

Sedangkan untuk menyalin aturan kata demi kata, ada masalah hukum dan etika dengan itu. Anda baik-baik saja menarik inspirasi dari D & D dan game meja lainnya, meskipun; itulah sebabnya mereka semua dirancang pada awalnya. Anda juga tidak perlu menunjukkan kepada pemain bagaimana tepatnya aturan itu bekerja, dan Anda mungkin menemukan bahwa menggunakan kurva dadu floating point yang halus menghasilkan perasaan yang lebih baik daripada membatasi diri Anda pada batasan integer dadu fisik.

Gregory Avery-Weir
sumber
3
bahasa apa itu, dengan decl jenis lucu? Atau itu hanya kodesemu?
tenpn
2
Saya pikir itu mungkin Actionscript atau Javascript, tapi jangan pegang saya untuk itu.
The Communist Duck
Ini Actionscript 3. Saya adalah pengembang Flash.
Gregory Avery-Weir
6

Saya berasumsi ini adalah pertanyaan keseimbangan permainan dan bukan pertanyaan pengkodean, dan ada banyak cara untuk mengatasinya. Dari algoritma yang ada, saya curiga Anda membuatnya lebih rumit dari yang seharusnya (tiga atribut DAN angka acak dibuat untuk sistem yang sangat berlumpur dari sudut pandang pemain). Naluri pertamaku adalah menyederhanakan!

Atribut atribut yang melakukan banyak hal, bukan hasil yang ditentukan oleh banyak atribut. DEX berfungsi dengan baik sebagai penentu utama peluang to-hit; penambahan semua yang lain hanya berfungsi untuk membuat keseimbangan menjadi lebih sulit. Pikirkan seperti ini: Kerusakan yang diharapkan pemain pada setiap pukulan adalah to-hit mereka% dikalikan dengan kerusakan rata-rata mereka ketika mereka memukul. Bagaimana Anda berencana untuk menghitung% yang "diharapkan" atau "khas" dengan banyak variabel?

Saya melihat masalah lain, yaitu rumus Anda tidak menskala, dan ini mungkin yang Anda alami. Dengan asumsi DEX, LUCK dan SPEED cenderung meningkat selama permainan, perbedaan antara pemain dan monster dalam statistik tersebut juga akan cenderung meningkat. Seperti contohnya, jika DEX permainan awal pemain ada dalam kisaran 4 hingga 6 dan begitu juga monster, itu adalah 10-20% to-hit modifier. Jika rentangnya lebih seperti 10 hingga 20 di tahap-tahap selanjutnya dalam permainan, itu adalah pengubah hingga 100%.

Salah satu cara untuk memperbaikinya adalah dengan menjaga statistik tetap. Rentang pemain dan monster sama sepanjang permainan, dan mendapatkan sesuatu seperti +1 DEX adalah masalah besar, sangat langka, dan diperlakukan seperti itu (jika ada sama sekali). Kemudian formula Anda akan bekerja dengan baik untuk seluruh permainan, dan Anda akan melihat seorang pemain dengan peluang hit yang sama di seluruh.

Cara lain adalah mengubah "10" hardcode ke skala dengan level, jadi mungkin itu "10 + level monster" atau "10 + level bawah tanah" atau sesuatu, yang menyebabkan sedikit peningkatan kesulitan saat permainan berlangsung kecuali permainan naik level kecuali pemain naik level statistik mereka sesuai.

Cara ketiga, seperti yang dikatakan orang lain, adalah menetapkan batas tertinggi pada% hit tertinggi yang dapat diterima, dan hanya mengatakan "jika nilai yang dihitung kurang dari X, gunakan X sebagai gantinya".

Demi kelengkapan, saya akan menunjukkan bahwa tidak ada hukum mutlak yang Anda HARUS sertakan roll to-hit di tempat pertama. Mengambil tindakan dalam permainan yang tidak efektif tidak terlalu menyenangkan, dan tidak benar-benar menambah pengalaman kecuali dalam kasus yang jarang terjadi. Alternatifnya adalah membiarkan pemain SELALU memukul, dan hanya mengacaukan kisaran kerusakan sehingga terkadang mereka akan melakukan kerusakan jauh lebih sedikit daripada yang lain. Ingatlah bahwa sistem yang kompleks lebih menyenangkan bagi perancang daripada pemain.

Ian Schreiber
sumber
Ini jawaban yang bagus.
seanicus
3

Anda mungkin ingin menambahkan hit kritis (biasanya tidak dapat dilewatkan, kerusakan bonus) dan miss kritis (peluang flat untuk dilewatkan bagaimanapun juga, mungkin membingungkan pemain)

pembuat kode
sumber
0

Banyak game menggunakan perubahan hit lima persen terlepas dari semua faktor selain formula hit normal.

EddieC
sumber