/*
  *  캔디가 파괴할때 실행되는 함수
  *  캔디크러쉬사가에서는
  *  4개가 가로, 세로 직선으로있을때
  *  가로일때 - 세로줄 파괴 캔디 1개 생성
  *  세로일때 - 가로줄 파괴 캔디 1개 생성
  *  5개가 직선으로 있을때
  *  ColorBoom이 생성되고 ColorBoom을 움직이면
  *  ColorBoom과 바꾼 Fruit을 보드에서 모두 파괴한다. (가로 세로일 경우 효과 발동됨)
  */
 public void Break(int i, int j)
 {
     if (gm.GetBoardState(i, j))
     {
         if (gm.GetBlockObject(i, j) != null)
         {
             if (gm.Get_ImBlock(i, j).VerticalBoom == 1)
             {
                 gm.Get_ImBlock(i, j).VerticalBoom = 0;
                 Debug.Log($"VerticalExplode [{i},{j}]");
                 Line_Explode(i, j, (int)e_Boom_Number_Type.VerticalBoom);
             }
             else if (gm.Get_ImBlock(i, j).HorizontalBoom == 1)
             {
                 gm.Get_ImBlock(i, j).HorizontalBoom = 0;
                 Debug.Log($"HorizontalExplode [{i},{j}]");
                 Line_Explode(i, j, (int)e_Boom_Number_Type.HorizontalBoom);
             }
             else if (gm.Get_ImBlock(i, j).BagBoom == 1)
             {
                 gm.Get_ImBlock(i, j).BagBoom = 0;
                 Bag_Explode(i, j, 1);
             }
             else
             {
                 gm.SleepBlocks.Enqueue(gm.GetBlockObject(i, j));
                 gm.GetBlockObject(i, j).SetActive(false);
                 gm.c_board.V[i].H[j].block.HereBlockObject = null;
                 gm.values.iPoint += 10;
                 gm.values.SetPointText();
             }
         }
     }
 }
