// 이미 매치된 타일에 대한 처리 과정 private void mergeMachedInfo(MatchInfo findinfo, Tile tile) { // 해당 매치를 찾아, 이전 데이터와 합치기 var matchedInfo = findMatchInfo(tile.row, tile.col); if (matchedInfo == null) { return; } Debug.LogFormat("교차점[{0},{1}] 발견", tile.row, tile.col); if (matchedInfo.isLinearMatch) // 교차되면서 매치를 하나로 합치기 { findinfo.direction |= matchedInfo.direction; findinfo.AddTilePosition(matchedInfo); matchInfos.Remove(matchedInfo); findinfo.creationPos = tile.GetLocation(); } // 타일 위치의 중복을 허용하면서 현재는 이에 대한 검증이 안되어 있음. else if (matchedInfo.matchType == MatchType.Butterfly) { Debug.LogFormat("나비 발견."); if (findinfo.isCreationTile && findinfo.matchType != MatchType.Butterfly) { resetMatchedInfo(matchedInfo); findinfo.AddTilePosition(tile.GetLocation()); matchInfos.Remove(matchedInfo); } } else { findinfo.AddTilePosition(tile.GetLocation()); } }
// useMatchinfo: true일 때 테스트 용도로 사용 public bool IsMatch2by2(int row, int col, bool useMatchinfo) { if (useMatchinfo) { findinfo.AddTilePosition(row, col); } return(IsMatch2by2Simple(row, col, useMatchinfo ? findinfo : null)); }
// 발견된 매치 타일로 새로운 매치 정보 만들기 private void makeMatch(MatchInfo findinfo, FindDirection dir, List <Tile> matchCandidates) { findinfo.isMatch = true; if (dir == FindDirection.Horizon) { findinfo.direction |= MatchDir.Horizon; } else { findinfo.direction |= MatchDir.Vertical; } foreach (var tile in matchCandidates) { if (tile.IsMatched == false) { findinfo.AddTilePosition(tile.GetLocation()); tile.MarkFound(); } else { mergeMachedInfo(findinfo, tile); } } // 이 부분을 함수 바깥으로 뺄 수 있나? CheckRemover(findinfo); }
// 1. swap 가능 확인 용 // 2. 매치 정보 기록 유무 필요 private bool IsMatch2by2Simple(int row, int col, MatchInfo matchinfo) { var curtile = _gamepanel.tiles[row, col]; if (curtile == null) { return(false); } bool isFound = false; var pattern = Square22Pattern.Instance; // 추후 패턴 일반화 for (int p = 0; p < pattern.Length; p++) { int nblock = pattern.GetPatternLength(p); int i = 0; for (; i < nblock; i++) { var tilepos = pattern.GetPatternPos(p, i, row, col); if (_gamepanel.Isbound(tilepos) == false) { break; } var tile = _gamepanel.tiles[tilepos.row, tilepos.col]; if (tile == null || tile.Type != curtile.Type) { break; } if (matchinfo != null) { matchinfo.AddTilePosition(tilepos); // 패턴이 모두 맞아야 추가가 가능함... } } isFound = (i == nblock); if (isFound) { if (matchinfo != null) { // todo : 일반화를 위해서는 함수로 빼야함. //matchinfo.AddTilePosition(curtile.GetLocation()); matchinfo.matchType = MatchType.Butterfly; matchinfo.isMatch = true; // 생성위치도 필요 matchInfos.Add(new MatchInfo(matchinfo)); } return(true); } } return(false); }