// 특정 색상 모두 캔디 종류 변경하기 public void OneColor_Fruit_Change_All_Special(int get_fruit_Type, e_Boom_Number_Type _enum) { int WhatBoom = 0; if (_enum == e_Boom_Number_Type.VerticalBoom) { WhatBoom = 5; } if (_enum == e_Boom_Number_Type.HorizontalBoom) { WhatBoom = 10; } if (_enum == e_Boom_Number_Type.BagBoom) { WhatBoom = 15; } for (int x = 0; x < 9; x++) { for (int y = 0; y < 10; y++) { if (gm.GetBlockObject(x, y) != null && gm.Get_ImBlock(x, y).Fruit_Type % 5 == get_fruit_Type % 5) { gm.candy_Init.Init(gm.GetBlockObject(x, y), (get_fruit_Type % 5) + WhatBoom); } } } }
/* * 캔디가 파괴할때 실행되는 함수 * 캔디크러쉬사가에서는 * 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(); } } } }
public int Match3_Algorithm() { // isMatched 이중배열 0으로 초기화 for (int i = 0; i < 9; i++) { for (int j = 1; j < 10; j++) { BoomType[i, j] = 0; isMatched[i, j] = 0; BagBoom_Check[i, j] = 0; } } int Sum = 0; Sum = GetThreeMatch(); // isMatched 이중배열을 검사해서 // 0 이상이면 파괴한다. // 파괴하면서 세로,가로줄 파괴하는 특수 폭탄인지 검사. for (int i = 0; i < 9; i++) { for (int j = 1; j < 10; j++) { if (isMatched[i, j] > 0 && gm.GetBlockObject(i, j)) { //Debug.Log($"브레이킹[{i},{j}] 발동 + Matched : {isMatched[i,j]}"); if (BagBoom_Check[i, j] == 2) { gm.candy_Init.Init(gm.GetBlockObject(i, j), gm.Get_ImBlock(i, j).Fruit_Type + 15); } else if (isMatched[i, j] == 4 && BoomType[i, j] == (int)Functions.e_Boom_Number_Type.VerticalBoom) { gm.candy_Init.Init(gm.GetBlockObject(i, j), gm.Get_ImBlock(i, j).Fruit_Type + 5); } else if (isMatched[i, j] == 4 && BoomType[i, j] == (int)Functions.e_Boom_Number_Type.HorizontalBoom) { gm.candy_Init.Init(gm.GetBlockObject(i, j), gm.Get_ImBlock(i, j).Fruit_Type + 10); } else if (isMatched[i, j] == 5) { // 컬러밤 생성 gm.candy_Init.Init(gm.GetBlockObject(i, j), 100); } else { gm.breaking.Break(i, j); } } } } return(Sum); }
public bool CheckPredictedCase() { List <C_ImBlock> checkList = new List <C_ImBlock>(); for (int x = 0; x < 9; ++x) { for (int y = 1; y <= 9; ++y) { for (int k = 0; k < 4; ++k) { if (gm.GetBlockObject(x, y) == null) { continue; } int resultX = x + dx[k]; int resultY = y + dy[k]; // 우좌 상하 순으로 이동했을때의 경우에서 매치가 되는부분을 탐색 if (resultX < 0 || resultX >= 9 || resultY <= 0 || resultY >= 10) //넘어가는지 { continue; } if (gm.GetBlockObject(resultX, resultY) == null) { continue; } CheckLine(resultX, resultY, k, gm.Get_ImBlock(x, y).Fruit_Type, ref checkList); if (checkList.Count >= 2) //현 블럭을 제외 { //반짝이 처리 checkList.Add(gm.Get_ImBlock(x, y)); //현 리스트에는 탐색을 시작하는 칸이 없었기에 넣어줌 foreach (C_ImBlock tBlock in checkList) //리스트에 들어있는 블럭들의 색 변화 fill함수가 호출될때마다 색을 리셋 시켜줘야함 { tBlock.GetComponent <Image>().color = new Color(1.0f, 1.0f, 1.0f, 0.3f); } return(true); } else { checkList.Clear(); } } } } return(false); //가능한 경우가 없다는 의미 }
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 Swap(int xLine, int yLine, int s_xLine, int s_yLine) { // 게임 로직이 2일때 if (gm.Game_Logic_State == 2) { GameObject tempobj; tempobj = gm.GetBlockObject(xLine, yLine); gm.c_board.V[xLine].H[yLine].block.HereBlockObject = gm.GetBlockObject(s_xLine, s_yLine); gm.c_board.V[s_xLine].H[s_yLine].block.HereBlockObject = tempobj; First = gm.Get_ImBlock(xLine, yLine); Second = gm.Get_ImBlock(s_xLine, s_yLine); Special_BoomCount_Check(); xy.X = xLine; xy.Y = yLine; s_xy.X = s_xLine; s_xy.Y = s_yLine; int Sum = 0; // 마우스 이동방향 오브젝트와 Swap 후 // 3Match가능한지 검사 // Sum값이 1 이상이면 바꾸기 가능이므로 애니메이션 실행 // 0 이하일 경우 불가능 하므로 갔다오는 애니메이션을 실행한 후 다시 Swap (원상태) Sum = gm.match_Finder.GetThreeMatch(); if (SpecialBoomCount == 2 || ColorBoomCount == 1) { EventManager.Emit("MatchComplete"); Special_Swap(); gm.Game_Logic_State = 1; gm.ChangeLogicTimer(0.3f); } // Sum > 0 바꾸기 가능 else if (Sum > 0) { EventManager.Emit("MatchComplete"); gm.Get_ImBlock(xLine, yLine).MoveEnQueue(xy); gm.Get_ImBlock(s_xLine, s_yLine).MoveEnQueue(s_xy); gm.ChangeLogicTimer(0.1f); gm.Game_Logic_State = 0; } // Sum == 0 바꾸기 불가능 // 다시 되돌리기. else { gm.Get_ImBlock(xLine, yLine).MoveEnQueue(xy); gm.Get_ImBlock(s_xLine, s_yLine).MoveEnQueue(s_xy); tempobj = gm.GetBlockObject(xLine, yLine); gm.c_board.V[xLine].H[yLine].block.HereBlockObject = gm.GetBlockObject(s_xLine, s_yLine); gm.c_board.V[s_xLine].H[s_yLine].block.HereBlockObject = tempobj; gm.Get_ImBlock(xLine, yLine).MoveEnQueue(xy, 0.1f); gm.Get_ImBlock(s_xLine, s_yLine).MoveEnQueue(s_xy, 0.1f); gm.ChangeLogicTimer(0.2f); gm.Game_Logic_State = 2; } // 스왑이 끝나면 다음 액션을 할 수 있도록 Logic Ready 값을 바꿔줌. // GameManager.CS 의 Game_Routine 코루틴 참조 gm.Next_Logic_Ready = false; } }