언리얼엔진/노노그램

[UE5] 노노그램 플레이 중 피드백에 관해서 - 1

mstone8370 2023. 9. 25. 23:35

노노그램 게임들을 해보면 퍼즐을 푸는 중에 칸을 어떻게 채웠는지에 대한 다양한 방식의 피드백을 준다.

몇 가지를 정리해보면

 

1. 피드백이 없음.

퍼즐을 완료했다는것만 알려주고, 그 외의 모든것을 직접 확인해야한다.

 

2. 힌트 하나씩 맞게 채웠는지를 알려준다.

칸이 채워진 상황을 분석해서 힌트에 맞게 채우면 해당하는 힌트가 하나씩 지워지면서 제대로 하고있다는 것을 알려준다.

그래서 칸을 무언가로 채울 때마다 피드백이 제공된다.

 

3. 한 줄의 모든 힌트에 맞게 칸을 채우면 해당하는 줄의 빈 칸을 모두 X로 막아준다.

난이도가 올라갈수록 확실하게 아닌 칸들을 X로 막는 것은 퍼즐을 푸는 중에 반드시 거쳐야하는 과정이다.

동시에 귀찮은 작업일 수도 있는데 이 귀찮은 작업을 자동으로 해주면서 칸을 맞게 채웠다는 정보도 전달해준다.

 

4. 정답 그림과 다르게 칸을 채우면 틀렸다는것을 바로 알려준다.

보통 이런 경우에는 일정 횟수를 넘게 틀리면 게임이 실패되는 경우가 많다.

 

 

넓게 묶으면 이렇게 4개의 방식으로 구분할 수 있다.

물론 위 중에서 여러 방식의 피드백을 제공하거나, 두 방식의 피드백이 섞인 방식을 제공하는 경우도 있다.

위 4개의 방식에선 1번에서 4번 방식으로 갈수록 피드백이 많아지면서 제약도 많아진다.

그리고 1번과 4번같은 극단적인 경우는 플레이어가 불편함을 느끼게 된다.

 

피드백이 없으면 실수가 잦아지게되고, 실수로 인해서 잘못 풀고있다는것을 깨닫게 될 때에는 이미 완전히 꼬여있을 가능성이 높다.

퍼즐의 크기가 커져서 난이도가 높아질 수록 확인해야할 정보가 많아서 실수를 늦게 깨닫게 될 가능성이 높아진다.

 

그에 반해서 너무 많은 피드백은 퍼즐을 푸는 재미를 감소시킨다.

정답에 맞지 않게 채우는 순간 잘못 채웠음을 알려주는것은 퍼즐 푸는 재미를 감소시키고, 퍼즐이 아닌 단순 반복 작업으로 느껴지게 될수도 있다.

그래서 보통 틀리는것에 횟수 제한을 두는데, 이 경우 역시 퍼즐을 풀어가는 과정을 즐기기에는 어려운점이 있다.

퍼즐을 푸는 과정 중에는 실수를 할 수도 있고 난이도가 높아질수록 정보가 많아서 실수를 할 가능성이 높아지는데, 실수를 할 때마다 틀렸음을 알려주고 플레이를 제한하면서 지금까지 쌓아온 과정을 잃어버릴 수도 있다는 압박감에 퍼즐을 푸는 과정에 온전히 집중하기 어려워진다.

 

그래서 위에서 2번과 3번이 퍼즐을 푸는 과정을 자유롭게 즐기면서 실수를 쉽게 알아차릴 수 있고, 귀찮은 과정도 넘어갈 수 있는 적당한 수준의 피드백이라고 생각한다.

개인적으로는 3번은 원치않게 X로 막히는 경우가 있어서 다시 지우는 불편함 때문에 선호하지는 않지만, 옵션으로 제공하는것은 필요하다고 생각한다.

그래서 이 프로젝트는 2번과 3번을 같이 지원하는 방향으로 정했다.

 

 

 


 

 

 

경험상 2번 방식의 피드백을 제공하는 게임은 많지 않았다.

그래서 레퍼런스로 삼을 만한 게임은 모바일 게임인 No2g와 Nonogram galaxy 뿐이었다.

 

