Menentukan apakah struktur yang dibuat pemain cocok dengan templat di game berbasis blok 3D

8

Penafian: ini adalah salah satu pertanyaan gaya Minecraft yang ditakuti, tapi saya rasa ini lebih merupakan struktur data dan pertanyaan algoritma

Saya benar-benar baru dalam struktur data 3D dan bertanya-tanya apa cara terbaik untuk menyimpan dan mencocokkan struktur blok 3D.

Saat ini, pemain dapat menempatkan blok di ruang sembarang dan ketika blok ini cocok dengan struktur yang telah ditentukan, suatu peristiwa terjadi. Cara saya melakukannya saat ini adalah ketika seorang pemain menempatkan sebuah blok permainan secara rekursif memeriksa setiap blok yang berdekatan untuk menemukan blok dengan koordinat x, y, z terendah dan membuatnya yang memblokir blok root. Kemudian memeriksa sisa blok, berdasarkan dari blok root, untuk memastikan mereka cocok dengan templat tertentu. Masalahnya adalah bahwa ketika template semakin rumit, begitu juga kode saya (sangat tidak efisien).

Saya berpikir cara terbaik untuk melakukan ini adalah untuk menyimpan beberapa jenis matriks yang mendefinisikan struktur dan kemudian mencocokkan dengan matriks setiap kali pemain menempatkan blok. Apakah sudah ada struktur data / algoritma yang cocok dengan jenis masalah ini?

WillP
sumber
1
Sebagai contoh, apakah sedang memikirkan bagaimana cara membuat templat struktur seperti portal Minecraft?
deceleratedcaviar
1
@ Daniel Sebenarnya, saya kira itu akan menjadi contoh yang baik. Meskipun, tujuan saya adalah memiliki struktur besar / kompleks yang sewenang-wenang. Portal agak sederhana.
WillP
1
Bukan jawaban, tetapi hanya pemikiran - jika struktur menjadi besar secara sewenang-wenang, dan daftar struktur target (yang harus Anda cari untuk menemukan kecocokan) menjadi sangat besar, ini menjadi masalah pengenalan pola, seperti mengenali teks atau ucapan. Kemudian Anda beralih dari perbandingan brute force ke metode statistik seperti Hidden Markov Models yang dilatih pada struktur target Anda. Itu akan sangat keren.
Pieter Müller
@Harikawashi Ya ampun, itu akan sangat keren. Meskipun tujuan saya bukanlah sesuatu yang besar secara astronomis, saya mungkin tetap melakukannya hanya supaya saya bisa bermain-main dengan itu. Terima kasih!
WillP

Jawaban:

10

Sejujurnya, saya akan mengambil solusi sederhana.

Buat matriks yang mendefinisikan struktur. Setiap kali blok diubah, cobalah untuk menerapkan matriks itu ke semua lokasi yang mungkin telah membuat struktur baru. Itu akan menjadi lokasi lebar * kedalaman * tinggi, karena pemain bisa menyelesaikan setiap titik pada struktur, tetapi seharusnya tidak terlalu buruk karena sebagian besar lokasi ini akan keluar lebih awal ketika cek pertama gagal.

Pada dasarnya, Anda punya matriks 3d, dan Anda membandingkannya dengan matriks 3d lain, di banyak offset.

Dari sini ada banyak optimisasi opsional yang bisa Anda lakukan. Misalnya, jika struktur Anda sangat jarang - yaitu pemain sedang membangun sebuah menara tinggi dengan bola di atas, tetapi Anda tidak peduli jika bagian bawah menara ini dikelilingi oleh pohon - Anda bisa mengubahnya menjadi daftar dari blok bukan matriks. (Saya akan membuat daftar dari matriks - matriks akan jauh lebih mudah dipelihara secara langsung.)

Jika Anda ingin menjadi sangat pandai, pisahkan struktur menjadi blok-tipe. Jika Anda tahu bahwa pemain baru saja mengubah blok 1,2,3, dan Anda tahu bahwa menempatkan struktur Anda pada koordinat 0,0,0 akan membutuhkan blok 1,2,3 menjadi obsidian, dan blok 1,2,3 adalah kayu. , maka Anda bahkan tidak perlu mencoba blok 1,2,3. Hasilkan semua offset yang mungkin untuk struktur mengingat pemain baru saja menempatkan jenis blok tertentu. Kemudian, ketika pemain menempatkan blok itu, cukup periksa kemungkinan offset yang pregenerasi.

Tapi, serius, ini semua optimasi. Buat saja matriks, lalu bandingkan matriks Anda dengan gaya brute-force dunia. Dengan asumsi Anda membuat sesuatu Minecrafty, orang benar-benar tidak menempatkan semua banyak blok - paling banyak beberapa blok setiap detik. Kecuali Anda memiliki ratusan struktur besar, Anda akan dapat mengujinya dengan mudah.

ZorbaTHut
sumber
3
Kamu benar. Pemaksaan brutal seharusnya tidak menjadi masalah kinerja utama. Saya merasa seperti terjebak dalam optimisasi prematur. Terima kasih atas wawasan Anda.
WillP
0

Ya, Anda punya masalah yang menarik. Saya akan menyarankan sesuatu seperti berikut: gunakan blok Anda sebagai piksel dan lakukan deteksi tabrakan per / pixel, di mana semua blok harus cocok untuk mengembalikan tabrakan yang benar.

Ini akan bekerja dengan baik, namun pastikan Anda hanya melakukan ini ketika objek / blok berubah. Jadi saya akan merekomendasikan sistem acara sederhana untuk meneruskan perubahan ke pemeriksa objek, yang tentu saja dapat menggunakan algoritma Anda. Yang kemudian akan melakukan apa pun yang Anda ingin objek itu lakukan. Saya juga merekomendasikan untuk memeriksa tinggi dan lebar, sebelum menjalankan algoritme, karena jika tidak cukup tinggi / terlalu tinggi jelas tidak akan cocok.

Sejauh struktur data, vektor sederhana akan melakukannya, atau mungkin struktur data khusus.

Pertanyaan menarik.

Avlagrath
sumber