課程設(shè)計報告-俄羅斯方塊-嵌入式_第1頁
已閱讀1頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  目 錄</b></p><p><b>  摘要1</b></p><p><b>  關(guān)鍵字1</b></p><p><b>  1 功能說明1</b></p><p><b>  2 開發(fā)環(huán)境1&

2、lt;/b></p><p>  2.1 Qt簡介1</p><p>  2.2 Qt安裝1</p><p>  2.3 Qt開發(fā)基礎(chǔ)1</p><p>  2.3.1 Qt對象與對象樹1</p><p>  2.3.2 信號與槽1</p><p>  2.3.3 事件3<

3、;/p><p><b>  3 系統(tǒng)設(shè)計3</b></p><p>  3.1 需求分析3</p><p>  3.2 框架設(shè)計3</p><p>  3.2.1 俄羅斯方塊基本規(guī)則3</p><p>  3.2.2 系統(tǒng)模塊4</p><p>  3.3 系統(tǒng)實現(xiàn)

4、4</p><p><b>  4 系統(tǒng)測試6</b></p><p>  5 課程設(shè)計總結(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是一個跨平臺的C++圖形用戶界面應用程序框架。本程序利用Qt提供的相關(guān)類,實現(xiàn)了俄羅斯方塊的基本功能。</p><p><b>  關(guān)鍵字</b></p><p>  QT、嵌入式、軟件開發(fā)</p><p><b>  功能說明</b&

6、gt;</p><p>  支持俄羅斯方塊游戲的基本功能</p><p><b>  支持虛擬按鍵</b></p><p><b>  開發(fā)環(huán)境</b></p><p>  操作系統(tǒng):ubuntu 10.04 LTS</p><p>  開發(fā)工具:gnu編譯工具鏈(gcc等)

7、、Qt Creator、Qt 4.6.2</p><p><b>  Qt簡介</b></p><p>  Qt是跨平臺的應用程序和UI框架。它包括跨平臺類庫、集成開發(fā)工具和跨平臺 IDE。使用Qt,只需一次性開發(fā)應用程序,無須重新編寫源代碼,便可跨不同桌面和嵌入式操作系統(tǒng)部署這些應用程序。</p><p><b>  Qt安裝<

8、;/b></p><p>  Qt官網(wǎng)(http://qt.nokia.com)上有完整的SDK下載,下載開發(fā)平臺的SDK,下載完成后點擊即可安裝</p><p>  如果是使用Linux系統(tǒng),也可能通過命令行進行安裝,以ubuntu 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開發(fā)平臺,則需要參考相關(guān)開發(fā)板的說明,一般是先制作交叉編譯工具鏈、再交叉編譯一個用于目標板的Qt庫,這里不再詳述</p><p><b>  Qt開發(fā)基礎(chǔ)</b></p><p><b>  Qt對象與對象樹</b

10、></p><p>  QObject是所有Qt類的基類。QObject 組織成為對象樹。當你創(chuàng)建 QObject 時,將另外的對象作為其父對象,這個對象就被加入其父對象的 children() 列表,并且當父對象銷毀時,這個對象也能夠被銷毀。事實證明,這種實現(xiàn)方法非常適合 GUI 對象。例如,一個 QShortcut(鍵盤快捷鍵)對象是相關(guān)窗口的子對象,所以當用戶關(guān)閉窗口時,這個對象也能夠被刪除。<

11、/p><p>  QWidget 作為所有能夠顯示在屏幕上的組件的父類,擴展了這種父子關(guān)系。一個子對象通常也成為一個子組件,就是說,它被顯示在父組件的坐標系統(tǒng)中,受到父組件的邊界影響可能會有剪切等等。例如,當應用程序銷毀掉已關(guān)閉的消息對話框時,對話框上面的按鈕和標簽一起被銷毀,就像我們希望的那樣,因為這些按鈕和標簽都是對話框的子對象。</p><p><b>  信號與槽</b

12、></p><p>  在 GUI 編程中,當我們改變了一個組件,我們經(jīng)常需要通知另外的一個組件。更一般地,我們希望任何類型的對象都能夠與另外的對象通訊。例如,如果用戶點擊了關(guān)閉按鈕,我們希望窗口的 close() 函數(shù)被調(diào)用。</p><p>  早期工具庫對這種通訊使用回調(diào)實現(xiàn)?;卣{(diào)是一個指向一個函數(shù)的指針,所以如果你希望某種事件發(fā)生的時候,處理函數(shù)獲得通知,你就需要將指向另外函

13、數(shù)的指針(也就是這個回調(diào))傳遞給處理函數(shù)。這樣,處理函數(shù)就會在合適的時候調(diào)用回調(diào)函數(shù)?;卣{(diào)有兩個明顯的缺點:第一,它們不是類型安全的。我們不能保證處理函數(shù)傳遞給回調(diào)函數(shù)的參數(shù)都是正確的。第二,回調(diào)函數(shù)和處理函數(shù)緊密地耦合在一起,因為處理函數(shù)必須知道哪一個函數(shù)被回調(diào)。</p><p>  在 Qt 中,我們有回調(diào)技術(shù)之外的選擇:信號槽。當特定事件發(fā)出時,一個信號會被發(fā)出。Qt 組件有很多預定義的信號,同時,我們也可

14、以通過繼承這些組件,添加自定義的信號。槽則能夠響應特定信號的函數(shù)。Qt 組件有很多預定義的槽,但是更常見的是,通過繼承組件添加你自己的槽,以便你能夠按照自己的方式處理信號。</p><p>  信號槽機制是類型安全的:信號的簽名必須同接受該信號的槽的簽名一致(實際上,槽的參數(shù)個數(shù)可以比信號少,因為槽能夠忽略信號定義的多出來的參數(shù))。既然簽名都是兼容的,那么編譯器就可以幫助我們找出不匹配的地方。信號和槽是松耦合的:

15、發(fā)出信號的類不知道也不關(guān)心哪些槽連接到它的信號。Qt 的信號槽機制保證了,如果你把一個信號同一個槽連接,那么在正確的時間,槽能夠接收到信號的參數(shù)并且被調(diào)用。信號和槽都可以有任意類型的任意個數(shù)的參數(shù)。它們?nèi)慷际穷愋桶踩摹?lt;/p><p>  所有繼承自 QObject 或者它的一個子類(例如 QWidget) 都可以包含信號槽。信號在對象改變其狀態(tài),并且這個狀態(tài)可能有別的對象關(guān)心時被發(fā)出。這就是這個對象為和別的

16、對象交互所做的所有工作。它并不知道也不關(guān)心有沒有別的對象正在接收它發(fā)出的信號。這是真正的信息封裝,保證了這個對象能夠成為一個組件。</p><p>  槽能夠被用于接收信號,也能夠像普通函數(shù)一樣使用。正如一個對象并不知道究竟有沒有別的對象正在接收它的信號一樣,一個槽也不知道有沒有信號與它相連。這保證了使用 Qt 可以創(chuàng)建真正相互獨立的組件。</p><p>  你可以將任意多個信號連接到同

17、一個槽上,也可能將一個信號連接任意多個槽。同時,也能夠直接將一個信號與另一個信號相連(這會使第一個信號發(fā)出時,馬上發(fā)出第二個信號)。</p><p>  總之,信號槽建立起一種非常強大的組件編程機制。</p><p><b>  事件</b></p><p>  在Qt中,事件是作為對象處理的,所有事件對象繼承自抽象類QEvent。此類用來表示

18、程序內(nèi)部發(fā)生或者來自于外部但應用程序應該知道的動作。事件能夠能過被 QObject 的子類接受或者處理,但是通常用在與組件有關(guān)的應用中。本文檔主要闡述了在一個典型應用中的事件接收與處理。</p><p>  當一個事件產(chǎn)生時,Qt 通過實例化一個 QEvent 的合適的子類來表示它,然后通過調(diào)用 event() 函數(shù)發(fā)送給 QObject 的實例(或者它的子類)。event() 函數(shù)本身并不會處理事件,根據(jù)事件類

19、型,它將調(diào)用相應的事件處理函數(shù),并且返回事件被接受還是被忽略。一些事件,比如 QMouseEvent 和 QKeyEvent,來自窗口系統(tǒng);有的,比如 QTimerEvent,來自于其他事件源;另外一些則來自應用程序本身。</p><p>  通常事件的處理需要調(diào)用一個虛函數(shù)。比如,QPaintEvent 事件的處理需要調(diào)用 QWidget::paintEvent() 函數(shù)。這個虛函數(shù)負責做出適當?shù)捻憫?,通常是?/p>

20、來重繪組件。如果你在自己的函數(shù)中并不打算實現(xiàn)所有的處理,你可以調(diào)用基類的實現(xiàn)。</p><p><b>  系統(tǒng)設(shè)計</b></p><p><b>  需求分析</b></p><p>  可隨機生成7種基本方塊單元</p><p>  不同的方塊單元具備不同的顏色</p><

21、p>  基本方塊單元在移動時支持兩種操作:旋轉(zhuǎn)、移動</p><p><b>  具備計分及升級系統(tǒng)</b></p><p><b>  支持虛擬按鍵</b></p><p><b>  框架設(shè)計</b></p><p><b>  俄羅斯方塊基本規(guī)則</

22、b></p><p>  一個用于擺放小型正方形的平面虛擬場地,其標準大?。盒袑挒?0,列高為20,以每個小正方形為單位</p><p>  一組由4個小型正方形組成的規(guī)則圖形,英文稱為Tetromino,中文通稱為方塊共有7種,分別以S、Z、L、J、I、O、T這7個字母的形狀來命名</p><p>  隨機發(fā)生器不斷地輸出單個方塊到場地頂部,以一定的規(guī)則進行

23、移動、旋轉(zhuǎn)、下落和擺放,鎖定并填充到場地中。每次擺放如果將場地的一行或多行完全填滿,則組成這些行的所有小正方形將被消除,并且以此來換取一定的積分或者其他形式的獎勵。而未被消除的方塊會一直累積,并對后來的方塊擺放造成各種影響</p><p>  如果未被消除的方塊堆放的高度超過場地所規(guī)定的最大高度(并不一定是20或者玩家所能見到的高度),則游戲結(jié)束</p><p><b>  系統(tǒng)

24、模塊</b></p><p>  如上圖所示,系統(tǒng)可由以下幾個模塊組成:</p><p>  虛擬顯示屏:為系統(tǒng)核心模塊,負責游戲元素的顯示、游戲邏輯的執(zhí)行、以及游戲狀態(tài)的維護、接收操作模塊的操作信息、為輔助顯示模塊提供必要的信息</p><p>  輔助顯示模塊:顯示下一個方塊單元的類型、當前分數(shù)、當前等級</p><p>  

25、操作區(qū)模塊:為用戶提供操作按鍵</p><p><b>  系統(tǒng)實現(xiàn)</b></p><p>  系統(tǒng)源文件布局如下:</p><p>  HTetris.pro:系統(tǒng)工程文件</p><p>  HTetrisWindow.h:HTetrisWindow類聲明頭文件</p><p>  HTet

26、risPiece.h:HTetrisPiece類聲明頭文件</p><p>  HTetrisBoard.h:HTetrisBoard類聲明頭文件</p><p>  tetris.qrc:系統(tǒng)資源文件,存放了表示方向的圖像數(shù)據(jù)</p><p>  HTetrisWindow.cpp:HTetrisWindow類的實現(xiàn)</p><p>  H

27、TetrisPiece.cpp:HTetrisPiece類的實現(xiàn)</p><p>  HTetrisBoard.cpp:HTetrisBoard類的實現(xiàn)</p><p>  main.cpp:程序入口</p><p>  main.cpp中初始化一個HTetrisWindow實例,并使其顯示。</p><p>  HTetrisWindow對

28、應程序窗口,它包含一個游戲顯示區(qū)(HTetrisBoard)、輔助顯示區(qū)、及一些按鍵,HTetrisWindow在自身的構(gòu)造函數(shù)中完成對這些界面元素的初始化及布局工作,同時建立起必要的信號-槽連接。</p><p>  HTetrisPiece類表示基本方塊單元,總共有7種,即I、T、J、L、O、Z、S,用HTetrisPieceShape來標識方塊類型。HTetrisPiece提供了設(shè)置方塊形狀、設(shè)置旋轉(zhuǎn)、獲取

29、方塊信息的一些公共成員函數(shù)。HTetrisPiece使用coords[4][2]這個二維數(shù)組來存儲方塊的形狀信息,這個數(shù)組的每行表示一個點的坐標。</p><p>  HTetrisBoard是整個程序的核心,相對前兩個類,這個類要復雜很多。它提供了如下幾個槽:start()、pause()、moveRight()、moveLeft()、moveDown()、rotateRight()、rotateLeft()。

30、提供了scoreChanged與levelChanged兩個信號。paintEvent負責整個HTetrisBoard的重繪。removeFullLines負責判斷是否某行全部為方塊,如果是,則把該行消除,同時添加一定分數(shù)及經(jīng)驗。</p><p><b>  系統(tǒng)測試</b></p><p>  程序的運行界面如上圖所示,經(jīng)測試,該程序具備了俄羅斯方塊游戲的基本功能。

31、</p><p><b>  課程設(shè)計總結(jié)</b></p><p>  通過這次嵌入式實驗,我對嵌入式技術(shù)有了更加深入的了解,在老師悉心幫助下,和其他同學的共同努力下,我們最終圓滿地完成了這次課程設(shè)計。但是實驗中,也暴露了自己在軟件運用方面的不足和缺點,以后在這方面上認真學習和研究,爭取在畢業(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論