Xác định xem cấu trúc do người chơi tạo có khớp với mẫu trong trò chơi dựa trên khối 3D không


8

Tuyên bố miễn trừ trách nhiệm: đây là một trong những câu hỏi kiểu Minecraft đáng sợ, nhưng tôi cảm thấy đó là câu hỏi về cấu trúc dữ liệu và thuật toán

Tôi thực sự mới đối với cấu trúc dữ liệu 3D và đang tự hỏi cách tốt nhất để lưu trữ và khớp với cấu trúc khối 3D.

Ngay bây giờ, người chơi có thể đặt các khối trong bất kỳ không gian tùy ý nào và khi các khối này khớp với cấu trúc được xác định trước, một sự kiện sẽ xảy ra. Cách tôi đang làm hiện tại là khi người chơi đặt một khối trò chơi kiểm tra đệ quy từng khối liền kề để tìm khối có tọa độ x, y, z thấp nhất và làm cho khối đó chặn khối gốc. Sau đó, nó kiểm tra phần còn lại của các khối, dựa trên khối gốc, để đảm bảo chúng khớp với một mẫu nhất định. Vấn đề là khi mẫu trở nên phức tạp hơn, mã của tôi (không hiệu quả khủng khiếp) cũng vậy.

Tôi nghĩ cách tốt nhất để làm điều này là lưu trữ một số loại ma trận xác định cấu trúc và sau đó khớp với ma trận bất cứ khi nào người chơi đặt một khối. Đã có cấu trúc dữ liệu / thuật toán phù hợp với loại vấn đề này chưa?


1
Ví dụ, đang nghĩ làm thế nào để tạo mẫu các cấu trúc như cổng thông tin Minecraft?
giảm tốc

1
@Daniel Trên thực tế, tôi đoán đó sẽ là một ví dụ tốt. Mặc dù, mục tiêu của tôi sẽ là có một cấu trúc lớn / phức tạp tùy ý. Các cổng khá đơn giản.
WillP

1
Không phải là một câu trả lời, mà chỉ là một ý nghĩ - nếu các cấu trúc trở nên lớn tùy ý và danh sách các cấu trúc đích (mà bạn phải tìm kiếm để tìm một kết quả khớp) trở nên cực kỳ lớn, điều này trở thành một vấn đề nhận dạng mẫu, như nhận dạng văn bản hoặc lời nói. Sau đó, bạn chuyển từ so sánh lực lượng vũ phu sang các phương pháp thống kê như Mô hình Markov ẩn được đào tạo trên các cấu trúc mục tiêu của bạn. Điều đó thật tuyệt.
Pieter Müller

@Harikawashi Ôi trời, thật tuyệt. Mặc dù mục tiêu của tôi không phải là một cái gì đó lớn về mặt thiên văn, nhưng dù sao tôi cũng có thể làm điều đó để tôi có thể chơi xung quanh nó. Cảm ơn!
WillP

Câu trả lời:


10

Thành thật mà nói, tôi sẽ dùng giải pháp đơn giản.

Tạo một ma trận xác định cấu trúc. Bất cứ khi nào một khối được thay đổi, hãy cố gắng áp dụng ma trận đó cho tất cả các vị trí có thể đã tạo cấu trúc mới. Đó sẽ là các vị trí chiều rộng * chiều sâu * chiều cao, vì người chơi có thể đã hoàn thành bất kỳ điểm nào trên cấu trúc, nhưng điều đó không quá tệ vì hầu hết các vị trí này sẽ thoát ra sớm khi lần kiểm tra đầu tiên thất bại.

Về cơ bản, bạn đã có một ma trận 3d và bạn đang so sánh nó với một ma trận 3d khác, với một loạt các độ lệch.

Từ đây có một loạt các tối ưu hóa hoàn toàn tùy chọn bạn có thể làm. Ví dụ, nếu cấu trúc của bạn là vô cùng thưa thớt - tức là các cầu thủ đang xây dựng một tòa tháp cao với một quả cầu ở phía trên, nhưng bạn không quan tâm nếu dưới cùng của tháp được bao quanh bởi cây - bạn có thể biến nó thành một danh sách các khối thay vì ma trận. (Tôi sẽ tạo danh sách từ ma trận - ma trận sẽ dễ dàng hơn nhiều để duy trì trực tiếp.)

Nếu bạn muốn trở nên siêu thông minh, hãy chia cấu trúc thành các khối. Nếu bạn biết rằng người chơi chỉ thay đổi khối 1,2,3 và bạn biết rằng việc đặt cấu trúc của mình ở tọa độ 0,0,0 sẽ yêu cầu khối 1,2,3 phải là obsidian và khối 1,2,3 là gỗ , sau đó bạn thậm chí không cần phải thử khối 1,2,3. Tạo tất cả các độ lệch có thể có cho cấu trúc cho rằng người chơi vừa đặt một loại khối cụ thể. Sau đó, khi người chơi đặt khối đó, chỉ cần kiểm tra các độ lệch có thể có trước.

Nhưng, nghiêm túc, đây là tất cả tối ưu hóa. Chỉ cần tạo một ma trận, sau đó so sánh ma trận của bạn với phong cách vũ phu thế giới. Giả sử bạn đang tạo ra một thứ gì đó rất nhỏ, mọi người thực sự không đặt tất cả các khối đó - nhiều nhất là một vài khối mỗi giây. Trừ khi bạn có hàng trăm cấu trúc khổng lồ, bạn sẽ có thể kiểm tra dễ dàng.


3
Bạn đúng. Brute buộc thực sự không nên là một vấn đề hiệu suất lớn. Tôi cảm thấy như mình đã rơi vào cái bẫy tối ưu hóa sớm. Cảm ơn sự sáng suốt của bạn.
WillP

0

Vâng, bạn đến với một vấn đề thú vị. Tôi sẽ đề xuất một cái gì đó như sau: sử dụng các khối của bạn dưới dạng pixel và thực hiện phát hiện va chạm trên mỗi pixel, trong đó tất cả các khối phải khớp để trả về xung đột thực sự.

Điều này sẽ hoạt động tốt, tuy nhiên hãy đảm bảo bạn chỉ làm điều này khi các đối tượng / khối thay đổi. Vì vậy, tôi muốn giới thiệu một hệ thống sự kiện đơn giản để chuyển một thay đổi cho trình kiểm tra đối tượng, điều đó chắc chắn có thể sử dụng thuật toán của bạn. Mà sau đó sẽ làm bất cứ điều gì bạn muốn đối tượng đó làm. Ngoài ra, tôi khuyên bạn nên kiểm tra chiều cao và chiều rộng, trước khi chạy thuật toán, vì nếu nó không đủ cao / quá cao thì rõ ràng nó sẽ không khớp.

Theo như cấu trúc dữ liệu, một vectơ đơn giản sẽ làm hoặc có thể là cấu trúc dữ liệu tùy chỉnh.

Câu hỏi thú vị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.