Apakah lebih baik melakukan hard code data atau menemukan algoritma?


8

Saya telah mengerjakan boardgame yang memiliki hex grid seperti board ini:

masukkan deskripsi gambar di sini

Karena papan tidak akan pernah berubah dan ruang di papan akan selalu ditautkan ke ruang lain yang sama di sekitarnya, haruskah saya hanya mengkode setiap ruang dengan nilai yang saya butuhkan? Atau haruskah saya menggunakan berbagai algoritma untuk menghitung tautan dan lintasan?

Untuk lebih spesifik, permainan papan saya adalah permainan 4 pemain di mana setiap pemain memiliki kisi hex 5x5x5x5x5x5 (sekali lagi, gambar di atas). Tujuannya adalah untuk mendapatkan dari bawah grid ke atas, dengan berbagai rintangan di jalan, dan masing-masing pemain dapat menyerang satu sama lain dari tepi grid mereka ke pemain lain berdasarkan pengali jangkauan.

Karena kisi pemain tidak akan pernah berubah dan jarak ruang sembarang dari tepi kisi akan selalu sama, haruskah saya memasukkan kode ini ke setiap spasi, atau saya masih harus menggunakan algoritma pencarian pertama yang luas saat pemain menyerang?

Satu-satunya con saya dapat memikirkan untuk pengkodean keras semuanya adalah bahwa saya akan kode 9+ 2 (5 + 6 + 7 + 8) = 61 sel individu. Apakah ada hal lain yang saya lewatkan sehingga saya harus mempertimbangkan untuk menggunakan algoritma yang lebih kompleks?


Saya dapat memberi tahu Anda area untuk serangan radius adalah 1 ditambah jumlah ketentuan urutan yang diberikan oleh f (n) = 6 (n-1) dari n = 1 ke n = x di mana x adalah jumlah baris. EG 3 baris (radius 10 kaki) = 1 + 6 + 12 = 19
eazimmerman

Ini adalah pseudocode dari apa yang saya jelaskan int numberOfHexagonsInArea(int rows) { int area = 1; while(rows>0) { area += (rows-1)*6; rows--; } return area; }
eazimmerman

Tampaknya tidak terlalu sulit? Dari {X,Y}Anda jelas dapat pergi ke {X-1, Y}dan {X+1, Y}di baris yang sama. Di baris di bawah dan di atas Anda dapat pergi ke {X, Y-1}dan {X, Y+1}. Akhirnya, tergantung pada keseragaman Y, Anda dapat pergi ke {X-1, Y-1}dan {X-1, Y+1}atau {X + 1, Y-1} `dan{X+1, Y+1}
MSalters

Jawaban:


12

Saya kira saya akan mengambil tandingan di sini dan berdebat menentang menggunakan nilai statis. Dalam hal ini, semua wilayah heksa yang Anda bicarakan adalah (a) mudah untuk dihitung - Anda tidak perlu menggunakan BFS atau apa pun yang begitu rumit; Anda harus dapat mengulangi semua heks di salah satu dari mereka dengan loop ganda bersarang; dan (b) bukan sesuatu yang Anda harus hitung 'on-the-fly' sangat sering. Pada terburuk Anda hanya perlu menghitung mereka sekali per giliran, dan jika beberapa sistem yang ingin sel tersentuh oleh efek maka Anda dapat dengan mudah cache nilai off ke dalam array 'reachableCells' atau sesuatu yang serupa; terlepas dari itu, perhitungannya sangat mudah sehingga harus dilakukan dengan efektif dalam hal biaya per-bingkai.

Jadi apa yang kamu dapat untuk itu? Fleksibilitas. Mudah untuk mengatakan sekarang bahwa nilai-nilai ini tidak akan pernah berubah, tetapi gim memiliki bakat untuk mengejutkan Anda; bahkan jika itu lebih mungkin daripada tidak bahwa daerah-daerah ini tidak akan berubah, Anda pada dasarnya tidak meninggalkan apa pun dengan membangun fleksibilitas itu, dan ada peluang bagus di masa depan-Anda akan berterima kasih kepada Anda. Terlebih lagi, bahkan jika itu adalah wilayah terakhir yang Anda gunakan, loop yang ditulis dengan baik untuk iterasi di atas wilayah akan jauh lebih mudah untuk dipahami dan di-debug daripada segala jenis array ubin tetap. Saya hanya benar-benar tidak melihat adanya keuntungan yang berarti untuk menggunakan data hard-code dibandingkan dengan manfaat dari pergi ke arah lain.


11

Jika nilai tidak akan pernah berubah, mereka mungkin juga statis. Mengapa membuang waktu CPU menghitung ulang sesuatu yang akan sama dengan yang terakhir kali?

Namun, mereka tidak perlu 'kode-keras':

  • Anda bisa meletakkan nilai dalam file data, dan memuatnya di awal.
  • Anda dapat melakukan pencarian selama bermain dan menyimpan nilai-nilai begitu Anda menemukannya.

Cara pertama masuk akal jika Anda berpikir Anda mungkin mengubah bentuk atau ukuran peta di masa depan. Cara kedua masuk akal jika menghitung nilai statis agak rumit.

Saya tidak tahu seperti apa peta hex enam dimensi, atau mengapa ada 9 + 2 (5 + 6 + 7 + 8) sel yang terlibat, tetapi hasil terbaik untuk situasi Anda - dan memang sebagian besar situasi dalam pemrograman game - adalah untuk kode apa pun yang memberi Anda hasil yang benar paling cepat. Anda dapat menggeneralisasikannya ke suatu algoritma nanti jika perlu. "Kode untuk hari ini", seperti yang dikatakan beberapa orang.


Semua ini. Pertama membuatnya bekerja, kemudian menenangkan ego;)
Mike Cluck

2
Hanya untuk memperjelas kebingungan Anda, saya pikir OP ketika mengacu pada kisi hex 5x5x5x5x5x5 tidak mengacu pada 6 dimensi fisik (atau virtual), melainkan sebuah segi enam segi enam, di mana setiap sisi segi enam berisi 5 segi enam lebih kecil sepanjang panjangnya, mirip dengan ini (abaikan titik-titik hitam). Dalam hal ini dewan akan berisi 9 + 2 (5 + 6 + 7 + 8) sel.

Ya, saya melihat itu dari diagram yang diposting di edit.
Kylotan

0

T: apakah ini satu-satunya game hex yang pernah Anda tulis? Tidak?

A: Maka jelas Anda harus mencoba menjadi fleksibel di mana pun itu tidak memerlukan banyak usaha ekstra. Terlepas dari bagaimana Anda mendefinisikan papan, sajikan saat runtime dengan tautan eksplisit. Sangat mudah untuk menggerakkan kode dan logika hubungan dalam hal melintasi tautan, yang tidak tergantung pada ukuran atau topologi papan.

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.