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; } } } } } }
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); }
public static EPushingDirection GetOppositeDirection(EPushingDirection _eDirection) { EPushingDirection oppositeDirection = 0; if ((int)_eDirection % 2 == 0) { oppositeDirection = _eDirection + 1; } else { oppositeDirection = _eDirection - 1; } return(oppositeDirection); }
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); }
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); }