사천성 만들기

1. 오류 수정

어제 발생했던, 같은 카드를 위->아래, 왼->오 순으로 클릭하면 카드가 제거되지 않던 현상을 고쳤고

전체적으로 코드를 수정했다.

 

코드의 문제점은 여러가지 였다.

1. 재귀 함수에서 카드 번호를 매개변수로 받고 난 후

그 변수를 다른 변수에 저장하지 않고 그대로 사용했다.

 

그 결과 for문 안에서 continue가 되었을 때, 매개 변수로 받을 당시의 카드 번호를 넘겨줘야 하는데

for문 안에서 바뀐 카드 번호를 넘겨주었기 때문에 정상적인 값이 나오지 않은 것이다.

 

+ 카드 번호뿐만 아니라 모든 매개변수를 따로 저장해야했다.

 

2. 코드의 순서가 잘못 되어 있었다.

 

3. 등등...

여러가지 고민하고 수정해서 드디어 사천성 로직이 얼추 완성되었다!!!

bool CheckCardConnectionRecursive(int turnCount, bool[] visited, int tempNum, int dirNum)
{
    int[] dx = { 0, 0, -1, 1 };
    int[] dy = { 1, -1, 0, 0 };

    for (int i = 0; i < dx.Length; ++i)
    {
        int nx = tempNum % xCount + dx[i];
        int ny = tempNum / yCount + dy[i];
        if ( nx < 0 || nx > xCount || ny < 0 || ny >= yCount)
            continue;

        int num = tempNum + dx[i] + (dy[i] * xCount);

        // secondCard와 같은 자리라면 true
        if (num == secondCard.GetComponent<Card>().cardNum)
            return true;

        // 카드가 있는 자리라면
        if (cardList[num].activeSelf)
            continue;

        // 방문한 자리라면
        if (visited[num])
            continue;
        bool[] tempVisited = (bool[])visited.Clone();
        tempVisited[num] = true;

        // 방향이 지금까지와 다르다면 ++turnCount
        int tempdir = dirNum;
        int tempTurnCount = turnCount;
        if (tempdir != i)
        {
            if (tempTurnCount < 3)
                ++tempTurnCount;
            else
                continue;
            tempdir = i;
        }

        if (CheckCardConnectionRecursive(tempTurnCount, tempVisited, num, tempdir))
            return true;
    }
    return false;
}

아직 손봐야할 부분이 많지만 게임은 문제없이 돌아간다.

 

블로그에 수정사항들을 적으면서 코드를 작성하려했는데

자잘하게 고칠 부분도 많고 생각할 것도 많아 블로그엔 정리 할 겨를이 없었다.

 

아직 가장자리 카드 제거를 구현하지 못했는데

내일 구현해야겠다.

와!

 

bool[] tempVisited = (bool[])visited.Clone();	// 얕은 복사

이건 오늘 배운 C# 얕은 복사법