글 작성자: Doublsb
현재 회사에서 설계하고 유지보수한 3매치 코드는 이미 검증되었지만,
과거의 자신을 돌아보는 것이 늘 그렇듯 다시 읽어보면 구데기인 부분이 너무 많다.

그래서 이 시리즈는 과거의 설계를 돌아보며 더 확장성있는 코드를 고민해보는 글이 되겠다.

 

조건

1. 일정 시간동안 유저가 조작을 하지 않을 경우, 힌트를 보여 줄 것.

2. 이 때, 우선순위가 높은 힌트를 먼저 보여주어야 함.

3. 유저가 조작을 하기 전까지 랜덤한 힌트를 돌아가면서 보여주어야 함.

    3-1) 3x1 이상의 우선순위 매치가 있을 경우, 그 매치들만 돌아가면서 보여 준다.

    3-2) 일반 매치만 힌트 대상일 경우, 일반 매치만 돌아가면서 보여 준다.

 

 


 

 

과거의 나

1. 왼쪽 아래에서부터 위/오른쪽 방향으로 스왑한 결과의 매치를 조사한다.

    1-1) 같은 일반 블록을 스왑하는 경우는 의미가 없으므로 제외한다.

2. 조사한 모든 매치를 우선순위로 소팅하고, 유저 조작이 일어나기 전까지 돌아가면서 보여 준다.

왼쪽 아래에서부터 위/오른쪽 방향으로 비교

그림의 빈칸은 스왑 가능한 장애물이라고 하자. 그렇게 중요한 건 아니니까...

조건에 따라 로직을 돌리면, 그림처럼 세 가지 경우가 나온다.

오른쪽/위 방향만 판단하기 때문에 중복 케이스를 판단하지는 않지만, 어쩐지 비효율적이라는 생각을 안 할 수 없다.

 

 


 

 

현재의 나

어쩌면 뎁스가 있어서 최적화가 어려운 게 아닐까 생각해봤다.

현재 위치에서 "스왑을 해야" 매치가 발생하는지를 알아보는 건 1차적으로는 최적화할 구석이 없었기 때문이다.

그도 그럴 게, '전체 슬롯을 모두 순회하면서 스왑을 시도한다'에서 어떻게 더 세부적으로 최적화한단 말인가!

 

그래서 아예 다르게, 뎁스가 없는 힌트 로직을 생각해보기로 했다.

 

https://gamedev.stackexchange.com/questions/84501/how-to-implement-a-hint-system-for-nearby-matches-in-a-match-3-puzzle-game

 

How to implement a hint-system for nearby matches (in a Match-3 puzzle game)?

Taking Candy Crush as an example: In a Match-3 game, how would you figure out which nearby tiles are 1 move away from creating a match? Do you basically have to do it by trial-and-error on every ...

gamedev.stackexchange.com

이전에 구글링으로 힌트 로직을 찾아본 적이 있는데, 그 글에 나온 그림으로부터 시작해보기로 했다.

힌트 케이스

글에 따르면 일종의 결정 트리를 만드는 것이라고 한다.

주황색 부분을 1차적으로 조사하고, 회색 부분을 2차적으로 조사했을 때 두 위치에 모두 블록이 있으면 된다.

특수 매치를 고려하지 않고도 가볍게 힌트를 판별할 수 있는 로직이라 할 수 있다.

 

그러나 조건에는 맞지 않았는데, 우선순위가 높은 힌트를 우선적으로 보여줘야 했기 때문이다.

과거에는 스왑해서 가로/세로의 개수를 판별하는 것이 더 비용이 적다고 생각했던 것 같다.

 

그치만 역시 해봐야 알기 때문에, 이 아이디어를 더 발전시켜보기로 했다.

 

 

일단 패턴을 분석해봤을 때, 대각선에 블록이 있는 경우에만 특수 매치를 할 수 있다는 것을 알아냈다.

우선적으로 대각선 위치부터 돌아가면서 위치를 체크하면 효율이 상승할 것이다.

1. 각 위치에 블록이 존재하는지를 데이터로 변환한다.

2. 1, 3, 5, 7 위치부터 각 힌트를 체크한다.

3. 대각선에서 매치가 발생하지 않는 경우, 모든 위치로 3매치 힌트를 체크한다.

 

힌트는 매치처럼 Hint abstract 클래스를 만들고,

Hint_5x1 / Hint_4x1 / Hint_3x3 ... 식으로 객체를 만들어서 우선순위형 계산을 하면 될 듯 하다.

효율을 위해, 힌트 체크는 보드의 중앙부터 실행하고 이미 체크된 슬롯은 계산에서 제외하면 될 것 같다.

반응형