Ejemplo n.º 2
0
        public int GetThreeMatch()
        {
            int Left = 0, Top = 0;

            for (int i = 8; i >= 0; i--)
            {
                for (int j = 9; j >= 1; j--)
                {
                    // 활성화된 보드만.
                    if (gm.GetBoardState(i, j) && gm.GetBlockObject(i, j) != null)
                    {
                        Left += ThreeMatch_DFS(i, j, 1, -1, gm.Get_ImBlock(i, j).Fruit_Type);
                        Top  += ThreeMatch_DFS(i, j, 1, 1, gm.Get_ImBlock(i, j).Fruit_Type);
                    }
                }
            }
            return(Left + Top);
        }
        public void Fill()
        {
            /*
             * 채우기 함수
             * 오른쪽 아래에서부터 9x9x9회 반복하며 실행
             * 9x9가 아닌 이유는 한번에 1칸씩 내려가기 때문.
             * 나중에 최적화 필요.
             */
            int[] MakeCount = new int[9];

            int d = 0;

            while (d < 15)
            {
                // gm.GetBlock(i,j)
                // gm.GetBoardState(i,j)
                d++;
                for (int i = 0; i < 9; i++)
                {
                    for (int j = 8; j >= 0; j--)
                    {
                        XY xy = new XY();
                        // 해당 위치가 활성화 Block
                        if (gm.GetBoardState(i, j))
                        {
                            // 현재 칸이 null이 아닐때
                            if (gm.GetBlockObject(i, j) != null)
                            {
                                // 현재 칸의 아래 칸이 비었고, 보드가 true일때
                                if (gm.GetBoardState(i, j + 1) && gm.GetBlockObject(i, j + 1) == null)
                                {
                                    gm.PutBackObject_To_Front(i, j, i, j + 1, xy);
                                    //Debug.Log("다음 칸 : x - " + i + ", y - " + (j+1));
                                    continue;
                                }
                                // 왼쪽 하단 체크
                                if (i >= 1)
                                {
                                    // 현재 칸의 왼쪽 하단 칸이 보드가 true에 비었고 , 현재칸의 왼쪽 칸이 false일때
                                    if (gm.GetBoardState(i - 1, j + 1) && gm.GetBlockObject(i - 1, j + 1) == null && gm.GetBoardState(i - 1, j) == false)
                                    {
                                        gm.PutBackObject_To_Front(i, j, i - 1, j + 1, xy);
                                        continue;
                                    }
                                }
                                // 오른쪽 하단 체크
                                else if (i < 8)
                                {
                                    // 현재 칸의 오른쪽 하단 칸이 비었고, 보드가 true일때, 현재칸의 오른쪽 칸이 false일때
                                    if (gm.GetBoardState(i + 1, j + 1) && gm.GetBlockObject(i + 1, j + 1) == null && gm.GetBoardState(i + 1, j) == false)
                                    {
                                        gm.PutBackObject_To_Front(i, j, i + 1, j + 1, xy);
                                        continue;
                                    }
                                }
                            }
                        }
                        // 최상단일때
                        else if (j == 0)
                        {
                            if (gm.GetBoardState(i, j + 1) && gm.GetBlockObject(i, j + 1) == null)
                            {
                                MakeCount[i] += 1;
                                GameObject obj = gm.SleepBlocks.Dequeue();
                                gm.c_board.V[i].H[j + 1].block.HereBlockObject = obj;
                                obj.SetActive(true);
                                obj.transform.position = gm.c_board.V[i].H[j].block.Block_Transform.position;
                                xy.X = i;
                                xy.Y = j + 1;
                                gm.candy_Init.Init(obj);
                                obj.GetComponent <C_ImBlock>().MoveEnQueue(xy, MakeCount[i] / 10f);
                                continue;
                            }
                        }
                    }
                }
            }
        }
        // 기본 보드 세팅
        public void setting()
        {
            // 스테이지 보드 상태, Color 세팅
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    if (j == 0)
                    {
                        gm.Board_Pool_Transform.GetChild(i * 10 + j).gameObject.GetComponent <Image>().color = gm.values.BoardOffColor;
                        gm.c_board.V[i].H[j].block.BoardState = false;
                    }
                    else
                    {
                        gm.c_board.V[i].H[j].block.BoardState = true;
                    }
                }
            }

            // 테스트용 보드 false
            gm.c_board.V[3].H[3].block.BoardState = false;
            gm.c_board.V[4].H[4].block.BoardState = false;
            gm.c_board.V[7].H[6].block.BoardState = false;
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    if (gm.GetBoardState(i, j) == false)
                    {
                        gm.Board_Pool_Transform.GetChild(i * 10 + j).gameObject.GetComponent <Image>().color = gm.values.BoardOffColor;
                    }
                }
            }
            // 테스트용 보드 색변경


            // Fruit Pool 생성
            for (int i = 0; i < 120; i++)
            {
                GameObject NewBlock = gm.MakeObject("ImBlock");

                gm.candy_Init.Init(NewBlock);
                NewBlock.SetActive(false);
                gm.SleepBlocks.Enqueue(NewBlock);
                NewBlock.GetComponent <C_ImBlock>().SubscribeEvent();
                // MatchComplete 메시지에 대해서 구독, 이후 맵을 생성할때 닫혀있는 맵은 이 함수를 호출하면x,
                //하게 되면 매치이벤트 발생시 검정색이 흰색으로 돌아올것임.
            }
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    gm.c_board.V[i].H[j].block.Block_Transform = gm.Board_Pool_Transform.GetChild(i * 10 + j).gameObject.GetComponent <RectTransform>();
                    gm.c_board.V[i].H[j].block.xy.X            = i;
                    gm.c_board.V[i].H[j].block.xy.Y            = j;
                    if (gm.GetBoardState(i, j))
                    {
                        GameObject block = gm.SleepBlocks.Dequeue();
                        block.SetActive(true);
                        gm.c_board.V[i].H[j].block.HereBlockObject = block;
                        gm.c_board.V[i].H[j].block.Here_ImBlock    = block.GetComponent <C_ImBlock>();
                        block.transform.position = gm.c_board.V[i].H[j].block.Block_Transform.GetComponent <RectTransform>().position;
                        block.GetComponent <C_ImBlock>().Check_Now_Position(i, j);
                    }
                }
            }
        }