Làm thế nào tôi có thể đảm bảo một lưới có thể được lấp đầy bằng các mảnh giống như Tetris?


8

Tôi đang nghĩ đến việc tạo ra một trò chơi giải đố trong đó mục tiêu là lấp đầy một lưới bằng những mảnh ghép hình (ví dụ, hình dạng Tetris cổ điển).

Làm thế nào tôi có thể tạo ra một tập hợp các mảnh có thể được đảm bảo sẽ được sử dụng để lấp đầy lưới, không để lại khoảng trống? Làm thế nào tôi có thể điều chỉnh thuật toán này để mở rộng độ khó của câu đố kết quả?



1
Bạn có cho phép hai hoặc hai squarenparts?
Steven

@steven "monominos" và "dominos". Tất cả các mảnh Tetris cổ điển là tetrominos. Có 12 pentominos và 35 hexominos ...
david van brink

Câu trả lời:


8

Đây là một vấn đề khó khăn đã biết, xác định hình chữ nhật nào có thể được lát bằng một số phần nhất định.

Tuy nhiên, nếu bạn đang xây dựng các câu đố và có thể kiểm soát các mảnh ghép, thì đó là vấn đề ngược lại, mang tính xây dựng và dễ dàng hơn ...

Xây dựng giải pháp xây dựng. Lấy một vài mảnh bạn thích, và điền vào câu đố theo cách bạn muốn. Sau đó ném vào các ô vuông đủ để điền vào nó và bạn đã đảm bảo rằng có ít nhất một giải pháp. Hay đúng hơn, bao gồm một số mảnh nhỏ trong bộ mảnh được phép của bạn.

Đối với việc giải quyết / đặt ra các mảnh, một cách tiếp cận vũ phu điển hình là lấp đầy nó từ trái sang phải, sau đó từ trên xuống dưới. Tìm ô mở đầu tiên (được đánh số LR, TB) và cố gắng đặt các phần được phép của bạn theo các hướng được phép của chúng (8 hướng cho một mảnh không đối xứng nếu bạn cho phép lật). Có lẽ kiểm tra những miếng lớn đầu tiên được phép và dùng đến những miếng nhỏ hơn nếu cần thiết. Khi bạn đạt đến trạng thái mà bạn không thích (ngõ cụt, quá nhiều mảnh nhỏ hoặc không có gì) thì hãy quay lại. Nếu một bộ lưới / mảnh nhất định không đáp ứng các tiêu chí của bạn, nghĩa là, nó quay lại tất cả các cách mà không hoàn thành, hãy thử một bộ hình chữ nhật và mảnh khác nhau.

Một cách để tạo ra một câu đố "dễ dàng hơn" có thể là trao đổi các mảnh lớn hơn cho các mảnh nhỏ hơn như monominoes và domino, vì điều này sẽ để lại nhiều cách hơn để lấp đầy các lỗ cuối cùng. Hoặc, tương tự, xây dựng một giải pháp ủng hộ những mảnh nhỏ hơn.

Một số nhà đa hình lưu ý bao gồm:

==> http://ee.usc.edu/facemony_staff/facemony_directory/golomb.htmlm Golomb ban đầu đặt ra thuật ngữ "Polyomino"

==> http://www.eklhad.net/polyomino/ Dahlke đã giải quyết khá nhiều hình chữ nhật chứa đầy các mảnh giống hệt nhau (một dạng ốp lát đặc biệt hiếm)


3

Bài viết này (trang 11-13, từ chối trách nhiệm: Tôi là một trong những tác giả) mô tả thuật toán sử dụng lập trình động để tạo ra các vùng hình chữ nhật được lát gạch hoàn hảo có chiều rộng w và chiều cao h , theo thời gian là tuyến tính trong h sau khi tiền xử lý mất khoảng 2 ( w . D ) thời gian / không gian ( D là kích thước dài nhất của một hình dạng riêng lẻ, ví dụ 4 trong trường hợp các mảnh Tetris).

Ý tưởng tương tự như mô tả của David ở trên, và tập trung vào dải phía trên , đặt các mảnh không tạo ra lỗ hổng . Điều quan trọng ở đây là bắt đầu bằng cách tính toán trước các lựa chọn thay thế được phép cho từng trạng thái của dải trên, để bạn không còn phải trả tiền cho vụ nổ tổ hợp khi bạn tạo các vùng.

Thuật toán hoạt động cho bất kỳ tập hợp các hình dạng (lồi).

Ngoài ra, một khía cạnh thú vị của một thế hệ ngẫu nhiên thống nhất là nó đảm bảo sự đa dạng tối đa giữa các thế hệ liên tiếp (nhưng bạn cũng có thể hạn chế thế hệ theo bất kỳ cách nào bạn muốn). Dưới đây là một số kết quả đầu ra điển hình:

Một số hình vuông được tạo ngẫu nhiên có chiều rộng 6

Vui lòng hỏi xem bạn có gặp rắc rối với việc triển khai không (tôi thậm chí có thể có một triển khai Python nhanh và bẩn nằm ở đâu đó ...)


việc thực hiện python mà bạn đề cập sẽ rất hữu ích
user2682863

1

Đây là một kỹ thuật chúng ta đã sử dụng trong quá khứ để gian lận một chút về phần cứng hạn chế hơn. Nó không thuần túy như các giải pháp phức tạp hơn, nhưng có ưu điểm khác biệt là dễ thực hiện và hoạt động hơn mọi lúc.

Thay vì tập trung vào toàn bộ câu đố, hãy chia nó thành các đơn vị nhỏ hơn, thống nhất . Mỗi đơn vị này bao gồm một số mảnh ghép khớp với nhau để tạo thành hình vuông hoặc hình chữ nhật dễ dàng hơn nhiều để điền vào một câu đố. Chọn ngẫu nhiên từ các cấu hình khác nhau để lấp đầy chiều rộng của câu đố (các mẫu bên dưới, nhưng có rất nhiều, nhiều cấu hình). Dưới đây là các mẫu xe 4 x 4, 5x4 và thậm chí là ví dụ 10x4.

Hình vuông và hình chữ nhật

Ý tưởng là bạn "vạch" câu đố ... chọn chiều rộng ngẫu nhiên dựa trên căn phòng còn lại có sẵn. Khi một "sọc" kết thúc, bắt đầu một sọc mới.

Bạn giải phóng từng mảnh một tại một thời điểm bằng cách ngẫu nhiên trong mỗi bộ "sọc". Nếu bạn muốn tăng độ khó, hãy giải phóng ngẫu nhiên từ hai hoặc nhiều sọc cùng một lúc.

Sử dụng kỹ thuật này, bạn không chỉ đảm bảo rằng câu đố có thể giải được, bạn còn giúp "gian lận" thứ tự phát hành để dễ sống hơn. Tất nhiên trong thực tế, người chơi không thể giải quyết hoàn hảo từng sọc và do đó, sự hỗn loạn xảy ra.

Tiếp tục tạo sọc cho đến khi người chơi thua. Tất nhiên, ví dụ của tôi là một dải cao 4 khối, nhưng bạn có thể chọn một cái gì đó lớn hơn và phức tạp hơn:

nhập mô tả hình ảnh ở đây

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.