版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p><b> 摘要1</b></p><p><b> 關(guān)鍵字1</b></p><p><b> 1 功能說(shuō)明1</b></p><p><b> 2 開(kāi)發(fā)環(huán)境1&
2、lt;/b></p><p> 2.1 Qt簡(jiǎn)介1</p><p> 2.2 Qt安裝1</p><p> 2.3 Qt開(kāi)發(fā)基礎(chǔ)1</p><p> 2.3.1 Qt對(duì)象與對(duì)象樹(shù)1</p><p> 2.3.2 信號(hào)與槽1</p><p> 2.3.3 事件3<
3、;/p><p><b> 3 系統(tǒng)設(shè)計(jì)3</b></p><p> 3.1 需求分析3</p><p> 3.2 框架設(shè)計(jì)3</p><p> 3.2.1 俄羅斯方塊基本規(guī)則3</p><p> 3.2.2 系統(tǒng)模塊4</p><p> 3.3 系統(tǒng)實(shí)現(xiàn)
4、4</p><p><b> 4 系統(tǒng)測(cè)試6</b></p><p> 5 課程設(shè)計(jì)總結(jié)6</p><p><b> 6 附錄6</b></p><p> 6.1 參考資料6</p><p> 6.2 程序源碼6</p><p>&
5、lt;b> 摘要</b></p><p> Qt是一個(gè)跨平臺(tái)的C++圖形用戶(hù)界面應(yīng)用程序框架。本程序利用Qt提供的相關(guān)類(lèi),實(shí)現(xiàn)了俄羅斯方塊的基本功能。</p><p><b> 關(guān)鍵字</b></p><p> QT、嵌入式、軟件開(kāi)發(fā)</p><p><b> 功能說(shuō)明</b&
6、gt;</p><p> 支持俄羅斯方塊游戲的基本功能</p><p><b> 支持虛擬按鍵</b></p><p><b> 開(kāi)發(fā)環(huán)境</b></p><p> 操作系統(tǒng):ubuntu 10.04 LTS</p><p> 開(kāi)發(fā)工具:gnu編譯工具鏈(gcc等)
7、、Qt Creator、Qt 4.6.2</p><p><b> Qt簡(jiǎn)介</b></p><p> Qt是跨平臺(tái)的應(yīng)用程序和UI框架。它包括跨平臺(tái)類(lèi)庫(kù)、集成開(kāi)發(fā)工具和跨平臺(tái) IDE。使用Qt,只需一次性開(kāi)發(fā)應(yīng)用程序,無(wú)須重新編寫(xiě)源代碼,便可跨不同桌面和嵌入式操作系統(tǒng)部署這些應(yīng)用程序。</p><p><b> Qt安裝<
8、;/b></p><p> Qt官網(wǎng)(http://qt.nokia.com)上有完整的SDK下載,下載開(kāi)發(fā)平臺(tái)的SDK,下載完成后點(diǎn)擊即可安裝</p><p> 如果是使用Linux系統(tǒng),也可能通過(guò)命令行進(jìn)行安裝,以u(píng)buntu 10.04 LTS為例:</p><p> sudo apt-get install qt4-dev-tools qtcre
9、ator qt4-doc qt4-qtconfig qt-demos</p><p> 3.如果希望構(gòu)建嵌入式Qt開(kāi)發(fā)平臺(tái),則需要參考相關(guān)開(kāi)發(fā)板的說(shuō)明,一般是先制作交叉編譯工具鏈、再交叉編譯一個(gè)用于目標(biāo)板的Qt庫(kù),這里不再詳述</p><p><b> Qt開(kāi)發(fā)基礎(chǔ)</b></p><p><b> Qt對(duì)象與對(duì)象樹(shù)</b
10、></p><p> QObject是所有Qt類(lèi)的基類(lèi)。QObject 組織成為對(duì)象樹(shù)。當(dāng)你創(chuàng)建 QObject 時(shí),將另外的對(duì)象作為其父對(duì)象,這個(gè)對(duì)象就被加入其父對(duì)象的 children() 列表,并且當(dāng)父對(duì)象銷(xiāo)毀時(shí),這個(gè)對(duì)象也能夠被銷(xiāo)毀。事實(shí)證明,這種實(shí)現(xiàn)方法非常適合 GUI 對(duì)象。例如,一個(gè) QShortcut(鍵盤(pán)快捷鍵)對(duì)象是相關(guān)窗口的子對(duì)象,所以當(dāng)用戶(hù)關(guān)閉窗口時(shí),這個(gè)對(duì)象也能夠被刪除。<
11、/p><p> QWidget 作為所有能夠顯示在屏幕上的組件的父類(lèi),擴(kuò)展了這種父子關(guān)系。一個(gè)子對(duì)象通常也成為一個(gè)子組件,就是說(shuō),它被顯示在父組件的坐標(biāo)系統(tǒng)中,受到父組件的邊界影響可能會(huì)有剪切等等。例如,當(dāng)應(yīng)用程序銷(xiāo)毀掉已關(guān)閉的消息對(duì)話(huà)框時(shí),對(duì)話(huà)框上面的按鈕和標(biāo)簽一起被銷(xiāo)毀,就像我們希望的那樣,因?yàn)檫@些按鈕和標(biāo)簽都是對(duì)話(huà)框的子對(duì)象。</p><p><b> 信號(hào)與槽</b
12、></p><p> 在 GUI 編程中,當(dāng)我們改變了一個(gè)組件,我們經(jīng)常需要通知另外的一個(gè)組件。更一般地,我們希望任何類(lèi)型的對(duì)象都能夠與另外的對(duì)象通訊。例如,如果用戶(hù)點(diǎn)擊了關(guān)閉按鈕,我們希望窗口的 close() 函數(shù)被調(diào)用。</p><p> 早期工具庫(kù)對(duì)這種通訊使用回調(diào)實(shí)現(xiàn)?;卣{(diào)是一個(gè)指向一個(gè)函數(shù)的指針,所以如果你希望某種事件發(fā)生的時(shí)候,處理函數(shù)獲得通知,你就需要將指向另外函
13、數(shù)的指針(也就是這個(gè)回調(diào))傳遞給處理函數(shù)。這樣,處理函數(shù)就會(huì)在合適的時(shí)候調(diào)用回調(diào)函數(shù)?;卣{(diào)有兩個(gè)明顯的缺點(diǎn):第一,它們不是類(lèi)型安全的。我們不能保證處理函數(shù)傳遞給回調(diào)函數(shù)的參數(shù)都是正確的。第二,回調(diào)函數(shù)和處理函數(shù)緊密地耦合在一起,因?yàn)樘幚砗瘮?shù)必須知道哪一個(gè)函數(shù)被回調(diào)。</p><p> 在 Qt 中,我們有回調(diào)技術(shù)之外的選擇:信號(hào)槽。當(dāng)特定事件發(fā)出時(shí),一個(gè)信號(hào)會(huì)被發(fā)出。Qt 組件有很多預(yù)定義的信號(hào),同時(shí),我們也可
14、以通過(guò)繼承這些組件,添加自定義的信號(hào)。槽則能夠響應(yīng)特定信號(hào)的函數(shù)。Qt 組件有很多預(yù)定義的槽,但是更常見(jiàn)的是,通過(guò)繼承組件添加你自己的槽,以便你能夠按照自己的方式處理信號(hào)。</p><p> 信號(hào)槽機(jī)制是類(lèi)型安全的:信號(hào)的簽名必須同接受該信號(hào)的槽的簽名一致(實(shí)際上,槽的參數(shù)個(gè)數(shù)可以比信號(hào)少,因?yàn)椴勰軌蚝雎孕盘?hào)定義的多出來(lái)的參數(shù))。既然簽名都是兼容的,那么編譯器就可以幫助我們找出不匹配的地方。信號(hào)和槽是松耦合的:
15、發(fā)出信號(hào)的類(lèi)不知道也不關(guān)心哪些槽連接到它的信號(hào)。Qt 的信號(hào)槽機(jī)制保證了,如果你把一個(gè)信號(hào)同一個(gè)槽連接,那么在正確的時(shí)間,槽能夠接收到信號(hào)的參數(shù)并且被調(diào)用。信號(hào)和槽都可以有任意類(lèi)型的任意個(gè)數(shù)的參數(shù)。它們?nèi)慷际穷?lèi)型安全的。</p><p> 所有繼承自 QObject 或者它的一個(gè)子類(lèi)(例如 QWidget) 都可以包含信號(hào)槽。信號(hào)在對(duì)象改變其狀態(tài),并且這個(gè)狀態(tài)可能有別的對(duì)象關(guān)心時(shí)被發(fā)出。這就是這個(gè)對(duì)象為和別的
16、對(duì)象交互所做的所有工作。它并不知道也不關(guān)心有沒(méi)有別的對(duì)象正在接收它發(fā)出的信號(hào)。這是真正的信息封裝,保證了這個(gè)對(duì)象能夠成為一個(gè)組件。</p><p> 槽能夠被用于接收信號(hào),也能夠像普通函數(shù)一樣使用。正如一個(gè)對(duì)象并不知道究竟有沒(méi)有別的對(duì)象正在接收它的信號(hào)一樣,一個(gè)槽也不知道有沒(méi)有信號(hào)與它相連。這保證了使用 Qt 可以創(chuàng)建真正相互獨(dú)立的組件。</p><p> 你可以將任意多個(gè)信號(hào)連接到同
17、一個(gè)槽上,也可能將一個(gè)信號(hào)連接任意多個(gè)槽。同時(shí),也能夠直接將一個(gè)信號(hào)與另一個(gè)信號(hào)相連(這會(huì)使第一個(gè)信號(hào)發(fā)出時(shí),馬上發(fā)出第二個(gè)信號(hào))。</p><p> 總之,信號(hào)槽建立起一種非常強(qiáng)大的組件編程機(jī)制。</p><p><b> 事件</b></p><p> 在Qt中,事件是作為對(duì)象處理的,所有事件對(duì)象繼承自抽象類(lèi)QEvent。此類(lèi)用來(lái)表示
18、程序內(nèi)部發(fā)生或者來(lái)自于外部但應(yīng)用程序應(yīng)該知道的動(dòng)作。事件能夠能過(guò)被 QObject 的子類(lèi)接受或者處理,但是通常用在與組件有關(guān)的應(yīng)用中。本文檔主要闡述了在一個(gè)典型應(yīng)用中的事件接收與處理。</p><p> 當(dāng)一個(gè)事件產(chǎn)生時(shí),Qt 通過(guò)實(shí)例化一個(gè) QEvent 的合適的子類(lèi)來(lái)表示它,然后通過(guò)調(diào)用 event() 函數(shù)發(fā)送給 QObject 的實(shí)例(或者它的子類(lèi))。event() 函數(shù)本身并不會(huì)處理事件,根據(jù)事件類(lèi)
19、型,它將調(diào)用相應(yīng)的事件處理函數(shù),并且返回事件被接受還是被忽略。一些事件,比如 QMouseEvent 和 QKeyEvent,來(lái)自窗口系統(tǒng);有的,比如 QTimerEvent,來(lái)自于其他事件源;另外一些則來(lái)自應(yīng)用程序本身。</p><p> 通常事件的處理需要調(diào)用一個(gè)虛函數(shù)。比如,QPaintEvent 事件的處理需要調(diào)用 QWidget::paintEvent() 函數(shù)。這個(gè)虛函數(shù)負(fù)責(zé)做出適當(dāng)?shù)捻憫?yīng),通常是用
20、來(lái)重繪組件。如果你在自己的函數(shù)中并不打算實(shí)現(xiàn)所有的處理,你可以調(diào)用基類(lèi)的實(shí)現(xiàn)。</p><p><b> 系統(tǒng)設(shè)計(jì)</b></p><p><b> 需求分析</b></p><p> 可隨機(jī)生成7種基本方塊單元</p><p> 不同的方塊單元具備不同的顏色</p><
21、p> 基本方塊單元在移動(dòng)時(shí)支持兩種操作:旋轉(zhuǎn)、移動(dòng)</p><p><b> 具備計(jì)分及升級(jí)系統(tǒng)</b></p><p><b> 支持虛擬按鍵</b></p><p><b> 框架設(shè)計(jì)</b></p><p><b> 俄羅斯方塊基本規(guī)則</
22、b></p><p> 一個(gè)用于擺放小型正方形的平面虛擬場(chǎng)地,其標(biāo)準(zhǔn)大?。盒袑挒?0,列高為20,以每個(gè)小正方形為單位</p><p> 一組由4個(gè)小型正方形組成的規(guī)則圖形,英文稱(chēng)為T(mén)etromino,中文通稱(chēng)為方塊共有7種,分別以S、Z、L、J、I、O、T這7個(gè)字母的形狀來(lái)命名</p><p> 隨機(jī)發(fā)生器不斷地輸出單個(gè)方塊到場(chǎng)地頂部,以一定的規(guī)則進(jìn)行
23、移動(dòng)、旋轉(zhuǎn)、下落和擺放,鎖定并填充到場(chǎng)地中。每次擺放如果將場(chǎng)地的一行或多行完全填滿(mǎn),則組成這些行的所有小正方形將被消除,并且以此來(lái)?yè)Q取一定的積分或者其他形式的獎(jiǎng)勵(lì)。而未被消除的方塊會(huì)一直累積,并對(duì)后來(lái)的方塊擺放造成各種影響</p><p> 如果未被消除的方塊堆放的高度超過(guò)場(chǎng)地所規(guī)定的最大高度(并不一定是20或者玩家所能見(jiàn)到的高度),則游戲結(jié)束</p><p><b> 系統(tǒng)
24、模塊</b></p><p> 如上圖所示,系統(tǒng)可由以下幾個(gè)模塊組成:</p><p> 虛擬顯示屏:為系統(tǒng)核心模塊,負(fù)責(zé)游戲元素的顯示、游戲邏輯的執(zhí)行、以及游戲狀態(tài)的維護(hù)、接收操作模塊的操作信息、為輔助顯示模塊提供必要的信息</p><p> 輔助顯示模塊:顯示下一個(gè)方塊單元的類(lèi)型、當(dāng)前分?jǐn)?shù)、當(dāng)前等級(jí)</p><p>
25、操作區(qū)模塊:為用戶(hù)提供操作按鍵</p><p><b> 系統(tǒng)實(shí)現(xiàn)</b></p><p> 系統(tǒng)源文件布局如下:</p><p> HTetris.pro:系統(tǒng)工程文件</p><p> HTetrisWindow.h:HTetrisWindow類(lèi)聲明頭文件</p><p> HTet
26、risPiece.h:HTetrisPiece類(lèi)聲明頭文件</p><p> HTetrisBoard.h:HTetrisBoard類(lèi)聲明頭文件</p><p> tetris.qrc:系統(tǒng)資源文件,存放了表示方向的圖像數(shù)據(jù)</p><p> HTetrisWindow.cpp:HTetrisWindow類(lèi)的實(shí)現(xiàn)</p><p> H
27、TetrisPiece.cpp:HTetrisPiece類(lèi)的實(shí)現(xiàn)</p><p> HTetrisBoard.cpp:HTetrisBoard類(lèi)的實(shí)現(xiàn)</p><p> main.cpp:程序入口</p><p> main.cpp中初始化一個(gè)HTetrisWindow實(shí)例,并使其顯示。</p><p> HTetrisWindow對(duì)
28、應(yīng)程序窗口,它包含一個(gè)游戲顯示區(qū)(HTetrisBoard)、輔助顯示區(qū)、及一些按鍵,HTetrisWindow在自身的構(gòu)造函數(shù)中完成對(duì)這些界面元素的初始化及布局工作,同時(shí)建立起必要的信號(hào)-槽連接。</p><p> HTetrisPiece類(lèi)表示基本方塊單元,總共有7種,即I、T、J、L、O、Z、S,用HTetrisPieceShape來(lái)標(biāo)識(shí)方塊類(lèi)型。HTetrisPiece提供了設(shè)置方塊形狀、設(shè)置旋轉(zhuǎn)、獲取
29、方塊信息的一些公共成員函數(shù)。HTetrisPiece使用coords[4][2]這個(gè)二維數(shù)組來(lái)存儲(chǔ)方塊的形狀信息,這個(gè)數(shù)組的每行表示一個(gè)點(diǎn)的坐標(biāo)。</p><p> HTetrisBoard是整個(gè)程序的核心,相對(duì)前兩個(gè)類(lèi),這個(gè)類(lèi)要復(fù)雜很多。它提供了如下幾個(gè)槽:start()、pause()、moveRight()、moveLeft()、moveDown()、rotateRight()、rotateLeft()。
30、提供了scoreChanged與levelChanged兩個(gè)信號(hào)。paintEvent負(fù)責(zé)整個(gè)HTetrisBoard的重繪。removeFullLines負(fù)責(zé)判斷是否某行全部為方塊,如果是,則把該行消除,同時(shí)添加一定分?jǐn)?shù)及經(jīng)驗(yàn)。</p><p><b> 系統(tǒng)測(cè)試</b></p><p> 程序的運(yùn)行界面如上圖所示,經(jīng)測(cè)試,該程序具備了俄羅斯方塊游戲的基本功能。
31、</p><p><b> 課程設(shè)計(jì)總結(jié)</b></p><p> 通過(guò)這次嵌入式實(shí)驗(yàn),我對(duì)嵌入式技術(shù)有了更加深入的了解,在老師悉心幫助下,和其他同學(xué)的共同努力下,我們最終圓滿(mǎn)地完成了這次課程設(shè)計(jì)。但是實(shí)驗(yàn)中,也暴露了自己在軟件運(yùn)用方面的不足和缺點(diǎn),以后在這方面上認(rèn)真學(xué)習(xí)和研究,爭(zhēng)取在畢業(yè)之前能更上一層樓。</p><p><b>
32、; 附錄</b></p><p><b> 參考資料</b></p><p> [1]http://doc.qt.nokia.com/4.6/ </p><p> [2]C plus plus GUI Programming with Qt 4 2nd Edition</p><p> [3]htt
33、p://qtdocs.sourceforge.net </p><p><b> 程序源碼</b></p><p><b> /*</b></p><p> *Filename: main.cpp</p><p> *Author: Hale Chan <halechan@qq.com
34、></p><p> *Date: 2011-11-24</p><p><b> */</b></p><p> #include <QtGui></p><p> #include "HTetrisWindow.h"</p><p> int m
35、ain(int argc, char *argv[])</p><p><b> {</b></p><p> QApplication app(argc, argv);</p><p> HTetrisWindow window;</p><p> window.show();</p><p
36、> qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));</p><p> return app.exec();</p><p><b> }</b></p><p><b> /*</b></p><p> *Filename: HT
37、etrisWindow.h</p><p> *Author: Hale Chan <halechan@qq.com></p><p> *Date: 2011-11-24</p><p><b> */</b></p><p> #ifndef HTetrisWINDOW_H</p>
38、<p> #define HTetrisWINDOW_H</p><p> #include <QWidget></p><p> class HTetrisBoard;</p><p> class QLabel;</p><p> class QLCDNumber;</p><p>
39、 class QPushButton;</p><p> class HTetrisWindow : public QWidget</p><p><b> {</b></p><p><b> Q_OBJECT</b></p><p><b> public:</b>
40、;</p><p> HTetrisWindow();</p><p><b> private:</b></p><p> QLabel *createLabel(const QString &text);</p><p> HTetrisBoard *board;</p><p&g
41、t; QLabel *nextPieceLabel;</p><p> QLCDNumber *scoreLcd;</p><p> QLCDNumber *levelLcd;</p><p> QPushButton *leftButton;</p><p> QPushButton *rightButton;</p>
42、<p> QPushButton *upButton;</p><p> QPushButton *downButton;</p><p> QPushButton *aButton;</p><p> QPushButton *bButton;</p><p><b> };</b></p
43、><p> #endif // HTetrisWINDOW_H</p><p><b> /*</b></p><p> *Filename: HTetrisWindow.cpp</p><p> *Author: Hale Chan <halechan@qq.com></p><p&
44、gt; *Date: 2011-11-24</p><p><b> */</b></p><p> #include "HTetrisWindow.h"</p><p> #include "HTetrisBoard.h"</p><p> #include <Q
45、tGui></p><p> HTetrisWindow::HTetrisWindow()</p><p><b> {</b></p><p> board = new HTetrisBoard;</p><p> nextPieceLabel = new QLabel;</p><p
46、> nextPieceLabel->setFrameStyle(QFrame::Box | QFrame::Raised);</p><p> nextPieceLabel->setAlignment(Qt::AlignCenter);</p><p> nextPieceLabel->setBaseSize(60, 60);</p><p
47、> nextPieceLabel->setMinimumSize(60, 60);</p><p> nextPieceLabel->setMaximumSize(60,60);</p><p> nextPieceLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);</p>
48、<p> board->setNextPieceLabel(nextPieceLabel);</p><p> scoreLcd = new QLCDNumber(6);</p><p> scoreLcd->setSegmentStyle(QLCDNumber::Filled);</p><p> scoreLcd->setFi
49、xedWidth(70);</p><p> levelLcd = new QLCDNumber(1);</p><p> levelLcd->setSegmentStyle(QLCDNumber::Filled);</p><p> levelLcd->setFixedWidth(70);</p><p> leftBu
50、tton = new QPushButton;</p><p> leftButton->setAutoRepeat(true);</p><p> leftButton->setIcon(QIcon(":/images/left.png"));</p><p> rightButton = new QPushButton;&l
51、t;/p><p> rightButton->setAutoRepeat(true);</p><p> rightButton->setIcon(QIcon(":/images/right.png"));</p><p> upButton = new QPushButton;</p><p> upBu
52、tton->setIcon(QIcon(":/images/up.png"));</p><p> downButton = new QPushButton;</p><p> downButton->setAutoRepeat(true);</p><p> downButton->setIcon(QIcon("
53、;:/images/down.png"));</p><p> aButton = new QPushButton(tr("A"));</p><p> aButton->setFixedWidth(50);</p><p> bButton = new QPushButton(tr("B"));<
54、/p><p> bButton->setFixedWidth(50);</p><p> connect(leftButton, SIGNAL(clicked()), board, SLOT(moveLeft()));</p><p> connect(rightButton, SIGNAL(clicked()), board, SLOT(moveRight
55、()));</p><p> connect(upButton, SIGNAL(clicked()), board, SLOT(pause()));</p><p> connect(downButton, SIGNAL(clicked()), board, SLOT(moveDown()));</p><p> connect(aButton, SIGNAL
56、(clicked()), board, SLOT(rotateLeft()));</p><p> connect(bButton, SIGNAL(clicked()), board, SLOT(rotateRight()));</p><p> connect(board, SIGNAL(levelChanged(int)), levelLcd, SLOT(display(int))
57、);</p><p> connect(board, SIGNAL(scoreChanged(int)), scoreLcd, SLOT(display(int)));</p><p> QGridLayout *mainLayout = new QGridLayout;</p><p> mainLayout->addWidget(board, 0,
58、0, 7, 3, Qt::AlignCenter);</p><p> mainLayout->addWidget(createLabel(tr("Next")), 0, 3, Qt::AlignCenter);</p><p> mainLayout->addWidget(nextPieceLabel, 1, 3, Qt::AlignCenter);&
59、lt;/p><p> mainLayout->setRowStretch(2, 9);</p><p> mainLayout->addWidget(createLabel(tr("Score")), 3, 3, Qt::AlignCenter);</p><p> mainLayout->addWidget(scoreLcd
60、, 4, 3, Qt::AlignHCenter | Qt::AlignTop);</p><p> mainLayout->addWidget(createLabel(tr("Level")), 5, 3, Qt::AlignCenter);</p><p> mainLayout->addWidget(levelLcd, 6, 3, Qt::Alig
61、nHCenter | Qt::AlignTop);</p><p> mainLayout->addWidget(upButton, 7, 1, Qt::AlignBottom);</p><p> mainLayout->addWidget(aButton, 7, 3, Qt::AlignBottom | Qt::AlignHCenter);</p><
62、;p> mainLayout->addWidget(leftButton, 8, 0, Qt::AlignTop | Qt::AlignLeft);</p><p> mainLayout->addWidget(downButton, 8, 1, Qt::AlignBottom);</p><p> mainLayout->addWidget(rightBut
63、ton, 8, 2, Qt::AlignRight | Qt::AlignTop);</p><p> mainLayout->addWidget(bButton, 8, 3, Qt::AlignBottom | Qt::AlignHCenter);</p><p> mainLayout->setRowMinimumHeight(7, 30);</p>&l
64、t;p> mainLayout->setRowMinimumHeight(8, 50);</p><p> this->setLayout(mainLayout);</p><p> this->setWindowTitle(tr("Tetris"));</p><p> this->setFixedSize
65、(240, 400);</p><p><b> }</b></p><p> QLabel *HTetrisWindow::createLabel(const QString &text)</p><p><b> {</b></p><p> QLabel *lbl = new
66、QLabel(text);</p><p> lbl->setAlignment(Qt::AlignHCenter | Qt::AlignBottom);</p><p> return lbl;</p><p><b> }</b></p><p><b> /*</b></p
67、><p> *Filename: HTetrisPiece.h</p><p> *Author: Hale Chan <halechan@qq.com></p><p> *Date: 2011-11-24</p><p><b> */</b></p><p> #ifnde
68、f HTetrisPIECE_H</p><p> #define HTetrisPIECE_H</p><p> typedef enum{</p><p> HTetrisPieceShapeNone,</p><p> HTetrisPieceShapeI,</p><p> HTetrisPieceS
69、hapeT,</p><p> HTetrisPieceShapeJ,</p><p> HTetrisPieceShapeL,</p><p> HTetrisPieceShapeO,</p><p> HTetrisPieceShapeZ,</p><p> HTetrisPieceShapeS</
70、p><p> }HTetrisPieceShape;</p><p> typedef enum{</p><p> HTetrisPieceRotateZero,</p><p> HTetrisPieceRotate90,</p><p> HTetrisPieceRotate180,</p>
71、<p> HTetrisPieceRotate270</p><p> }HTetrisPieceRotate;</p><p> class HTetrisPiece</p><p><b> {</b></p><p><b> public:</b></p>
72、<p> HTetrisPiece(){setShape(HTetrisPieceShapeNone);}</p><p> void setRandomShape();</p><p> void setShape(HTetrisPieceShape shape);</p><p> HTetrisPieceShape shape() const
73、 { return pieceShape; }</p><p> int x(int index) const { return coords[index][0]; }</p><p> int y(int index) const { return coords[index][1]; }</p><p> int minX() const;</p>
74、;<p> int maxX() const;</p><p> int minY() const;</p><p> int maxY() const;</p><p> void setRotate(HTetrisPieceRotate rotate);</p><p> HTetrisPiece pieceFro
75、mRotatedLeft() const;</p><p> HTetrisPiece pieceFromRotatedRight() const;</p><p><b> private:</b></p><p> void setX(int index, int x) { coords[index][0] = x; }</p&
76、gt;<p> void setY(int index, int y) { coords[index][1] = y; }</p><p> HTetrisPieceShape pieceShape;</p><p> int coords[4][2];</p><p><b> };</b></p><
77、;p> #endif // HTetrisPIECE_H</p><p><b> /*</b></p><p> *Filename: HTetrispiece.cpp</p><p> *Author: Hale Chan <halechan@qq.com></p><p> *Date:
78、 2011-11-24</p><p><b> */</b></p><p> #include "HTetrisPiece.h"</p><p> #include <QtCore></p><p> static const int coordsTable[8][4][2]
79、= {</p><p> {{0, 0}, {0, 0}, {0, 0}, {0, 0}},</p><p> {{0, -1}, {0, 0}, {0, 1}, {0, 2}},</p><p> {{-1, 0}, {0, 0}, {1, 0}, {0, 1}},</p><p> {{0, -1}, {0, 0}, {0, 1}
80、, {-1, 1}},</p><p> {{0, -1}, {0, 0}, {0, 1}, {1, 1}},</p><p> {{0, 0}, {1, 0}, {1, 1}, {0, 1}},</p><p> {{-1, -1}, {0, -1}, {0, 0}, {1, 0}},</p><p> {{1, -1}, {0,
81、-1}, {0, 0}, {-1, 0}}</p><p><b> };</b></p><p> void HTetrisPiece::setRandomShape()</p><p><b> {</b></p><p> setShape((HTetrisPieceShape)(qr
82、and() % 7 + 1));</p><p><b> }</b></p><p> void HTetrisPiece::setShape(HTetrisPieceShape shape)</p><p><b> {</b></p><p> for (int i=0; i<4
83、; i++){</p><p> coords[i][0] = coordsTable[shape][i][0];</p><p> coords[i][1] = coordsTable[shape][i][1];</p><p><b> }</b></p><p> pieceShape = shape;&l
84、t;/p><p><b> }</b></p><p> int HTetrisPiece::minX()const</p><p><b> {</b></p><p> int min = coords[0][0];</p><p> for (int i = 1;
85、 i < 4; ++i)</p><p> min = qMin(min, coords[i][0]);</p><p> return min;</p><p><b> }</b></p><p> int HTetrisPiece::maxX()const</p><p>&l
86、t;b> {</b></p><p> int max = coords[0][0];</p><p> for (int i = 1; i < 4; ++i)</p><p> max = qMax(max, coords[i][0]);</p><p> return max;</p>&l
87、t;p><b> }</b></p><p> int HTetrisPiece::minY()const</p><p><b> {</b></p><p> int min = coords[0][1];</p><p> for (int i = 1; i < 4; +
88、+i)</p><p> min = qMin(min, coords[i][1]);</p><p> return min;</p><p><b> }</b></p><p> int HTetrisPiece::maxY()const</p><p><b> {&l
89、t;/b></p><p> int max = coords[0][1];</p><p> for (int i = 1; i < 4; ++i)</p><p> max = qMax(max, coords[i][1]);</p><p> return max;</p><p><b
90、> }</b></p><p> void HTetrisPiece::setRotate(HTetrisPieceRotate rotate)</p><p><b> {</b></p><p> switch(rotate){</p><p> case HTetrisPieceRota
91、te90:</p><p> for(int i=0; i<4; i++){</p><p> int tmp = x(i);</p><p> setX(i,-y(i));</p><p> setY(i, tmp);</p><p><b> }</b></p>
92、<p><b> break;</b></p><p> case HTetrisPieceRotate180:</p><p> for(int i=0; i<4; i++){</p><p> setX(i,-x(i));</p><p> setY(i, -y(i));</p>
93、<p><b> }</b></p><p><b> break;</b></p><p> case HTetrisPieceRotate270:</p><p> for(int i=0; i<4; i++){</p><p> int tmp = x(i);&l
94、t;/p><p> setX(i,y(i));</p><p> setY(i, -tmp);</p><p><b> }</b></p><p><b> break;</b></p><p><b> default:</b></p&g
95、t;<p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> HTetrisPiece HTetrisPiece::pieceFromRotatedLeft()const</p><p
96、><b> {</b></p><p> if (pieceShape == HTetrisPieceShapeO)</p><p> return *this;</p><p> HTetrisPiece result;</p><p> result.pieceShape = pieceShape;&
97、lt;/p><p> for (int i = 0; i < 4; ++i) {</p><p> result.setX(i, y(i));</p><p> result.setY(i, -x(i));</p><p><b> }</b></p><p> return resu
98、lt;</p><p><b> }</b></p><p> HTetrisPiece HTetrisPiece::pieceFromRotatedRight()const</p><p><b> {</b></p><p> if (pieceShape == HTetrisPiece
99、ShapeO)</p><p> return *this;</p><p> HTetrisPiece result;</p><p> result.pieceShape = pieceShape;</p><p> for (int i = 0; i < 4; ++i) {</p><p> re
100、sult.setX(i, -y(i));</p><p> result.setY(i, x(i));</p><p><b> }</b></p><p> return result;</p><p><b> }</b></p><p><b> /
101、*</b></p><p> *Filename: HTetrisBoard.h</p><p> *Author: Hale Chan <halechan@qq.com></p><p> *Date: 2011-11-24</p><p><b> */</b></p>
102、<p> #ifndef HTetrisBOARD_H</p><p> #define HTetrisBOARD_H</p><p> #include <QBasicTimer></p><p> #include <QFrame></p><p> #include <QPointer&
103、gt;</p><p> #include "HTetrisPiece.h"</p><p> class QLabel;</p><p> #define HTetrisBoardWidth 10</p><p> #define HTetrisBoardHeight 20</p><p>
104、; class HTetrisBoard : public QFrame</p><p><b> {</b></p><p><b> Q_OBJECT</b></p><p><b> public:</b></p><p> HTetrisBoard(QWidg
105、et *parent = 0);</p><p> void setNextPieceLabel(QLabel *label);</p><p> QSize sizeHint() const;</p><p> QSize minimumSizeHint() const;</p><p> public slots:</p&g
106、t;<p> void start();</p><p> void pause();</p><p> void moveRight();</p><p> void moveLeft();</p><p> void moveDown();</p><p> void rotateRigh
107、t();</p><p> void rotateLeft();</p><p><b> signals:</b></p><p> void scoreChanged(int score);</p><p> void levelChanged(int level);</p><p>
108、 protected:</p><p> void paintEvent(QPaintEvent *event);</p><p> void keyPressEvent(QKeyEvent *event);</p><p> void timerEvent(QTimerEvent *event);</p><p><b>
109、 private:</b></p><p> HTetrisPieceShape &shapeAt(int x, int y) { return board[(y * HTetrisBoardWidth) + x]; }</p><p> int timeoutTime() { return 1000 / level; }</p><p>
110、 int squareWidth() { return contentsRect().width() / HTetrisBoardWidth; }</p><p> int squareHeight() { return contentsRect().height() / HTetrisBoardHeight; }</p><p> void clearBoard();</p&
111、gt;<p> void dropDown();</p><p> void oneLineDown();</p><p> void pieceDropped(int dropHeight);</p><p> void removeFullLines();</p><p> void newPiece();<
112、/p><p> void showNextPiece();</p><p> bool tryMove(const HTetrisPiece &newPiece, int newX, int newY);</p><p> void drawSquare(QPainter &painter, int x, int y, HTetrisPieceSh
113、ape shape);</p><p> QBasicTimer timer;</p><p> QPointer<QLabel> nextPieceLabel;</p><p> bool isStarted;</p><p> bool isPaused;</p><p> bool isWa
114、itingAfterLine;</p><p> bool gameOver;</p><p> HTetrisPiece curPiece;</p><p> HTetrisPiece nextPiece;</p><p><b> int curX;</b></p><p><b
115、> int curY;</b></p><p> int score;</p><p> int level;</p><p><b> int exp;</b></p><p> HTetrisPieceShape board[HTetrisBoardWidth * HTetrisBoard
116、Height];</p><p><b> };</b></p><p> #endif // HTetrisBOARD_H</p><p><b> /*</b></p><p> *Filename: HTetrisBoard.cpp</p><p> *Aut
117、hor: Hale Chan <halechan@qq.com></p><p> *Date: 2011-11-24</p><p><b> */</b></p><p> #include <QtGui></p><p> #include "HTetrisBoard.h&
118、quot;</p><p> static const QRgb colorTable[8] = {</p><p><b> 0x000000,</b></p><p><b> 0x00F0F0,</b></p><p><b> 0xA000F0,</b><
119、/p><p><b> 0x0000F0,</b></p><p><b> 0xF0A000,</b></p><p><b> 0xF0F000,</b></p><p><b> 0xF00000,</b></p><p>
120、;<b> 0x00F000</b></p><p><b> };</b></p><p> HTetrisBoard::HTetrisBoard(QWidget *parent)</p><p> : QFrame(parent)</p><p><b> {</b&g
121、t;</p><p> setFrameStyle(QFrame::Panel | QFrame::Sunken);</p><p> setFocusPolicy(Qt::StrongFocus);</p><p> isStarted = false;</p><p> isPaused = false;</p>&
122、lt;p> gameOver = false;</p><p> clearBoard();</p><p> nextPiece.setRandomShape();</p><p> nextPiece.setRotate((HTetrisPieceRotate)(qrand()%4));</p><p><b>
123、 }</b></p><p> void HTetrisBoard::setNextPieceLabel(QLabel *label)</p><p><b> {</b></p><p> nextPieceLabel = label;</p><p><b> }</b>&l
124、t;/p><p> QSize HTetrisBoard::sizeHint() const</p><p><b> {</b></p><p> return QSize(HTetrisBoardWidth * 15 + frameWidth() * 2,</p><p> HTetrisBoardHeight
125、* 15 + frameWidth() * 2);</p><p><b> }</b></p><p> QSize HTetrisBoard::minimumSizeHint() const</p><p><b> {</b></p><p> return QSize(HTetris
126、BoardWidth * 5 + frameWidth() * 2,</p><p> HTetrisBoardHeight * 5 + frameWidth() * 2);</p><p><b> }</b></p><p> void HTetrisBoard::start()</p><p><b&g
127、t; {</b></p><p> if (isPaused)</p><p><b> return;</b></p><p> isStarted = true;</p><p> gameOver = false;</p><p> isWaitingAfterLin
128、e = false;</p><p> score = 0;</p><p> level = 1;</p><p> clearBoard();</p><p> emit scoreChanged(score);</p><p> emit levelChanged(level);</p>
129、<p> newPiece();</p><p> timer.start(timeoutTime(), this);</p><p><b> }</b></p><p> void HTetrisBoard::pause()</p><p><b> {</b></p&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 《c++俄羅斯方塊》課程設(shè)計(jì)--俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)---俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)--俄羅斯方塊設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊編程課程設(shè)計(jì)報(bào)告
- 俄羅斯方塊游戲課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告-俄羅斯方塊
- c課程設(shè)計(jì)--俄羅斯方塊
- 簡(jiǎn)單俄羅斯方塊課程設(shè)計(jì)
- java俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)論文
- arm課程設(shè)計(jì)俄羅斯方塊
評(píng)論
0/150
提交評(píng)論