테트리스에서 회전 된 요소의 위치 결정


24

테트리스-타일은 4x4 부울 매트릭스로 저장됩니다. 각 회전 단계에는 자체 행렬이 있으며 T 블록 의 표현 은 다음과 같습니다.

[
    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
]

블록이 회전하고 보드와 충돌 할 때 블록의 위치를 ​​계산하는 방법을 찾으려고합니다 (보드도 매트릭스입니다). 원래 Tetris는 회전으로 인해 충돌이 발생할 때 블록 회전을 허용하지 않습니다. 최신 게임 변형은 충돌을 해결하고 블록을 유효한 위치로 옮깁니다.

해결해야 할 상황은 다음과 같습니다. 보드는 6x6, 빨간색 = 활성 블록, 회색 = 배치 / 사용 된 블록입니다. 매번 시계 반대 방향으로 회전해야합니다. 녹색 오버레이는 블록의 매트릭스를 나타냅니다. 화살표는 회전을 해결하기위한 수정 결과를 나타냅니다.

테트리스 블록 회전

  1. 블록은 보드의 왼쪽에 있습니다. 블록은 보드를 떠날 수 없으므로 회전 후에 다시 안쪽으로 이동해야합니다.
  2. 블록이 "그라운드"에 도달했지만 아직 배치 / 커밋되지 않았습니다. 이 경우 충돌을 해결하기 위해 타일을 위로 이동해야합니다 ( "I"블록의 경우 이동은 2 셀이됩니다).
  3. 타일은 점유 된 블록에 부딪 치므로 충돌을 해결하려면 왼쪽으로 이동해야합니다.
  4. 타일을 회전시킬 수 없습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 최적의 솔루션은 예를 들어 일반적인 것이어야합니다. 임의로 크기가 조정되고 채워진 보드에서 임의의 4x4 매트릭스 블록으로 작업합니다.


흥미 롭습니다. 저는 1 년 전에 테트리스를했는데 방금 매트릭스를 회전시켜 원본을 유지했습니다. 뭔가 겹치는 경우 원래를 사용했습니다. 잘 작동했습니다. 나는 자주 테스트를했고 결코 문제가 발생하지 않았다. 운이 좋았을 것입니다. 흥미로운 주제에 감사드립니다!
snitch182

답변:


16

설명하는 상황을 " 벽 킥 "이라고합니다.

벽 킥은 플레이어가 회전 후에 테트로 미노가 일반적으로 차지하는 사각형에 공간이 없을 때 조각을 회전 할 때 발생합니다.

...

가장 간단한 월킥 알고리즘은 ... 테트로 미노를 한 칸 오른쪽으로 이동 한 다음 한 칸 왼쪽으로 이동하여 둘 다 수행 할 수 없으면 실패하는 것입니다.

다양한 테트리스 회전 시스템이 있으며 모두 Wikia에 문서화되어 있습니다. 회전 시스템

SRS는 "공식적인"테트리스 사양이며 테이블과 관련된 벽 킥에 대한 복잡한 알고리즘을 가지고 있습니다. 마지막 조각은 원본 조각과 전혀 겹치지 않을 수도 있습니다!

DTET 회전 시스템이 외에 단지 오른쪽과 왼쪽 다섯 다른 벽 차기를 확인하여 가장 간단한 알고리즘을 확장합니다. 모든 부분은 동일한 규칙을 따릅니다.


+1, 재미있는 위키. 이동 있지만 I의 블록을 하나 개의 공간이 왼쪽 또는 오른쪽이 작동하지 않습니다. 고급 회전 시스템은 블록마다 다른 규칙을 적용하는 것 같습니다. 비용이 많이 들지 않는 경우 모든 블록 가능성에 적합한 방법을 찾고 싶습니다.
bummzack 2016 년

1
@bummzack : 글쎄, DTET 시스템과 같은 모든 블록에 동일한 테이블을 사용하십시오. 왼쪽과 오른쪽 외에 더 많은 위치를 테스트합니다. 당신은 당신의 자신의 시스템을 만들고 원하는 많은 위치를 확인할 수 있습니다. 그러나 모든 조각에 동일한 테이블을 사용하면 "부 자연스러운"벽 킥이 허용 될 수 있습니다.
Leftium

편집 해 주셔서 감사합니다. 이것들은 실제로 위키아의 자료보다 훨씬 낫습니다. 매우 감사.
bummzack 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.