第二十九節(jié) 消除滿行

在上一節(jié)中趾代,盡管已經(jīng)堆疊了一大堆方塊,但因為沒有消除那些已經(jīng)填滿的行丰辣,所以屏幕最終會被填滿撒强,游戲就無法繼續(xù)了。
這一節(jié)笙什,我們來消除滿行飘哨。

01.分析

有兩種消除方案:

  • 一行行掃描,掃描到滿行時琐凭,執(zhí)行消除芽隆,然后繼續(xù)掃描下一行
  • 一行行掃描,先記錄所有需要消除的行统屈,掃描完成后胚吁,執(zhí)行消除

我選擇第二種方案,至于原因愁憔,我感覺這樣分工更明確腕扶。

如何掃描:一行一行掃描,如果在行中遇到空的點吨掌,則跳到下一行半抱。如果掃描到了一行中的最后一個點脓恕,還沒有遇到空的點,就說明該行已經(jīng)被填滿了窿侈,將該行的行號記錄在需要消除的行中炼幔。所有行掃描完成后,掃描結(jié)束史简。
如何消除:遍歷需要消除的行乃秀,將對應(yīng)的點從固定方塊中移除。
消除完成后乘瓤,就會出現(xiàn)空行环形,需要下移空行上面的方塊。


02.代碼實現(xiàn)
02.01 先為導(dǎo)演添加一個成員衙傀,記錄需要消除的行號列表:
List<int> _needClearLines;  // 記錄需要消除的行

然后在初始化游戲方法中初始化此成員:

_needClearLines = new List<int>();
02.02 添加方法抬吟,填充需要消除的行:
// 填充需要消除的行
void FillNeedClearLines()
{
    for (int line = 0; line < 20; line++)
    {
        for (int list = 0; list < 10; list++)
        {
            if (_defaultLayer.IsCanSee(new MyPoint(line, list)))
            {
                // 如果不是該行的最后一個點,則掃描該行的下一個點
                if (list != 9) continue;
                // 如果該行的點全都掃描到了统抬,說明該行需要消除
                else _needClearLines.Add(line);
            }
            // 如果掃描到空點火本,則退出該行的掃描,掃描下一行
            else break;
        }
    }
}
02.03 消除滿行

因為需要刪除圖層中顯示數(shù)據(jù)中的點聪建,所以在圖層類中添加一個移除點方法:

// 移除點
public void RemovePoint(int line, int list)
{
    int index = 0;
    foreach (var point in ViewData)
    {
        if (point._line == line && point._list == list) break;
        index++;
    }
    ViewData.RemoveAt(index);
}

回到導(dǎo)演類钙畔,添加消除滿行方法:

// 消除滿行
void ClearFullLines()
{
    // 遍歷行
    foreach (var lineNumber in _needClearLines)
    {
        // 移除該行上所有的點
        for (int list = 0; list < 10; list++)
        {
            _defaultLayer.RemovePoint(lineNumber, list);
        }
    }
    _needClearLines.Clear();

    // 刷新屏幕
    _screenMain.RefreshScreen();
}
02.04 填補消除后的行

取名是一個非常頭疼的工作,要名副其實金麸,而且不能與其他方法名混淆擎析,也不能引起歧義,雖然說可以添加注釋挥下,但不能依賴注釋揍魂,更好的方法名才是我們需要的。

經(jīng)過一番思索棚瘟,感覺還是使用“填補消除后的行”更合適现斋,就是感覺太長了,如果你有更好的名字偎蘸,請留言告訴我庄蹋。
那么,方法名為:FillUpClearedLine()

填補原理:按從上至下填充迷雪,就是說限书,依次將最頂端的空行上的點下移:


// 填補消除后的行
void FillUpClearedLine()
{
    while (_needClearLines.Count > 0)
    {
        int line = _needClearLines[_needClearLines.Count - 1];
        List<MyPoint> fixedPoints = _defaultLayer.ViewData;
        for (int index = 0; index < fixedPoints.Count; index++)
        {
            // 將高于當(dāng)前行的點下移一格
            if (fixedPoints[index]._line > line)
            {
                fixedPoints[index] = new My-Point(fixedPoints[index]._line - 1, fixedPoints[index]._list);
            }
        }
        _needClearLines.RemoveAt(_needClearLines.Count - 1);

        _screenMain.RefreshScreen();
    }
}
02.05 在游戲核心邏輯中調(diào)用
// 游戲核心邏輯
void GameCore()
{
    if (!MoveDownBlock())
    {
        // 先固定方塊
        FixActiveBlock();
        // 計算需要消除的行
        FillNeedClearLines();

        // 如有需要消除的行
        if (_needClearLines.Count > 0)
        {
            // 消除行
            ClearFullLines();
            // 填補消除后的行
            FillUpClearedLine();
        }
            
        // 創(chuàng)建新方塊
        CreateNewBlock();
    }
}

好了,經(jīng)過一番折騰章咧,功能終于實現(xiàn)了蔗包,不過,目前的消除動作幾乎是在一瞬間就完成了慧邮,太生硬了调限,接下來,我們將為其添加一些動畫误澳。

代碼鏈接:https://pan.baidu.com/s/1reST9ttihP_u4uQJ0SSwgg
提取碼:o5f2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耻矮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子忆谓,更是在濱河造成了極大的恐慌裆装,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倡缠,死亡現(xiàn)場離奇詭異哨免,居然都是意外死亡,警方通過查閱死者的電腦和手機昙沦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門琢唾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盾饮,你說我怎么就攤上這事采桃。” “怎么了丘损?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵普办,是天一觀的道長。 經(jīng)常有香客問我徘钥,道長衔蹲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任呈础,我火速辦了婚禮舆驶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猪落。我一直安慰自己贞远,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布笨忌。 她就那樣靜靜地躺著蓝仲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪官疲。 梳的紋絲不亂的頭發(fā)上袱结,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音途凫,去河邊找鬼垢夹。 笑死,一個胖子當(dāng)著我的面吹牛维费,可吹牛的內(nèi)容都是我干的果元。 我是一名探鬼主播促王,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼而晒!你這毒婦竟也來了蝇狼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤倡怎,失蹤者是張志新(化名)和其女友劉穎迅耘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體监署,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡颤专,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钠乏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栖秕。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缓熟,靈堂內(nèi)的尸體忽然破棺而出累魔,到底是詐尸還是另有隱情,我是刑警寧澤够滑,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布垦写,位于F島的核電站,受9級特大地震影響彰触,放射性物質(zhì)發(fā)生泄漏梯投。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一况毅、第九天 我趴在偏房一處隱蔽的房頂上張望分蓖。 院中可真熱鬧,春花似錦尔许、人聲如沸么鹤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒸甜。三九已至,卻和暖如春余佛,著一層夾襖步出監(jiān)牢的瞬間柠新,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工辉巡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恨憎,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓郊楣,卻偏偏與公主長得像憔恳,于是被迫代替她去往敵國和親瓤荔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354