俄羅斯方塊(十一)處理邊界續

2021-08-30 17:18:30 字數 1358 閱讀 7039

上次我們解決了movedown的邊界處理。這次我們可以依樣畫葫蘆,把moveleft,moveright的邊界處理都完成。

每次邊界處理也同樣是3步:1)確定新的位置。2)檢視新位置是否可行。3)如果可行,把新的位置替代舊的位置。

void element::moveleft()

if (!ifoccupied(newbody))

copybody(newbody);

}void element::moveright()

if (!ifoccupied(newbody))

copybody(newbody);

}

最後,還要進行邊界判斷的還有旋轉。如果旋轉出了邊界,或者遇到了障礙塊,那得阻止旋轉。

和其他不同的是,左移右移,下落是每種方塊行為都一致,所以在父類element中實現。而旋轉時不同形狀的方塊行為不同,所以旋轉是在子類中實現的。現在為了加上邊界處理,我們不得不在每個子類的旋轉實現中都進行修改。比如在bar的旋轉我們修改如下:

void bar::rotate()

else

//如果新的位置可行

if (!ifoccupied(newbody))

//用新的位置代替舊的位置

copybody(newbody);

}

鑑於篇幅,其他幾種形狀的旋轉**就省略了。

到現在為止,我們已經寫了很多遍相同**

if (!ifoccupied(newbody))

//用新的位置代替舊的位置

copybody(newbody);

雖然只有兩行**,但是出現了那麼多次,我們還是可以把他重構成乙個單獨的函式

bool element::move(box * newbody)

這樣無論在父類的移動或下降函式,或者子類的旋轉中,我們只需要關心移動或旋轉的規則,然後呼叫move函式就可以了。

void element::movedown()

move(newbody);

}void element::moveleft()

move(newbody);

}void element::moveright()

move(newbody);

}

void bar::rotate()

else

move(newbody);

}

這樣我們的邊界處理算是圓滿完成了。最後還要提醒一句,為了讓move函式可以被子類呼叫,而不被其他類使用,move函式必須宣告成protected

俄羅斯方塊高階 AI俄羅斯方塊

前文回顧 致青春 python實現俄羅斯方塊 人工智慧大火的今天,如果還是自己玩俄羅斯方塊未免顯得太low,為什麼不對遊戲公升級,讓機器自己去玩俄羅斯方塊呢?有了這個想法之後利用週六週日兩天的時間去蒐集了大量的資料,在電腦宕機好多次之後終於將ai俄羅斯方塊實現了。所謂讓機器自己去玩俄羅斯方塊,就是讓...

俄羅斯方塊

俄羅斯方塊 tetris,俄文 是一款風靡全球的電視遊戲機 和掌上遊戲機遊戲,它由俄羅斯人阿列克謝 帕基特諾夫 發明,故得此名。俄羅斯方塊的基本規則是移動 旋轉和擺放遊戲自動輸出的各種方塊,使之排列成完整的一行或多行並且消除得分。由於上手簡單 老少皆宜,從而家喻戶曉,風靡世界。俄羅斯方塊的開發者是阿...

俄羅斯方塊

include include include include includeusing namespace std include include define mem a,b memset a,b,sizeof a const int sudu 40 const int dir 4 2 cons...