3매치 구조 회고 (4) : 효율적으로 힌트 찾기
현재 회사에서 설계하고 유지보수한 3매치 코드는 이미 검증되었지만,
과거의 자신을 돌아보는 것이 늘 그렇듯 다시 읽어보면 구데기인 부분이 너무 많다.
그래서 이 시리즈는 과거의 설계를 돌아보며 더 확장성있는 코드를 고민해보는 글이 되겠다.
조건
1. 일정 시간동안 유저가 조작을 하지 않을 경우, 힌트를 보여 줄 것.
2. 이 때, 우선순위가 높은 힌트를 먼저 보여주어야 함.
3. 유저가 조작을 하기 전까지 랜덤한 힌트를 돌아가면서 보여주어야 함.
3-1) 3x1 이상의 우선순위 매치가 있을 경우, 그 매치들만 돌아가면서 보여 준다.
3-2) 일반 매치만 힌트 대상일 경우, 일반 매치만 돌아가면서 보여 준다.
과거의 나
1. 왼쪽 아래에서부터 위/오른쪽 방향으로 스왑한 결과의 매치를 조사한다.
1-1) 같은 일반 블록을 스왑하는 경우는 의미가 없으므로 제외한다.
2. 조사한 모든 매치를 우선순위로 소팅하고, 유저 조작이 일어나기 전까지 돌아가면서 보여 준다.
그림의 빈칸은 스왑 가능한 장애물이라고 하자. 그렇게 중요한 건 아니니까...
조건에 따라 로직을 돌리면, 그림처럼 세 가지 경우가 나온다.
오른쪽/위 방향만 판단하기 때문에 중복 케이스를 판단하지는 않지만, 어쩐지 비효율적이라는 생각을 안 할 수 없다.
현재의 나
어쩌면 뎁스가 있어서 최적화가 어려운 게 아닐까 생각해봤다.
현재 위치에서 "스왑을 해야" 매치가 발생하는지를 알아보는 건 1차적으로는 최적화할 구석이 없었기 때문이다.
그도 그럴 게, '전체 슬롯을 모두 순회하면서 스왑을 시도한다'에서 어떻게 더 세부적으로 최적화한단 말인가!
그래서 아예 다르게, 뎁스가 없는 힌트 로직을 생각해보기로 했다.
이전에 구글링으로 힌트 로직을 찾아본 적이 있는데, 그 글에 나온 그림으로부터 시작해보기로 했다.
글에 따르면 일종의 결정 트리를 만드는 것이라고 한다.
주황색 부분을 1차적으로 조사하고, 회색 부분을 2차적으로 조사했을 때 두 위치에 모두 블록이 있으면 된다.
특수 매치를 고려하지 않고도 가볍게 힌트를 판별할 수 있는 로직이라 할 수 있다.
그러나 조건에는 맞지 않았는데, 우선순위가 높은 힌트를 우선적으로 보여줘야 했기 때문이다.
과거에는 스왑해서 가로/세로의 개수를 판별하는 것이 더 비용이 적다고 생각했던 것 같다.
그치만 역시 해봐야 알기 때문에, 이 아이디어를 더 발전시켜보기로 했다.
일단 패턴을 분석해봤을 때, 대각선에 블록이 있는 경우에만 특수 매치를 할 수 있다는 것을 알아냈다.
우선적으로 대각선 위치부터 돌아가면서 위치를 체크하면 효율이 상승할 것이다.
1. 각 위치에 블록이 존재하는지를 데이터로 변환한다.
2. 1, 3, 5, 7 위치부터 각 힌트를 체크한다.
3. 대각선에서 매치가 발생하지 않는 경우, 모든 위치로 3매치 힌트를 체크한다.
힌트는 매치처럼 Hint abstract 클래스를 만들고,
Hint_5x1 / Hint_4x1 / Hint_3x3 ... 식으로 객체를 만들어서 우선순위형 계산을 하면 될 듯 하다.
효율을 위해, 힌트 체크는 보드의 중앙부터 실행하고 이미 체크된 슬롯은 계산에서 제외하면 될 것 같다.
'프로그래밍 > 기타' 카테고리의 다른 글
3매치 구조 회고 (3) : 효율적으로 매치하기 (0) | 2023.09.19 |
---|---|
3매치 구조 회고 (2) : 타겟팅 로직 (0) | 2023.09.18 |
3매치 구조 회고 (1) : 슬롯과 블록 (0) | 2023.09.15 |
댓글
이 글 공유하기
다른 글
-
3매치 구조 회고 (3) : 효율적으로 매치하기
3매치 구조 회고 (3) : 효율적으로 매치하기
2023.09.19 -
3매치 구조 회고 (2) : 타겟팅 로직
3매치 구조 회고 (2) : 타겟팅 로직
2023.09.18 -
3매치 구조 회고 (1) : 슬롯과 블록
3매치 구조 회고 (1) : 슬롯과 블록
2023.09.15