사천성 만들기
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# 얕은 복사법
'내일배움캠프(Unity)' 카테고리의 다른 글
내일배움캠프 게임개발(Unity) 사전캠프 19일차 TIL (0) | 2023.10.26 |
---|---|
내일배움캠프 게임개발(Unity) 사전캠프 18일차 TIL (0) | 2023.10.25 |
내일배움캠프 게임개발(Unity) 사전캠프 16일차 TIL (1) | 2023.10.23 |
내일배움캠프 게임개발(Unity) 사전캠프 15.5일차(주말추가공부) TIL (0) | 2023.10.22 |
내일배움캠프 게임개발(Unity) 사전캠프 15일차 TIL (0) | 2023.10.20 |