// 아래로 내려가줄지 판단 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(); // 아래로 갈 수 없음 }
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); }