上次我們解決了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...