우선 MatchManager를 통해서 전체 게임을 진행하겠습니다.

우선 필요한 로직을 함수 단위로 나누고, 함수를 채우는 식으로 진행할 예정입니다.

    
    public struct TileLine
    {
        private bool isVertical;
        private int lineIndex;
        private int startIndex;
        private int endIndex;
    }
    // 전체 타일을 랜덤하게 생성하는 함수
    // 최초 시작시와 매칭 할 수 있는게 없을 경우 호출한다.
    public void MakeAllTile(ref int[,] _tileArray)
    {

    }

    // 모든 타일에 대해 매칭 판별하는 함수
    // 매칭에 해당하는 모든 리스트를 반환한다.
    public List<TileLine> CheckAllMatch(int[,] _tileArray)
    {
        return null;
    }

    // 매칭된 타일을 제거하는 함수
    public void RemoveMatchTile(ref int[,] _tileArray,List<TileLine> _tileLines)
    {
        
    }

    // 제거된 타일의 빈공간을 채우는 함수.
    public void RefillTile(ref int[,] _tileArray, List<TileLine> _tileLines)
    {

    }

    // 채워진 타일이 매칭 가능한 패널이 존재하는지 확인.
    // 존재하지 않는다면 타일 생성을 다시해야한다.
    public bool CheckCanMatch(int[,] _tileArray)
    {
        return false;
    }
    
    // 특정 위치에 있는 타일에 대해 4방향으로 매칭이 있는지 확인하는 함수.
    // 유저가 swap 시 swap된 두 타일에 대해 사용한다.
    public List<TileLine> CheckOneMatch(int[,] _tileArray, int _x,int _y)
    {
        return null;
    }

이전 포스팅에서 나온 플로우에 따라 함수를 작성하였습니다. 위 함수는 아래와 같이 매칭됩니다.

1) 최초 타일 생성 - MakeAllTile

2) 매칭 판단 - CheckAllMatch

3) 매칭 제거 - RemoveMatchTile

4) 타일 리필 - RefillTile

5) 매칭 리스트가 없을때까지 1~4 반복

6) 매칭 할게 없는지 판단 - CheckCanMatch


7) 유저 인터렉트에 따른 부분 매칭 판단 - CheckOneMatch



위 함수들을 플로우에 맞게 최초 생성 로직 (1~6)을 짜보면 아래와 같습니다. 

    const int WIDTH = 9;
    const int HEIGHT = 9;

    int[,] tileGrid = new int[HEIGHT,WIDTH];
    
    void Start () {
        do
        {
            // 최초 전체 타일 생성.
            // 타일에 match 할 수 있는게 없다면 다시 타일 전체 생성.
            MakeAllTile(ref tileGrid);

            bool isMatch = true;
            while (isMatch)
            {
                // 전체 타일 중 match되는 타일 판별
                List<TileLine> matchLine = CheckAllMatch(tileGrid);

                //match가 있다면 제거하고 타일을 리필한 다음 다시 전체 match 판별 진행.
                if (match.Count > 0)
                {
                    isNotMatch = true;
                    RemoveMatchTile(ref tileGrid, matchLine);

                    RefillTile(ref tileGrid, matchLine);
                }
                else
                {
                    isMatch = false;
                }
            }
        } while (!CheckCanMatch(tileGrid));
    }


 7번 유저로직에 따른 진행은 GameManager가 아닌 Tile 클래스에서 터치이벤트에 따라 별도로 동작을 정의하였으나, 중요로직은 GameManager에 있다고 생각되어 앞으로 포스팅은 GameManager의 중요 로직이라고 생각하는 부분만 올리도록하겠습니다.

아마 매칭 로직과 제거, 리필 로직만 소개하게 될 거 같습니다.



* 지적은 언제나 환영입니다.

Posted by 검은거북

블로그 이미지
프로그래밍 공부 요약 및 공부하며 발생한 궁금증과 해결과정을 포스팅합니다.
검은거북

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.10
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함