Example #1
0
        //---------------------------------------------------------------------
        // Constructor
        //---------------------------------------------------------------------

        public Block(BlockType blockType)
        {
            m_BlockType = blockType;

            status    = BlockStatus.NORMAL;
            questType = BlockQuestType.CLEAR_SIMPLE;
            match     = MatchType.NONE;
            m_Breed   = BlockBreed.NA;

            m_nDurability = 1;
        }
Example #2
0
        /*
         * Block의 종류(breed)를 변경한다.
         */
        public void ChangeBlock(Block block, BlockBreed notAllowedBreed)
        {
            BlockBreed genBreed;

            while (true)
            {
                genBreed = (BlockBreed)UnityEngine.Random.Range(0, 6); //TODO 스테이지파일에서 Spawn 정책을 이용해야함

                if (notAllowedBreed == genBreed)
                {
                    continue;
                }

                break;
            }

            block.breed = genBreed;
        }
 public Color GetBlockColor(BlockBreed breed)
 {
     return(blockColors[(int)breed]);
 }
Example #4
0
        /**
         * 지정된 위치에 배치할 수 있는 3매치되지 않는 블럭을 한다.
         */
        Block GetShuffledBlock(int nRow, int nCol)
        {
            BlockBreed prevBreed  = BlockBreed.NA; //처음 비교시에 종류를 저장
            Block      firstBlock = null;          //리스트를 전부 처리하고 큐만 남은 경우에 중복 체크 위해 사용 (큐에서 꺼낸 첫번째 블럭)

            bool bUseQueue = true;                 //true : 큐에서 꺼냄, false : 리스트에서 꺼냄

            while (true)
            {
                //1. Queue에서 블럭을 하나 꺼낸다. 첫번재 후보이다.
                BlockVectorKV blockInfo = NextBlock(bUseQueue);
                Block         block     = blockInfo.Key;

                //2. 리스트에서 블럭을 전부 처리한 경우 : 전체 루프(for 문 포함)에서 1회만 발생
                if (block == null)
                {
                    blockInfo = NextBlock(true);
                    block     = blockInfo.Key;
                }

                Debug.Assert(block != null, $"block can't be null : queue  count -> {m_UnusedBlocks.Count}");

                if (prevBreed == BlockBreed.NA) //첫비교시 종류 저장
                {
                    prevBreed = block.breed;
                }

                //3. 리스트를 모두 처리 한 경우
                if (m_bListComplete)
                {
                    if (firstBlock == null)
                    {
                        //3.1 전체 리스트를 처리하고, 처음으로 큐에서 꺼낸 경우
                        firstBlock = block;  // 큐에서 꺼낸 첫번째 블럭
                    }
                    else if (System.Object.ReferenceEquals(firstBlock, block))
                    {
                        //3.2 처음 보았던 블럭을 다시 처리하는 경우,
                        //    즉, 큐에 들어있는 모든 블럭이 조건에 맞지 않는 경우 (남은 블럭 중에 조건에 맞는게 없는 경우)
                        m_Board.ChangeBlock(block, prevBreed);
                    }
                }

                //4. 상하좌우 인접 블럭과 겹치는 개수를 계산한다
                Vector2Int vtDup = CalcDuplications(nRow, nCol, block);

                //5. 2개 이상 매치되는 경우, 현재 위치에 해당 블럭이 올 수 없으므로 큐에 보관하고 다음 블럭 처리하도록 continue한다
                if (vtDup.x > 2 || vtDup.y > 2)
                {
                    m_UnusedBlocks.Enqueue(blockInfo);
                    bUseQueue = m_bListComplete || !bUseQueue;

                    continue;
                }

                //6. 블럭이 위치할 수 있는 경우, 찾은 위치로 Bock GameObject를 이동시킨다.
                block.vertDuplicate = vtDup.y;
                block.horzDuplicate = vtDup.x;
                if (block.blockObj != null)
                {
                    float initX = m_Board.CalcInitX(Constants.BLOCK_ORG);
                    float initY = m_Board.CalcInitY(Constants.BLOCK_ORG);
                    block.Move(initX + nCol, initY + nRow);
                }

                //7. 찾은 블럭을 리턴한다.
                return(block);
            }
        }