언리얼엔진/노노그램

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

mstone8370 2023. 10. 14. 12:45

 

 

마지막으로 한 줄을 힌트에 모두 맞게 채우면 나머지 빈 칸들을 X로 자동으로 막아주는 기능을 추가한다.

이 기능은 설정에 옵션으로 추가해서 플레이어가 원하는 경우 켜거나 끄게 할 수 있도록 구현하기로 정했다.

 

그래서 이렇게 생긴 설정 화면을 추가했다.

설정에 관해서는 다른 글에서 다루겠다.

 

 

 


 

 

 

해당하는 줄이 모두 힌트에 맞게 채워져있는지를 확인하는 과정은 이전 글에서 이미 설명했다.

그러한 상황이 발생하면 함수를 바로 반환했는데 이번에는 true를 반환하게 해서 함수의 밖에서 그러한 경우가 발생했다는 것을 알려주게 했다.

bool UBoardManager::LineMatch(const FLineInfo& LineInfo, const TArray<FBlock>& Blocks, FLineCheck& OutLineCheck) const
{
    // (생략)
    
    // 1. 다른 경우보다 제일 우선되는 경우 확인.
    // 1.1. 모두 정답인지 확인.
    if (Blocks.Num() == LineInfoNum)
    {
        bool bAllMatch = true;
        for (int32 i = 0; i < LineInfoNum; i++)
        {
            if (Blocks[i].Length != LineInfo[i])
            {
                bAllMatch = false;
                break;
            }
        }
        if (bAllMatch)
        {
            OutLineCheck.Fill(true, LineInfoNum);
            return true;
        }
    }
    
    // (생략)
}

이 함수는 블럭의 정보를 보고 상황을 판단하는 역할만 하는 const 함수고, 빈 칸을 채우는 과정은 밖에서 한다.

빈 칸을 채우는 것은 단순하게 한 줄을 순환하면서 칸의 상황을 보고 빈칸이면 X로 막으면 된다.

 

그렇게 하면 아래와 같이 작동한다.

 

잘 작동하는듯하다.

 

 

하지만 테스트중에 문제를 하나 발견했다.

이전에 추가한 Undo와 Redo기능은 플레이어가 직접 채운 칸만 확인하므로, 자동으로 막힌 칸들은 기록에 남지 않아서 아래와 같은 문제가 발생한다.

 

Undo를 하는 이유는 플레이어가 칸을 잘못 채웠기 때문일 것이다.

다른 곳에 채워야 하는데 그 칸이 X로 막힌 상태로 유지되어있다면, X로 막힌 칸을 다시 빈 칸으로 바꿔야하는 번거로움이 발생한다.

 

이러한 문제를 해결하려면 자동으로 막힌 칸의 좌표도 알고있어야한다.

따라서 로그 구조체에 해당 좌표들을 저장하는 배열을 추가했다.

// PlayLog struct

struct FPlayLog
{
    ECellState From;
    ECellState To;
    TArray<FVector2D> Cells;
    TArray<FVector2D> AutoFilledCells;

    // (생략)
};

AutoFilledCells가 그 역할을 한다.

 

이 정보를 가지고 Undo와 Redo를 할 때 X를 빈 칸으로 바꾸거나, 빈 칸을 X로 막는 것을 추가로 하면 된다.

그렇게 하면 아래처럼 작동한다.

 

 

 

 

퍼즐을 푸는 중에 해당 옵션을 변경하는 경우에도 Undo와 Redo가 제대로 작동하도록 했다.

 

1. 옵션이 꺼져있는 중에 Undo를 하고, 옵션을 켜고, Redo하는 경우

 

 

 

2. 옵션이 켜져있는 중에 Undo를 하고, 옵션을 끄고, Redo하는 경우

 

 

 

 

아래 영상의 초반에서 확인 할 수 있다.

https://youtu.be/P435YyRHkDo?si=A7NXYk4OBJbYZTqA