Ejemplo n.º 1
0
    public void Pushing(EPushingDirection _ePushingDirection) //壓縮動作,只需將 "方向" 帶入
    {
        List <List <BlockData> > listPushing = this.GetPushingList(_ePushingDirection);

        foreach (List <BlockData> listPushingLine in listPushing) //挑出行線群的其中一條
        {
            for (int i = 0; i < listPushingLine.Count; i++)
            {
                BlockData blockComparing = listPushingLine[i];
                bool      bPolling       = true; //表示正在輪尋
                for (int j = i + 1; j < listPushingLine.Count && bPolling; j++)
                {
                    BlockData blockPolling = listPushingLine[j];
                    if (blockPolling.GetBlockValue() != 0)
                    {
                        if (blockComparing.GetBlockValue() == 0)
                        {
                            blockComparing.PlusOn(blockPolling);
                        }
                        else if (blockComparing.GetBlockValue() == blockPolling.GetBlockValue())
                        {
                            blockComparing.PlusOn(blockPolling);
                            this.m_iScore += blockComparing.GetBlockValue();
                            bPolling       = false;
                        }
                        else if (blockComparing.GetBlockValue() != blockPolling.GetBlockValue())
                        {
                            bPolling = false;
                        }
                    }
                }
            }
        }
    }
Ejemplo n.º 2
0
    private List <int> GetPushingPoint(EPushingDirection _eDirection) //獲得所有該壓縮方向之起點
    {
        List <int> listPushingPoint = new List <int>();

        for (int i = 0; i < m_iBoardSize; i++)
        {
            if (m_listBoard[i].Conbinable && m_listBoard[i].GetNextCombinableBlock(_eDirection) == null)
            {//往某方向壓縮的起點之定義,必須要是可結合的格子(普通),同時,他也是該方向之底,所以往該方向搜索時他找不到可結合的東西
                listPushingPoint.Add(i);
            }
        }
        return(listPushingPoint);
    }
Ejemplo n.º 3
0
    public static EPushingDirection GetOppositeDirection(EPushingDirection _eDirection)
    {
        EPushingDirection oppositeDirection = 0;

        if ((int)_eDirection % 2 == 0)
        {
            oppositeDirection = _eDirection + 1;
        }
        else
        {
            oppositeDirection = _eDirection - 1;
        }
        return(oppositeDirection);
    }
Ejemplo n.º 4
0
    private List <List <BlockData> > GetPushingList(EPushingDirection _ePushingDirection) //獲得正要進行 "壓縮" 的行線群,所以是list(行線)的list(群)
    {
        List <List <BlockData> > listPushing = new List <List <BlockData> >();
        List <int>        listPushingPoint   = this.GetPushingPoint(_ePushingDirection);
        EPushingDirection eCombineDir        = GetOppositeDirection(_ePushingDirection);

        foreach (int iStartPoint in listPushingPoint)
        {
            BlockData        blockPick   = m_listBoard[iStartPoint];
            List <BlockData> pushingLine = new List <BlockData>
            {
                blockPick
            };
            while (blockPick.GetNextCombinableBlock(eCombineDir) != null)
            {
                blockPick = blockPick.GetNextCombinableBlock(eCombineDir);
                pushingLine.Add(blockPick);
            }
            listPushing.Add(pushingLine);
        }
        return(listPushing);
    }
Ejemplo n.º 5
0
    public bool GetPushAble(EPushingDirection _ePushingDirection)
    {
        List <List <BlockData> > listPushing = this.GetPushingList(_ePushingDirection);
        bool bPushAble = false;                                   //是否可進行壓縮

        for (int i = 0; i < listPushing.Count && !bPushAble; i++) //挑出行線群的每一條行線進行檢查,若中途發現可以進行壓縮的話就跳出迴圈,因為沒有繼續檢查下去的必要
        {
            for (int j = 0; j < listPushing[i].Count - 1 && !bPushAble; j++)
            {
                BlockData blockComparing = listPushing[i][j]; //根據行線索引值找到該block物件
                BlockData blockPolling   = listPushing[i][j + 1];
                if (blockComparing.GetBlockValue() == 0 && blockPolling.GetBlockValue() != 0)
                {
                    bPushAble = true;
                }
                else if (blockComparing.GetBlockValue() != 0 && blockComparing.GetBlockValue() == blockPolling.GetBlockValue())
                {
                    bPushAble = true;
                }
            }
        }
        return(bPushAble);
    }