Xác định vị trí của một phần tử xoay trong Tetris


24

Tetris-Tiles được lưu trữ dưới dạng ma trận boolean 4x4. Mỗi bước xoay có ma trận riêng, biểu diễn của T -Block sẽ như thế này:

[
    0, 0, 0, 0,
    0, 1, 1, 1,
    0, 0, 1, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 0, 1, 1,
    0, 0, 1, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 1, 1, 1,
    0, 0, 0, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 1, 1, 0,
    0, 0, 1, 0,
    0, 0, 0, 0
]

Tôi đang cố gắng tìm cách tính toán vị trí của khối khi nó bị xoay và va chạm với bảng (bảng cũng là một ma trận). Tetris ban đầu đơn giản là không cho phép xoay một khối khi xoay sẽ dẫn đến va chạm. Các biến thể hiện đại của trò chơi sẽ giải quyết va chạm và di chuyển khối đến vị trí hợp lệ.

Dưới đây là một số tình huống cần được giải quyết. Bảng có kích thước 6x6, màu đỏ = khối hoạt động, màu xám = khối được đặt / chiếm. Mỗi lần, một vòng quay ngược chiều kim đồng hồ nên được thực hiện. Lớp phủ màu xanh lá cây biểu thị ma trận cho khối. Mũi tên chỉ ra hiệu chỉnh kết quả để giải quyết xoay vòng:

xoay khối tetris

  1. Khối nằm ở bên trái của bảng. Vì khối không thể rời khỏi bảng, nên nó được di chuyển trở lại bên trong sau khi xoay.
  2. Chặn "chạm đất", nhưng chưa được đặt / cam kết. Trong trường hợp này, ô phải được di chuyển lên để giải quyết xung đột (trong trường hợp "I" -Block, chuyển động sẽ là 2 ô trở lên).
  3. Ngói sẽ đánh các khối bị chiếm đóng, phải được di chuyển sang trái để giải quyết va chạm.
  4. Ngói không thể được xoay.

Điều gì sẽ là cách tiếp cận tốt nhất để giải quyết vấn đề này? Tối ưu, giải pháp nên chung chung, ví dụ. làm việc với các khối ma trận 4 x 4 tùy ý trên một bảng có kích thước và dân số tùy ý.


Thật thú vị .. Tôi đã làm một tetris một năm trước và tôi chỉ xoay ma trận và giữ nguyên bản gốc. Nếu một cái gì đó chồng chéo tôi đã sử dụng ban đầu. Làm việc tốt Tôi đã chơi thử khá thường xuyên và không bao giờ gặp vấn đề. Phải là may mắn. Cảm ơn chủ đề liên tục!
snitch182

Câu trả lời:


16

Tình huống bạn mô tả được gọi là " cú đá tường ".

Một cú đá vào tường xảy ra khi người chơi xoay một mảnh khi không còn chỗ trống trong các ô vuông mà tetromino thường sẽ chiếm sau khi xoay.

...

Thuật toán đá tường đơn giản nhất ... là thử di chuyển tetromino một khoảng trắng sang phải, rồi một khoảng trống sang trái và thất bại nếu không thể thực hiện được.

Có nhiều hệ thống xoay Tetris khác nhau, tất cả đều được ghi nhận trên Wikia: Rotation Systems

SRS là đặc tả Tetris "chính thức" và nó có một thuật toán khá phức tạp cho các cú đá trên tường liên quan đến các bảng. Mảnh cuối cùng thậm chí có thể không chồng lên mảnh ban đầu!

Các hệ thống luân chuyển DTET mở rộng thuật toán đơn giản nhất bằng cách kiểm tra lăm đá tường khác ngay bên cạnh phải và trái. Tất cả các mảnh theo cùng một quy tắc.


+1, wiki thú vị. Mặc dù di chuyển khối I sang trái hoặc phải sẽ không hoạt động. Các hệ thống xoay tiên tiến hơn dường như cũng áp dụng các quy tắc khác nhau cho các khối khác nhau .. Tôi muốn tìm một phương pháp có thể hoạt động cho tất cả các khả năng của khối (nếu không quá tốn kém).
bummzack

1
@bummzack: Chà, sau đó chỉ cần sử dụng cùng một bảng cho tất cả các khối như hệ thống DTET. Nó chỉ đơn giản là kiểm tra nhiều địa điểm hơn bên trái và bên phải. Bạn có thể tạo hệ thống của riêng mình và kiểm tra tuy nhiên nhiều vị trí bạn muốn. Tuy nhiên, sử dụng cùng một bảng cho tất cả các mảnh có thể cho phép đá tường "không tự nhiên".
Leftium

Cảm ơn các chỉnh sửa. Đây thực sự là tốt hơn nhiều so với các tài liệu trên wikia. Nhiều đánh giá cao.
bummzack
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.