Tôi hiện đang có một trò chơi giống như Tetris đơn giản và đã gặp phải một vấn đề mà tôi không thể giải quyết.
Không giống như Tetris, nơi có một hình dạng rơi duy nhất , tôi có nhiều hình dạng, có khả năng lồng vào nhau cần phải rơi; Tôi cần tính toán vị trí cuối cùng của họ. Hãy xem xét những điều sau đây:
Để tính toán vị trí cuối cùng của hình dạng màu xanh lá cây, tôi chỉ cần quét xuống cho mỗi hình vuông cho đến khi tôi chạm vào một hình vuông khác hoặc cạnh của bảng. Làm xong
Đối với nhiều hình dạng đơn giản, tôi làm việc theo cách của mình lên bảng. Do đó, màu đỏ được tìm thấy là không cần di chuyển, màu cam đi xuống một, màu xanh xuống ba. Làm xong
Tôi không biết làm thế nào để xử lý các hình dạng màu xanh lá cây và màu đỏ lồng vào nhau. Sử dụng logic của số 2, chúng tôi sẽ kết thúc "không khí" lơ lửng giữa không trung. Nếu tôi quét xuống hình dạng màu xanh lá cây, tôi bắt gặp màu đỏ và do đó không di chuyển và ngược lại với màu đỏ. Giải pháp có thể là coi hai hình dạng là một.
Tương tự như # 3, trong kịch bản này, tôi cũng có thể thành công bằng cách coi các đối tượng là một.
Không giống như số 3 và số 4, tôi không thể coi hình dạng là một vì hình dạng màu cam sẽ nổi lên một hình vuông quá cao ...
Một biến thể khác của vấn đề # 6.
Có thể có các kịch bản khác theo đó tôi có nhiều hình dạng đan xen trong các kịch bản ngày càng phức tạp hơn, nhưng tôi nghĩ ở trên bao gồm các phần cơ bản nhất của vấn đề.
Tôi cảm thấy như có một giải pháp tao nhã mà tôi chưa gặp phải / nghĩ ra và sẽ rất biết ơn về bất kỳ hiểu biết, ý tưởng hoặc tài nguyên nào.
GIẢI PHÁP
Giải pháp tôi đưa ra thực sự rất thanh lịch, dựa trên câu trả lời của @ user35958 bên dưới, tôi đã tạo ra hàm đệ quy sau (mã giả)
function stop(square1, square2){
// Skip if we're already stopped
if(square1.stopped){
return;
}
// Are we comparing squares?
if(!square2){
// We are NOT comparing squares, simply stop.
square1.stopped = true;
} else {
// Stop IF
// square1 is directly above square2
// square1 is connected to square2 (part of the same complex shape)
if(square1.x == square2.x && square1.y == (square2.y+1) || isConnected(square1, square2)){
square1.stopped = true;
}
}
// If we're now stopped, we must recurse to our neighbours
stop(square1, squareAbove);
stop(square1, squareBelow);
stop(square1, squareRight);
stop(square1, squareDown);
}
GIF hoạt hình hiển thị từng lượt giải pháp
Để tóm tắt:
- Khi "dừng" một hình vuông, chúng tôi cũng dừng lại:
- MỌI hình vuông phía trên nó. LUÔN LUÔN.
- Hình vuông lân cận mà chúng ta được kết nối (nghĩa là cùng hình dạng).
- Chúng tôi dừng toàn bộ hàng dưới cùng và chức năng đệ quy qua các ô vuông.
- Chúng tôi lặp lại cho đến khi tất cả các hình vuông được dừng lại.
- Sau đó, chúng tôi hoạt hình.