이런 방식의 피드백을 제공하는 게임이 적으면서도 문제가 발생하는 이유는 칸을 채우는 경우의 수가 많고, 그 경우에 따라서 제공되어야 할 피드백이 달라지기 때문이라고 생각한다.

만약 한 줄만 따로 봤을 때 줄의 길이가 10칸이라면, 여기에 칸을 칠하기만 하는 모든 경우의 수를 아래와 같이 계산할 수 있다.

 

 

10칸으로 되어있는 한 줄에 아무것도 채우지 않는 경우부터 1칸, 2칸, ... , 10칸을 채우는 경우의 수가 전체 1,024가지가 있다.

30칸이라면 1,073,741,824가지로 10억가지 이상이다.

여기에 X로 칸을 막는 경우까지 추가되면 10칸일 때에는 3의 10승으로 59,049가지의 경우가 있다.

피드백은 이런 다양한 상황에도 정확하게 제공되어야한다.

 

그리고 그 수많은 경우 중에서 3번 방식에 해당하는 경우도 확인하게 된다.

따라서 2번 방식을 구현하면 자연스럽게 3번 방식도 해결된다.

 

위에서 언급했던 두 게임은 2번 방식의 피드백을 제공하다는 점에서 비슷하지만 방식은 다르다.

Nonogram galaxy가 상황을 더 자세하게 분석해서 알려준다.

No2g의 방식은 조건을 조금 더 맞춰야 상황을 분석해주지만, 이 정도로도 충분하다고 판단되어 복잡한 방식보다는 상대적으로 조금 더 간편한 방식을 따라가 보기로 했다.

 

 

 


 

 

 

2번 방식을 구현하기 위해선 먼저 생각해봐야할 것들이 있다.

1. 플레이어가 칸을 채웠을 때 어느 힌트를 의도하고 채운 것인지를 판단해야 한다.

2. 플레이어가 채운 칸을 언제 검사해야하는지를 정해야 한다.

3. 어느 칸이 어느 힌트에 해당하는지 모호한 경우가 있다.

 

중요한 것은 플레이어의 의도를 파악하는 것이다.

시스템은 플레이어의 의도에 따라 판단한 결과를 플레이어에게 알려줘서 번거로운 작업을 대신 해줘야 한다.

플레이어의 의도가 모호해서 알 수 없는 경우에는 플레이어도 잘 모르는 상황이니 아무런 결과를 주지 않으면 될 것이다.

고려해봐야할 부분은 플레이어의 의도가 명확하거나 모호한것을 어떻게 구분할 것이며, 그 기준을 무엇으로 해야하냐는 것이다.

 


 

플레이어가 칸을 채웠을 때 어느 힌트를 보고 채운것인지는 채워진 칸이 나타난 순서를 통해 판단한다.

만약 아래와 같이 한 줄에 칸이 채워져있다고 가정한다.

 

여기에서 이 줄의 힌트는 [ 1, 4, 2 ] 이고 왼쪽부터 오른쪽까지 0, 1, 2번 힌트라고 한다.

그리고 각 칸을 왼쪽부터 오른쪽까지 0, 1, 2, 3, 4, 5, 6, 7, 8, 9번 칸이라고 한다.

위의 경우에는 0, 1, 3번 칸은 X로 막혀있다.

8, 9번 칸은 비어있다.

2, 4, 5, 6, 7번 칸은 채워져있는 상태다.

그리고 연속적으로 채워진 칸들을 블럭이라고 정의하겠다.

따라서 위의 이미지에서는 길이가 1인 블럭과 길이가 4인 블럭이 존재한다.

블럭의 번호도 0번 블럭, 1번 블럭으로 하겠다.

 

그리고 왼쪽에서부터 보면 블럭들이 순서대로 존재하므로 [ 1, 4 ] 는 플레이어의 의도가 맞는 상황이다.

그 다음에는 아무 칸도 채워져 있지 않으므로 그 뒤는 알 수 없다.

따라서 0번 블럭은 0번 힌트를 의도한 것이고, 1번 블럭은 1번 힌트를 의도한 것임을 알 수 있다.

 

추가로 칸을 힌트의 숫자에 맞게 채웠으니 아래 이미지 처럼 맞췄음을 표현할 수 있다.

 

 

하지만 다음과 같은 경우에서는 다르다.

 

이 경우에는 3번 칸이 비워져있다.

