마작 - 타일을 배열하여 레이아웃에 관계없이 적어도 하나의 승리 경로를 확보하세요.

StackOverflow https://stackoverflow.com/questions/159547

  •  03-07-2019
  •  | 
  •  

문제

타일에 사용되는 레이아웃에 관계없이, 게임 시작 시 퍼즐을 완성하고 게임에서 승리할 수 있는 경로가 하나 이상 존재한다는 것을 사용자에게 보장할 수 있도록 타일을 나눌 수 있는 좋은 방법이 있습니까? ?

당연히 사용자의 움직임에 따라 승리가 중단될 수도 있습니다.나는 단지 사용자가 잘 플레이하면 퍼즐을 이길 수 있다는 것을 항상 사용자에게 말할 수 있기를 원합니다.

게임 시작 시 타일을 무작위로 배치하면 사용자가 몇 번만 움직이고 더 이상 움직일 수 없을 수도 있습니다.퍼즐이 최소한 풀 수 있다는 사실을 아는 것은 퍼즐을 더욱 재미있게 플레이할 수 있게 해줄 것입니다.

도움이 되었습니까?

해결책

모든 타일을 반대로 배치하십시오 (즉, 중간에서 시작하여 보드를 배치하여 운동)

플레이어를 더 놀리려면 눈에 띄게 매우 빠른 속도로 할 수 있습니다.

다른 팁

게임을 반대로 플레이하십시오.

힙에 밀어 넣을 수있는 장소에서 쌍으로 조각을 무작위로 배치하십시오. 당신은 방법이 필요합니다 알다 사전 설정 패턴과 일치하는 힙으로 끝나기 위해 조각을 배치 할 수있는 곳이지만 어쨌든 필요합니다.

나는 이것이 오래된 질문이라는 것을 알고 있지만 문제를 직접 해결할 때 이것을 발견했습니다.여기에 있는 답변 중 어느 것도 완벽하지는 않으며, 그 중 일부는 복잡한 주의 사항이 있거나 병리학적 레이아웃을 깨뜨릴 것입니다.내 해결책은 다음과 같습니다.

표시되지 않은 타일을 사용하여 보드를 (뒤가 아닌 앞으로) 해결하세요.한 번에 두 개의 무료 타일을 제거합니다.제거한 각 쌍을 "일치하는 쌍" 스택에 푸시합니다.종종 이것이 당신이 해야 할 전부입니다.

막다른 골목에 부딪히면(numFreeTiles == 1), 생성기를 재설정하세요. :) 나는 일반적으로 막다른 골목에 도달하지 않으며 지금까지 10회 정도에 대해 최대 재시도 횟수가 3회라는 것을 알았습니다. 내가 시도한 레이아웃.8번의 재시도를 하면 포기하고 나머지 타일을 무작위로 할당합니다.이를 통해 플레이어가 문제를 일으켜 100% 해결 불가능한 상태가 된 경우에도 보드 설정과 셔플 기능 모두에 동일한 생성기를 사용할 수 있습니다.

막다른 골목에 이르렀을 때 또 다른 해결책은 다른 경로를 택할 수 있을 때까지 뒤로 물러나는 것입니다(스택을 꺼내고 보드의 타일을 교체).원래 차단 타일을 제거할 쌍이 일치하는지 확인하여 다른 경로를 선택하세요.

불행하게도 보드에 따라 이는 영원히 반복될 수 있습니다.모든 후속 "도로"가 막다른 골목이고 여러 개의 막다른 골목이 있는 "콘센트 없음" 도로와 유사한 쌍을 제거하게 되면 알고리즘이 완료되지 않습니다.이런 경우에 보드를 설계하는 것이 가능한지는 모르겠지만, 그렇다면 여전히 해결책이 있습니다.

더 큰 문제를 해결하려면 가능한 각 보드 상태를 DAG의 노드로 처리하고 선택된 각 쌍은 해당 그래프의 가장자리가 됩니다.깊이 72에서 리프 노드를 찾을 때까지 무작위 순회를 수행합니다.하강을 반복하지 않도록 횡단 기록을 추적하십시오.

내가 사용한 레이아웃에서 막다른 골목은 첫 번째 시도 솔루션보다 더 드물기 때문에 즉시 떠오르는 것은 하이브리드 솔루션입니다.먼저 최소한의 메모리로 문제를 해결해 보세요(선택한 쌍을 스택에 저장).첫 번째 막다른 골목에 도달하면 각 노드를 방문할 때 전체 표시/에지 생성을 수행하는 수준으로 저하됩니다(가능한 경우 지연 평가).

하지만 나는 그래프 이론에 대해 거의 연구하지 않았으므로 DAG 무작위 순회/검색 문제에 대한 더 나은 솔루션이 있을 수 있습니다. :)

편집하다:실제로 2008년 10월 13일 게시물과 같이 보드를 역으로 생성하는 내 솔루션을 사용할 수 있습니다.여전히 막다른 골목에 직면할 수 있기 때문에 여전히 동일한 주의 사항이 있습니다.하지만 보드를 거꾸로 생성하는 경우 규칙이 더 복잡해집니다.예를 들어, 1개의 긴 행이 있는 레이아웃과 같이 중간에 있는 첫 번째 부분이 있는 행 중 적어도 일부를 시작하지 않으면 설정이 실패할 것이 보장됩니다.전진 해결 생성기에서 완전히 무작위(합법적인) 첫 번째 이동을 선택하면 해결 가능한 보드로 이어질 가능성이 더 높습니다.

