나는 현재 간단한 테트리스와 같은 게임을 가지고 있으며 해결할 수없는 문제를 겪었습니다.
단일 떨어지는 모양 이있는 Tetris와는 달리 , 여러 가지 잠재적으로 맞 물리는 모양이 있습니다. 최종 위치를 계산해야합니다. 다음을 고려하세요:
녹색 모양의 최종 위치를 계산하기 위해 다른 사각형이나 보드 가장자리에 닿을 때까지 모든 사각형을 간단히 스캔합니다. 끝난
여러 개의 간단한 모양을 위해 보드 위로 올라갑니다. 따라서 빨간색은 움직일 필요가 없으며 주황색은 1 씩, 녹색은 3으로 내려갑니다. 끝난
연동 된 녹색 및 빨간색 모양을 처리하는 방법을 모르겠습니다. # 2의 논리를 사용하여 공중에 떠 다니는 "고착"됩니다. 녹색 모양을 스캔하면 빨간색이 표시되어 움직이지 않으며 빨간색도 마찬가지입니다. 해결책은 두 모양을 하나로 취급하는 것입니다.
# 3과 유사하게이 시나리오에서 객체를 하나로 취급하여 성공할 수도 있습니다.
# 3 및 # 4와 달리 주황색 모양이 1 제곱을 너무 높게 떠서 모양을 하나로 취급 할 수 없었습니다 ...
문제 # 6의 또 다른 변형.
점점 더 복잡한 시나리오에 얽히는 많은 모양이있는 다른 시나리오가있을 수 있지만 위의 문제가 가장 근본적인 부분이라고 생각합니다.
나는 아직 만나거나 생각하지 않았고 통찰력, 아이디어 또는 리소스에 매우 감사 할 우아한 솔루션이 있다고 생각합니다.
해결책
내가 생각해 낸 해결책은 아래 @ user35958의 답변을 바탕으로 실제로 우아하고 다음과 같은 재귀 함수 (의사 코드)를 만들었습니다.
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
요약하면 다음과 같습니다.
- 정사각형을 "정지"하면 다음도 중지됩니다.
- 위의 모든 사각형. 항상.
- 우리가 연결된 이웃 광장 (즉, 같은 모양).
- 우리는 전체 행을 멈추고 함수는 사각형을 통해 반복됩니다.
- 모든 사각형이 멈출 때까지 반복합니다.
- 그런 다음 애니메이션을 만듭니다.