示例#1
0
    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);
            }
        }
    }
示例#2
0
    // 자신을 포함해서 이어져있는 같은 타입 블록이 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);
                    }
                }
            }
        }
    }
示例#3
0
    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);
    }
示例#4
0
    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;
    }
示例#5
0
    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
            );
    }
示例#6
0
    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;
    }
示例#7
0
    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);
        }
    }
示例#8
0
    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;
        }
    }
示例#9
0
    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;
            }
        }
    }
示例#10
0
    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);
    }
示例#11
0
    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);
        }
    }
示例#12
0
    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);
                }
            }
        }
    }
示例#13
0
    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);
    }
示例#14
0
    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();
    }
示例#15
0
    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));
    }