만약 칸들이 이어지는 중간에 빈 칸이 나타나도 계속 검사를 이어가야 할까?

 

칸에 무언가를 넣는다는 것은 정해졌음을 의미하고, X로 칸을 막는다는 것은 그 칸은 확실히 채워지지 않아야 할 칸이라는 의미다.

반대로 빈 칸은 아직 알 수 없음을 의미하고, 위의 이미지에서 3번 칸은 플레이어 입장에서 아직 알 수 없는 상태임을 의미한다.

아직 플레이어가 확정하지 않았으므로 빈 칸으로인해 연결이 끊어졌다면 그 후로는 검사를 하는 의미가 없다.

따라서 위의 경우에는 0번 블럭만 검사한다.

 

 

 

그러므로 검사는 블럭이 이어져있을 때에만 한다.

이어져야할 대상은 줄의 양쪽 끝 둘 중 하나다.

그래야 중간에 알수없는 영역이 존재하지 않기 때문이다.

위의 예시에서는 왼쪽에서부터만 검사했지만 절차적으로는 오른쪽에서부터도 검사를 해야한다.

하지만 예시의 경우 오른쪽에서부터는 연결이 끊어져있으므로 검사를 하지 않아도 된다.

 

추가로 모바일게임인 No2g에서는 블럭의 길이가 힌트에 맞지 않아 틀린 경우에도 해당 방향의 검사를 멈춘다.

잘못 채워진 것으로 판단되는 경우는 실수를 했거나 아직 채우는 중인 경우에 발생하는데, 후자의 경우에는 아직 그 뒤로 연결된 블럭이 없을 것이므로 검사를 더이상 진행하지 않게 될 것이 분명하다.

하지만 실수를 한 경우에는 다음에 이어진 블럭이 존재할 수도 있다.

일단 실수가 발생했다는 상황에서부터 검사를 계속 이어가는게 의미가 있을까 싶긴 하지만, 계속 검사를 이어서 하는 방법은 테스트를 여러번 해보고 결정해봐야 할 듯 하다.

어느 방법이든 플레이어에게 칸을 잘못 채웠음을 알려주는 효과는 동일할 것으로 예상되므로, 일단은 레퍼런스인 No2g의 방식을 따른다.

 


 

다음에는 모호한 상황에는 어떻게 확인해야할지를 정한다.

 

아래의 예시는 모호함이 발생한 경우다.

 

힌트의 개수보다 블럭의 개수가 적은데다가 모든 블럭이 줄의 양쪽 끝에 연결되어있다.

그 뿐만 아니라 힌트의 숫자도 모두 같고, 블럭의 길이도 모두 힌트에 맞는 길이로 되어있다.

 

제일 윗 줄의 경우 세개의 블럭은 0, 1, 2번의 힌트에 해당할 수도 있고 1, 2, 3번의 힌트에 해당할 수도 있다.

이런 경우 어느 블럭이 어느 힌트에 해당하는지 알 수 없는 모호함이 발생한다.

 

그리고 두번째 줄도 모호함이 발생한다.

각 블럭들이 0, 1번 힌트에 해당할 수도 있고 2, 3번 힌트에 해당할 수도 있다.

이런 경우 해당 줄을 잘못 채웠다는 것은 분명한데 모든 힌트가 맞았다고 할 수는 없다.

따라서 모호함이 발생한 경우 모든 힌트를 틀린 것으로 처리해야한다.

 

하지만 맨 아랫줄의 경우에는 다르다.

물론 이 경우도 블럭이 0번 힌트에 해당할 수도 있고, 3번 힌트에 해당할 수도 있으므로 모호함이 발생한다.

하지만 1, 2번 힌트가 틀렸다는 것은 확실하므로 적어도 플레이어가 모든 힌트에 맞게 채웠다고 오해할 상황은 발생하지 않는다.

이 경우 모든 힌트를 틀린것으로 처리해도 되지만, 가능성이 있는 힌트는 맞췄다고 표현하는것도 괜찮다.

No2g에서는 후자의 방식으로 되어있으므로 그 방식으로 진행하겠다.

 

 


 

 

 

그 외에도 다양한 상황이 있다.

다음 글에서 그러한 상황을 하나씩 보면서 따져보겠다.