Пример #1
0
    // 아래로 내려가줄지 판단
    public void Check_Down(System.Action finish)
    {
        List <Dir> candidates = new List <Dir>()
        {
            Dir.D
        };                                                // 바로 아래부터 체크

        candidates.AddRange(Random.Range(0, 2) == 0 ? new List <Dir>()
        {
            Dir.RD, Dir.LD
        } : new List <Dir>()
        {
            Dir.LD, Dir.RD
        });                                                                                                                     // 좌, 우 체크는 랜덤

        for (int i = 0; i < candidates.Count; ++i)
        {
            Near_State state = Get_Point().Get_NearState(candidates[i]);

            if (state == Near_State.Block_NonExist)
            {
                Point point = Get_Point().Get_NearPoint(candidates[i]); // 내려갈 곳이 있다!

                if (candidates[i] != Dir.D)                             // 좌,우 이동인 경우 내 머리위에 블럭이 없어야함 + 이동할 블럭 머리위에서 내려올 수 있는 기회를 뺏으면 안됨
                {
                    Near_State candidateState = Get_Point().Get_NearState(Dir.U);

                    if (candidateState == Near_State.Block_Exist) // 내 위에 블럭이 있으면 내려가지 못한다
                    {
                        continue;
                    }

                    candidateState = point.Get_NearState(Dir.U);

                    if (candidateState == Near_State.Block_Exist || candidateState == Near_State.Block_Moving)
                    {
                        continue;
                    }
                }

                Go_Down(point, finish);
                break;
            }
        }

        finish.Invoke(); // 아래로 갈 수 없음
    }
Пример #2
0
    public virtual Point Request_Block() // 나의 빈자리를 채워줄 블럭 (Return : Empty가 된 타일)
    {
        if (Global._gameState != Game_State.Playing)
        {
            return(null);
        }
        if (Is_Block())
        {
            return(null);
        }

        List <Dir> candidates = new List <Dir>()
        {
            Dir.U
        };                                                // 블럭 뺏어올 타일 후보들

        candidates.AddRange(Random.Range(0, 2) == 0 ? new List <Dir>()
        {
            Dir.RU, Dir.LU
        } : new List <Dir>()
        {
            Dir.LU, Dir.RU
        });

        for (int i = 0; i < candidates.Count; ++i)
        {
            Near_State state = Get_NearState(candidates[i]);

            if (Near_State.Block_Exist == state)
            {
                Point point = Get_NearPoint(candidates[i]); // 후보 선정

                if (candidates[i] != Dir.U)                 // 왼,오른쪽 블럭인 경우엔 머리 위에 블럭이 없어야함 + 아래로 내려갈 수 있는 경우면 그 기회를 빼앗으면 안됨
                {
                    // 위 상태 확인
                    Near_State candidateState = point.Get_NearState(Dir.U);

                    if (candidateState == Near_State.Block_Exist)
                    {
                        continue;
                    }

                    // 후보의 아래 상태 확인
                    candidateState = point.Get_NearState(Dir.D);

                    if (candidateState == Near_State.Block_NonExist)
                    {
                        continue;
                    }
                }

                point.Get_Block().Go_Down(this, () => { });

                //point.Request_Block(); // 빼앗긴 타일도 블럭을 채워주자

                return(point);
            }
        }

        return(null);
    }