내가 생각해 낼 수 있었던 유일한 것은 타일을 역전 쌍으로 내려 놓는 것입니다. 따라서 타일 배치 중 언제라도 보드는 실제 게임의 중간에있는 것처럼 보일 것입니다 (즉, 다른 타일 위에 3 개의 레이어를 떠 다니는 타일은 없습니다).

타일이 리버스 게임에서 일치하는 쌍으로 배치되면 항상 게임을 해결하기 위해 최소한 하나 이상의 전진 경로를 만들어야합니다.

다른 아이디어를 듣고 싶습니다.

나는 최선의 대답이 이미 밀려 났다고 생각합니다. "반대 방향" - 즉, 빈 보드로 시작한 다음 어딘가에 쌍을 추가하고, 해결 가능한 위치에 다른 쌍을 추가하는 등 ...

"빅뱅"접근 방식을 선호하는 경우 (처음에 전체 세트를 무작위로 생성) 사나이 개발자 또는 오늘날 마조히즘을 느끼면 주어진 세트에서 취할 수있는 모든 쌍과 지시 된 그래프를 통해 서로 의존하는 방식을 나타낼 수 있습니다.

거기에서, 당신은 해당 세트의 전이 폐쇄를 가져 와서 원하는 끝으로 이어지는 초기 법적 쌍 중 하나 이상에서 하나 이상의 경로가 있는지 확인하면됩니다 (타일 쌍이 남지 않음).

이 솔루션 구현은 독자에게 연습으로 남겨 둡니다.

다음은 제 구현에 사용한 규칙입니다.

BuildingHeap은 각각 쌍의 각 프렛마다 별도로 쌍에 대해 셀 (장소)을 찾습니다.

  • 낮은 수준의 모든 셀이 이미 채워져 있습니다
  • 두 번째 프렛을위한 장소는 첫 번째 프렛이 이미 탑승 한 경우를 고려하여 먼저 차단되지 않습니다.
  • 두 곳 모두 이미 지어진 힙의 "가장자리"입니다.
    • 왼쪽이나 오른쪽에 이웃이 하나 이상 있습니다.
    • 또는 먼저 연속으로 프렛입니다 (오른쪽과 왼쪽의 모든 셀은 재귀 적으로 무료입니다).

이 규칙은 빌드가 항상 성공할 것이라고 보장하지는 않습니다. 때로는 마지막 2 개의 프리 셀 자체 차단을 남기고, 빌드는 실제로 6 개 이하의 "거북"이 내장 된 "거북이"를 실제로 재 처리해야합니다 (또는 적어도 마지막 몇 번의 프렛).

존재하는 대부분의 게임은 중간 어딘가에있는 첫 번째 ( "첫 번째 행") 프렛을 먼저 두는 것을 제한하는 것 같습니다. 이것은 매우 긴 줄의 가장자리에 프렛이없고 마지막 플레이어가 움직일 때까지 머무를 때 더 편리한 구성을 제시합니다. 그러나 "중간"은 구성에 따라 다릅니다.

행운을 빕니다 :)

추신 : 한 번에 용서 가능한 힙을 구축하는 Algo를 찾았다면 알려주십시오.

게임에 144 개의 타일이 있고, 각각 144 개의 타일에는 블록 목록이 있습니다. (스택의 상단 타일은 빈 블록 목록이 있습니다)

모든 유효한 동작은 "current__vertical_block_list"가 비어 있어야합니다. 이것은 144x144 행렬 일 수 있으므로 20k의 메모리와 왼쪽 및 오른쪽 블록 목록, 각각 20k입니다.

(remaning_tiles) 및 (비어있는 현재 수직 블록 목록) 및 ((비어있는 현재 왼쪽 블록 목록) 또는 (비어있는 현재 오른쪽 블록 목록))에서 유효한 이동 테이블을 생성합니다.

유효한 이동 테이블에서 2 개의 랜덤 타일을 선택하고 녹음 (현재 테이블 vert, 왼쪽 및 오른쪽), 스택으로 제거 된 타일을 녹음

이제 유효한 게임을 구성하는 동작 목록이 있습니다. 일치하는 타일 유형을 72 개의 동작 각각에 할당하십시오.

도전적인 게임의 경우 각 타일을 사용할 수있게되면 추적하십시오. 공백이기 때문에 (늦게 늦은 늦게까지) (늦게 늦게) 1 ee 1 ll과 2 le 블록을 찾으십시오. 왼쪽 조각 오른쪽 블로킹을 제외하고)
일단 주문으로 유효한 게임 플레이를 얻었습니다.

혼자 하는 여러 가지 놀이? 추측 만하지만, 나는 당신의 컴퓨터가 이것을 결정하기 위해 게임을 이길 필요가 있다고 가정합니다.

또 다른 옵션은 여러 사전 설정된 레이아웃 (현재 레벨과 혼합되어 승리 할 수있는 여러 사전 설정 레이아웃이있는 것일 수 있습니다.

어느 정도까지 4 타일 중 하나가 다른 X보다 X 층 이하인지 확인할 수 있습니다.

내가 보는 대부분의 게임은 누군가가 붙어있을 때 셔플 명령을 가지고 있습니다.

나는 혼합 된 것들을 시도하고 가장 잘 작동하는 것을 볼 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top