void Check4Block(HexaBlock block, List <HexaBlock> checkList) { List <HexaBlock> sameTypeBlocks = block.GetAdjacentBlocks(block.blockType); foreach (HexaBlock b in sameTypeBlocks) { int checkCnt = 0; // 체크리스트에 있으면 패스 if (checkList.Contains(b)) { continue; } // 새로운 블록의 주변 블록중에 체크리스트 블록이 2개 이상이면 추가 foreach (HexaBlock adjacentBlock in b.GetAdjacentBlocks(block.blockType)) { if (checkList.Contains(adjacentBlock)) { checkCnt++; } } if (checkCnt >= 2) { checkList.Add(b); Check4Block(b, checkList); } } }
// 자신을 포함해서 이어져있는 같은 타입 블록이 4개 이상이고 // 모든 블록이 인접한 같은 블록의 수가 2개 이상인 경우 void Check4Block(HexaBlock block) { List <HexaBlock> sameTypeBlocks = block.GetAdjacentBlocks(block.blockType); foreach (HexaBlock b in sameTypeBlocks) { List <HexaBlock> checkList = new List <HexaBlock>(); checkList.Add(block); checkList.Add(b); Check4Block(b, checkList); // 체크리스트 안에 4개 이상이 들어가있으면 매칭완료 if (checkList.Count >= 4) { if (!matchedBlockList.Contains(block)) { matchedBlockList.Add(block); } foreach (HexaBlock checkBlock in checkList) { if (!matchedBlockList.Contains(checkBlock)) { matchedBlockList.Add(checkBlock); } } } } }
public bool MoveEmptySideBlock(HexaBlock emptyBlock) { if (isMovedTick) { return(false); } bool isOddBlock = (emptyBlock.xPos % 2 == 1); HexaBlock upperRightBlock = isOddBlock ? GetBlock(emptyBlock.xPos + 1, emptyBlock.yPos - 1) : GetBlock(emptyBlock.xPos + 1, emptyBlock.yPos); if (upperRightBlock && upperRightBlock.blockType != BlockType.EMPTY) { SwapBlocks(emptyBlock, upperRightBlock); return(true); } HexaBlock upperLeftBlock = isOddBlock ? GetBlock(emptyBlock.xPos - 1, emptyBlock.yPos - 1) : GetBlock(emptyBlock.xPos - 1, emptyBlock.yPos); if (upperLeftBlock && upperLeftBlock.blockType != BlockType.EMPTY) { SwapBlocks(emptyBlock, upperLeftBlock); return(true); } return(false); }
public void SwapBlocks(HexaBlock block0, HexaBlock block1) { // BlockType Board Swap BlockType tempType = blockBoard[block0.xPos, block0.yPos]; blockBoard[block0.xPos, block0.yPos] = blockBoard[block1.xPos, block1.yPos]; blockBoard[block1.xPos, block1.yPos] = tempType; block0.blockType = blockBoard[block0.xPos, block0.yPos]; block1.blockType = blockBoard[block1.xPos, block1.yPos]; BlockStatus tempStatus = block0.blockStatus; block0.blockStatus = block1.blockStatus; block1.blockStatus = tempStatus; // sprite swap Sprite tempSpr = block0.sprRenderer.sprite; block0.sprRenderer.sprite = block1.sprRenderer.sprite; block1.sprRenderer.sprite = tempSpr; Color tempColor = block0.sprRenderer.color; block0.sprRenderer.color = block1.sprRenderer.color; block1.sprRenderer.color = tempColor; int tempHp = block0.hp; block0.hp = block1.hp; block1.hp = tempHp; }
void SavePlayData() { // CombinableHexaBoard board = GameManager.instance.board; int[] numbers = board.numbers; int[,] cells = new int[board.width, board.height]; for (int i = 0, imax = board.height; i < imax; ++i) { for (int j = 0, jmax = board.width; j < jmax; ++j) { cells[i, j] = numbers[i * board.width + j]; } } // HexaBlock block = GameManager.instance.block; LastBlocks lastBlocks = new LastBlocks(block.numbers, block.rotateStep); // DataManager.Instance.SavePlayData( _scoreCounter.value, _savings, cells, lastBlocks, _itemUsed, _contineCount ); }
public BoardSnapshot(CombinableHexaBoard board, HexaBlock block, int score, int savings) { blockNumbers = block.numbers; boardNumbers = board.numbers; highestNumber = board.highestNumber; this.score = score; this.savings = savings; }
void SwapSelected() { if (Vector3.Distance(selectedObjects[0].transform.position, selectedObjects[1].transform.position) < 1.1f) { HexaBlock block0 = selectedObjects[0].GetComponent <HexaBlock>(); HexaBlock block1 = selectedObjects[1].GetComponent <HexaBlock>(); LevelGenerator.Instance.SwapBlocks(block0, block1); } }
public void SpawnGem() { HexaBlock spawnBlock = GetBlock(spawnPoint.x, spawnPoint.y); if (spawnBlock && spawnBlock.blockType == BlockType.EMPTY) { spawnBlock.SetBlockStatus(BlockStatus.BLOCK, spawnPoint.x, spawnPoint.y); blockBoard[spawnPoint.x, spawnPoint.y] = spawnBlock.blockType; } }
public void Generate(MapInfo mapInfo) { int xSize = mapInfo.mapSize.x; int ySize = mapInfo.mapSize.y; blockBoard = new BlockType[xSize, ySize]; string[] blockInfos; blockInfos = mapInfo.mapInfoStr.Split(','); // 적합성 체크 if (blockInfos.Length != xSize * ySize) { // 잘못된 맵 정보 Debug.Log("MapInfo Error -----------" + blockInfos.Length + "!=" + xSize * ySize); return; } GameObject bgBlockParent = GameObject.Find("BgBlocks"); // 블록 생성 for (int x = 0; x < xSize; x++) { for (int y = 0; y < ySize; y++) { int blockNum = x + y * xSize; if (blockInfos[blockNum] == "0") { blockBoard[x, y] = BlockType.EMPTY; continue; } float yPosModifier = 0; if (x % 2 == 0) { yPosModifier = -0.5f; } bgBlocks.Add(Instantiate(bgBlockPrefap, new Vector3(x * 0.75f, -y + yPosModifier, 0), Quaternion.identity, bgBlockParent.transform)); HexaBlock block = Instantiate(hexaBlockPrefap, new Vector3(x * 0.75f, -y + yPosModifier, 0), Quaternion.identity, transform).GetComponent <HexaBlock>(); block.SetBlockStatus((BlockStatus)int.Parse(blockInfos[blockNum]), x, y); hexaBlocks.Add(block); blockBoard[x, y] = block.blockType; } } }
public bool MoveEmptyBlock(HexaBlock emptyBlock) { isMovedTick = false; HexaBlock upperBlock = GetBlock(emptyBlock.xPos, emptyBlock.yPos - 1); if (upperBlock && upperBlock.blockType != BlockType.EMPTY) { SwapBlocks(emptyBlock, upperBlock); isMovedTick = true; return(true); } return(false); }
void CheckMatchedBlocks(HexaBlock block) { if (block.blockType != BlockType.OBSTACLE && block.blockType != BlockType.EMPTY) { // LB to RT CheckLine(block, DIRECTION.LEFT_BOTTOM, DIRECTION.RIGHT_TOP); // LB to RB CheckLine(block, DIRECTION.LEFT_TOP, DIRECTION.RIGHT_BOTTOM); // B to T CheckLine(block, DIRECTION.BOTTOM, DIRECTION.TOP); // 4blocks check Check4Block(block); } }
void CheckLine(HexaBlock block, DIRECTION dir1, DIRECTION dir2) { List <HexaBlock> removeBlockList = new List <HexaBlock>(); if (CalcSameTypeStreakCount(block, dir1, removeBlockList) + CalcSameTypeStreakCount(block, dir2, removeBlockList) >= 2) { if (!removeBlockList.Contains(block)) { removeBlockList.Add(block); } foreach (HexaBlock b in removeBlockList) { if (!matchedBlockList.Contains(b)) { matchedBlockList.Add(b); } } } }
public List <HexaBlock> GetAdjacentBlocks(BlockType type) { bool isOddBlock = (xPos % 2 == 1); int sameTypeCnt = 0; List <HexaBlock> sameTypeBlocks = new List <HexaBlock>(); Vector2Int[] offsets = new Vector2Int[6]; if (isOddBlock) { offsets[0] = new Vector2Int(-1, 0); offsets[1] = new Vector2Int(-1, -1); offsets[2] = new Vector2Int(1, 0); offsets[3] = new Vector2Int(1, -1); } else { offsets[0] = new Vector2Int(-1, 1); offsets[1] = new Vector2Int(-1, 0); offsets[2] = new Vector2Int(1, 1); offsets[3] = new Vector2Int(1, 0); } offsets[4] = new Vector2Int(0, 1); offsets[5] = new Vector2Int(0, -1); for (int i = 0; i < 6; i++) { HexaBlock b = LevelGenerator.Instance.GetBlock(xPos + offsets[i].x, yPos + offsets[i].y); if (b && b.blockType == type) { sameTypeBlocks.Add(b); sameTypeCnt++; } } return(sameTypeBlocks); }
void CheckMatched() { HexaBlock block0 = selectedObjects[0].GetComponent <HexaBlock>(); HexaBlock block1 = selectedObjects[1].GetComponent <HexaBlock>(); CheckMatchedBlocks(block0); CheckMatchedBlocks(block1); if (matchedBlockList.Count == 0) { // 매치 실패시 복구 SwapSelected(); } else { List <HexaBlock> obstacleList = new List <HexaBlock>(); foreach (HexaBlock b in matchedBlockList) { // 주변 장애물 블록 가져와서 리스트에 넣고 매치 후 한번에 터뜨려주기 List <HexaBlock> adjacentObstacles = b.GetAdjacentBlocks(BlockType.OBSTACLE); foreach (HexaBlock obstacle in adjacentObstacles) { if (!obstacleList.Contains(obstacle)) { obstacleList.Add(obstacle); } } b.Matched(); } foreach (HexaBlock obstacle in obstacleList) { obstacle.PopObstacle(); } } matchedBlockList.Clear(); }
int CalcSameTypeStreakCount(HexaBlock block, DIRECTION dir, List <HexaBlock> removeBlockList, int streakCnt = 0) { bool isOddBlock = (block.xPos % 2 == 1); int xPos = block.xPos; int yPos = block.yPos; BlockType blockType = block.blockType; switch (dir) { case DIRECTION.LEFT_BOTTOM: if (isOddBlock) { xPos += -1; if (IsSameType(xPos, yPos, blockType)) { streakCnt++; } else { return(streakCnt); } } else { xPos += -1; yPos += 1; if (IsSameType(xPos, yPos, blockType)) { streakCnt++; } else { return(streakCnt); } } break; case DIRECTION.LEFT_TOP: if (isOddBlock) { xPos += -1; yPos += -1; if (IsSameType(xPos, yPos, blockType)) { streakCnt++; } else { return(streakCnt); } } else { xPos += -1; if (IsSameType(xPos, yPos, blockType)) { streakCnt++; } else { return(streakCnt); } } break; case DIRECTION.RIGHT_BOTTOM: if (isOddBlock) { xPos += 1; if (IsSameType(xPos, yPos, blockType)) { streakCnt++; } else { return(streakCnt); } } else { xPos += 1; yPos += 1; if (IsSameType(xPos, yPos, blockType)) { streakCnt++; } else { return(streakCnt); } } break; case DIRECTION.RIGHT_TOP: if (isOddBlock) { xPos += 1; yPos += -1; if (IsSameType(xPos, yPos, blockType)) { streakCnt++; } else { return(streakCnt); } } else { xPos += 1; if (IsSameType(xPos, yPos, blockType)) { streakCnt++; } else { return(streakCnt); } } break; case DIRECTION.BOTTOM: yPos += 1; if (IsSameType(xPos, yPos, blockType)) { streakCnt++; } else { return(streakCnt); } break; case DIRECTION.TOP: yPos += -1; if (IsSameType(xPos, yPos, blockType)) { streakCnt++; } else { return(streakCnt); } break; } removeBlockList.Add(LevelGenerator.Instance.GetBlock(xPos, yPos)); return(CalcSameTypeStreakCount(LevelGenerator.Instance.GetBlock(xPos, yPos), dir, removeBlockList, streakCnt)); }