關(guān)于俄羅斯方塊的嵌入式設(shè)計報告_第1頁
關(guān)于俄羅斯方塊的嵌入式設(shè)計報告_第2頁
關(guān)于俄羅斯方塊的嵌入式設(shè)計報告_第3頁
關(guān)于俄羅斯方塊的嵌入式設(shè)計報告_第4頁
關(guān)于俄羅斯方塊的嵌入式設(shè)計報告_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、關(guān)于俄羅斯方塊的嵌入式設(shè)計報告摘要 Qt是一個跨平臺的C+圖形用戶界面應(yīng)用程序框架。本程序利用Qt提供的相關(guān)類,實現(xiàn)了俄羅斯方塊的基本功能。關(guān)鍵字:QT、嵌入式、軟件開發(fā)一功能說明 支持俄羅斯方塊游戲的基本功能 支持虛擬按鍵二開發(fā)環(huán)境操作系統(tǒng):ubuntu 10.04 LTS;開發(fā)工具:gnu編譯工具鏈(gcc等)、Qt Creator、Qt 4.6.2。2.1 Qt簡介Qt是跨平臺的應(yīng)用程序和UI框架。它包括跨平臺類庫、集成開發(fā)工具和跨平臺 IDE。使用Qt,只需一次性開發(fā)應(yīng)用程序,無須重新編寫源代碼,便可跨不同桌面和嵌入式操作系統(tǒng)部署這些應(yīng)用程序。2.2Qt開發(fā)基礎(chǔ)2.2.1Qt對象與對象

2、樹QObject是所有Qt類的基類。QObject 組織成為對象樹。當(dāng)你創(chuàng)建 QObject 時,將另外的對象作為其父對象,這個對象就被加入其父對象的 children() 列表,并且當(dāng)父對象銷毀時,這個對象也能夠被銷毀。事實證明,這種實現(xiàn)方法非常適合 GUI 對象。例如,一個 QShortcut(鍵盤快捷鍵)對象是相關(guān)窗口的子對象,所以當(dāng)用戶關(guān)閉窗口時,這個對象也能夠被刪除。QWidget 作為所有能夠顯示在屏幕上的組件的父類,擴展了這種父子關(guān)系。一個子對象通常也成為一個子組件,就是說,它被顯示在父組件的坐標(biāo)系統(tǒng)中,受到父組件的邊界影響可能會有剪切等等。例如,當(dāng)應(yīng)用程序銷毀掉已關(guān)閉的消息對話

3、框時,對話框上面的按鈕和標(biāo)簽一起被銷毀,就像我們希望的那樣,因為這些按鈕和標(biāo)簽都是對話框的子對象。2.2.2信號與槽在 GUI 編程中,當(dāng)我們改變了一個組件,我們經(jīng)常需要通知另外的一個組件。更一般地,我們希望任何類型的對象都能夠與另外的對象通訊。例如,如果用戶點擊了關(guān)閉按鈕,我們希望窗口的 close() 函數(shù)被調(diào)用。早期工具庫對這種通訊使用回調(diào)實現(xiàn)?;卣{(diào)是一個指向一個函數(shù)的指針,所以如果你希望某種事件發(fā)生的時候,處理函數(shù)獲得通知,你就需要將指向另外函數(shù)的指針(也就是這個回調(diào))傳遞給處理函數(shù)。這樣,處理函數(shù)就會在合適的時候調(diào)用回調(diào)函數(shù)。回調(diào)有兩個明顯的缺點:第一,它們不是類型安全的。我們不能保

4、證處理函數(shù)傳遞給回調(diào)函數(shù)的參數(shù)都是正確的。第二,回調(diào)函數(shù)和處理函數(shù)緊密地耦合在一起,因為處理函數(shù)必須知道哪一個函數(shù)被回調(diào)。在 Qt 中,我們有回調(diào)技術(shù)之外的選擇:信號槽。當(dāng)特定事件發(fā)出時,一個信號會被發(fā)出。Qt 組件有很多預(yù)定義的信號,同時,我們也可以通過繼承這些組件,添加自定義的信號。槽則能夠響應(yīng)特定信號的函數(shù)。Qt 組件有很多預(yù)定義的槽,但是更常見的是,通過繼承組件添加你自己的槽,以便你能夠按照自己的方式處理信號。信號槽機制是類型安全的:信號的簽名必須同接受該信號的槽的簽名一致(實際上,槽的參數(shù)個數(shù)可以比信號少,因為槽能夠忽略信號定義的多出來的參數(shù))。既然簽名都是兼容的,那么編譯器就可以幫

5、助我們找出不匹配的地方。信號和槽是松耦合的:發(fā)出信號的類不知道也不關(guān)心哪些槽連接到它的信號。Qt 的信號槽機制保證了,如果你把一個信號同一個槽連接,那么在正確的時間,槽能夠接收到信號的參數(shù)并且被調(diào)用。信號和槽都可以有任意類型的任意個數(shù)的參數(shù)。它們?nèi)慷际穷愋桶踩?。所有繼承自 QObject 或者它的一個子類(例如 QWidget) 都可以包含信號槽。信號在對象改變其狀態(tài),并且這個狀態(tài)可能有別的對象關(guān)心時被發(fā)出。這就是這個對象為和別的對象交互所做的所有工作。它并不知道也不關(guān)心有沒有別的對象正在接收它發(fā)出的信號。這是真正的信息封裝,保證了這個對象能夠成為一個組件。槽能夠被用于接收信號,也能夠像普

6、通函數(shù)一樣使用。正如一個對象并不知道究竟有沒有別的對象正在接收它的信號一樣,一個槽也不知道有沒有信號與它相連。這保證了使用 Qt 可以創(chuàng)建真正相互獨立的組件。你可以將任意多個信號連接到同一個槽上,也可能將一個信號連接任意多個槽。同時,也能夠直接將一個信號與另一個信號相連(這會使第一個信號發(fā)出時,馬上發(fā)出第二個信號)??傊盘柌劢⑵鹨环N非常強大的組件編程機制。2.2.3事件在Qt中,事件是作為對象處理的,所有事件對象繼承自抽象類QEvent。此類用來表示程序內(nèi)部發(fā)生或者來自于外部但應(yīng)用程序應(yīng)該知道的動作。事件能夠能過被 QObject 的子類接受或者處理,但是通常用在與組件有關(guān)的應(yīng)用中。本文

7、檔主要闡述了在一個典型應(yīng)用中的事件接收與處理。當(dāng)一個事件產(chǎn)生時,Qt 通過實例化一個 QEvent 的合適的子類來表示它,然后通過調(diào)用 event() 函數(shù)發(fā)送給 QObject 的實例(或者它的子類)。event() 函數(shù)本身并不會處理事件,根據(jù)事件類型,它將調(diào)用相應(yīng)的事件處理函數(shù),并且返回事件被接受還是被忽略。一些事件,比如 QMouseEvent 和 QKeyEvent,來自窗口系統(tǒng);有的,比如 QTimerEvent,來自于其他事件源;另外一些則來自應(yīng)用程序本身。通常事件的處理需要調(diào)用一個虛函數(shù)。比如,QPaintEvent 事件的處理需要調(diào)用 QWidget:paintEvent()

8、 函數(shù)。這個虛函數(shù)負(fù)責(zé)做出適當(dāng)?shù)捻憫?yīng),通常是用來重繪組件。如果你在自己的函數(shù)中并不打算實現(xiàn)所有的處理,你可以調(diào)用基類的實現(xiàn)。三系統(tǒng)設(shè)計3.1需求分析n 可隨機生成7種基本方塊單元n 不同的方塊單元具備不同的顏色n 基本方塊單元在移動時支持兩種操作:旋轉(zhuǎn)、移動n 具備計分及升級系統(tǒng)n 支持虛擬按鍵3.2框架設(shè)計3.2.1俄羅斯方塊基本規(guī)則一個用于擺放小型正方形的平面虛擬場地,其標(biāo)準(zhǔn)大?。盒袑挒?0,列高為20,以每個小正方形為單位。一組由4個小型正方形組成的規(guī)則圖形,英文稱為Tetromino,中文通稱為方塊共有7種,分別以S、Z、L、J、I、O、T這7個字母的形狀來命名。隨機發(fā)生器不斷地輸出單

9、個方塊到場地頂部,以一定的規(guī)則進(jìn)行移動、旋轉(zhuǎn)、下落和擺放,鎖定并填充到場地中。每次擺放如果將場地的一行或多行完全填滿,則組成這些行的所有小正方形將被消除,并且以此來換取一定的積分或者其他形式的獎勵。而未被消除的方塊會一直累積,并對后來的方塊擺放造成各種影響。如果未被消除的方塊堆放的高度超過場地所規(guī)定的最大高度(并不一定是20或者玩家所能見到的高度),則游戲結(jié)束。3.2.2系統(tǒng)模塊如上圖所示,系統(tǒng)可由以下幾個模塊組成:v 虛擬顯示屏:為系統(tǒng)核心模塊,負(fù)責(zé)游戲元素的顯示、游戲邏輯的執(zhí)行、以及游戲狀態(tài)的維護(hù)、接收操作模塊的操作信息、為輔助顯示模塊提供必要的信息v 輔助顯示模塊:顯示下一個方塊單元的類

10、型、當(dāng)前分?jǐn)?shù)、當(dāng)前等級v 操作區(qū)模塊:為用戶提供操作按鍵四系統(tǒng)實現(xiàn)系統(tǒng)源文件布局如下: HT:系統(tǒng)工程文件 HTetrisWindow.h:HTetrisWindow類聲明頭文件 HTetrisPiece.h:HTetrisPiece類聲明頭文件 HTetrisBoard.h:HTetrisBoard類聲明頭文件 tetris.qrc:系統(tǒng)資源文件,存放了表示方向的圖像數(shù)據(jù) HTetrisWindow.cpp:HTetrisWindow類的實現(xiàn) HTetrisPiece.cpp:HTetrisPiece類的實現(xiàn) HTetrisBoard.cpp:HTetrisBoard類的實

11、現(xiàn) main.cpp:程序入口main.cpp中初始化一個HTetrisWindow實例,并使其顯示。HTetrisWindow對應(yīng)程序窗口,它包含一個游戲顯示區(qū)(HTetrisBoard)、輔助顯示區(qū)、及一些按鍵,HTetrisWindow在自身的構(gòu)造函數(shù)中完成對這些界面元素的初始化及布局工作,同時建立起必要的信號-槽連接。HTetrisPiece類表示基本方塊單元,總共有7種,即I、T、J、L、O、Z、S,用HTetrisPieceShape來標(biāo)識方塊類型。HTetrisPiece提供了設(shè)置方塊形狀、設(shè)置旋轉(zhuǎn)、獲取方塊信息的一些公共成員函數(shù)。HTetrisPiece使用coords42這個

12、二維數(shù)組來存儲方塊的形狀信息,這個數(shù)組的每行表示一個點的坐標(biāo)。HTetrisBoard是整個程序的核心,相對前兩個類,這個類要復(fù)雜很多。它提供了如下幾個槽:start()、pause()、moveRight()、moveLeft()、moveDown()、rotateRight()、rotateLeft()。提供了scoreChanged與levelChanged兩個信號。paintEvent負(fù)責(zé)整個HTetrisBoard的重繪。removeFullLines負(fù)責(zé)判斷是否某行全部為方塊,如果是,則把該行消除,同時添加一定分?jǐn)?shù)及經(jīng)驗。五系統(tǒng)測試程序的運行界面如上圖所示,經(jīng)測試,該程序具備了俄羅

13、斯方塊游戲的基本功能。五小結(jié)通過這次嵌入式實驗,我對嵌入式技術(shù)有了更加深入的了解,在老師悉心幫助下,和其他同學(xué)的共同努力下,我們最終圓滿地完成了這次課程設(shè)計。但是實驗中,也暴露了自己在軟件運用方面的不足和缺點,以后在這方面上認(rèn)真學(xué)習(xí)和研究,爭取在畢業(yè)之前能更上一層樓。六附錄6.1參考資料1/4.6/ 2C plus plus GUI Programming with Qt 4 2nd Edition3 6.2程序源碼/* *Filename: main.cpp *Author: Hale Cha

14、n *Date: 2011-11-24 */#include #include HTetrisWindow.hint main(int argc, char *argv) QApplication app(argc, argv); HTetrisWindow window; window.show(); qsrand(QTime(0,0,0).secsTo(QTime:currentTime(); return app.exec();/* *Filename: HTetrisWindow.h *Author: Hale Chan *Date: 2011-11-24 */#ifndef HTet

15、risWINDOW_H#define HTetrisWINDOW_H#include class HTetrisBoard;class QLabel;class QLCDNumber;class QPushButton;class HTetrisWindow : public QWidgetQ_OBJECTpublic: HTetrisWindow();private: QLabel *createLabel(const QString &text); HTetrisBoard *board; QLabel *nextPieceLabel; QLCDNumber *scoreLcd; QLCD

16、Number *levelLcd; QPushButton *leftButton; QPushButton *rightButton; QPushButton *upButton; QPushButton *downButton; QPushButton *aButton; QPushButton *bButton;#endif / HTetrisWINDOW_H/* *Filename: HTetrisWindow.cpp *Author: Hale Chan *Date: 2011-11-24 */#include HTetrisWindow.h#include HTetrisBoard

17、.h#include HTetrisWindow:HTetrisWindow() board = new HTetrisBoard; nextPieceLabel = new QLabel; nextPieceLabel-setFrameStyle(QFrame:Box | QFrame:Raised); nextPieceLabel-setAlignment(Qt:AlignCenter); nextPieceLabel-setBaseSize(60, 60); nextPieceLabel-setMinimumSize(60, 60); nextPieceLabel-setMaximumS

18、ize(60,60); nextPieceLabel-setSizePolicy(QSizePolicy:Fixed, QSizePolicy:Fixed); board-setNextPieceLabel(nextPieceLabel); scoreLcd = new QLCDNumber(6); scoreLcd-setSegmentStyle(QLCDNumber:Filled); scoreLcd-setFixedWidth(70); levelLcd = new QLCDNumber(1); levelLcd-setSegmentStyle(QLCDNumber:Filled); l

19、evelLcd-setFixedWidth(70); leftButton = new QPushButton; leftButton-setAutoRepeat(true); leftButton-setIcon(QIcon(:/images/left.png); rightButton = new QPushButton; rightButton-setAutoRepeat(true); rightButton-setIcon(QIcon(:/images/right.png); upButton = new QPushButton; upButton-setIcon(QIcon(:/im

20、ages/up.png); downButton = new QPushButton; downButton-setAutoRepeat(true); downButton-setIcon(QIcon(:/images/down.png); aButton = new QPushButton(tr(A); aButton-setFixedWidth(50); bButton = new QPushButton(tr(B); bButton-setFixedWidth(50); connect(leftButton, SIGNAL(clicked(), board, SLOT(moveLeft(

21、); connect(rightButton, SIGNAL(clicked(), board, SLOT(moveRight(); connect(upButton, SIGNAL(clicked(), board, SLOT(pause(); connect(downButton, SIGNAL(clicked(), board, SLOT(moveDown(); connect(aButton, SIGNAL(clicked(), board, SLOT(rotateLeft(); connect(bButton, SIGNAL(clicked(), board, SLOT(rotate

22、Right(); connect(board, SIGNAL(levelChanged(int), levelLcd, SLOT(display(int); connect(board, SIGNAL(scoreChanged(int), scoreLcd, SLOT(display(int); QGridLayout *mainLayout = new QGridLayout; mainLayout-addWidget(board, 0, 0, 7, 3, Qt:AlignCenter); mainLayout-addWidget(createLabel(tr(Next), 0, 3, Qt

23、:AlignCenter); mainLayout-addWidget(nextPieceLabel, 1, 3, Qt:AlignCenter); mainLayout-setRowStretch(2, 9); mainLayout-addWidget(createLabel(tr(Score), 3, 3, Qt:AlignCenter); mainLayout-addWidget(scoreLcd, 4, 3, Qt:AlignHCenter | Qt:AlignTop); mainLayout-addWidget(createLabel(tr(Level), 5, 3, Qt:Alig

24、nCenter); mainLayout-addWidget(levelLcd, 6, 3, Qt:AlignHCenter | Qt:AlignTop); mainLayout-addWidget(upButton, 7, 1, Qt:AlignBottom); mainLayout-addWidget(aButton, 7, 3, Qt:AlignBottom | Qt:AlignHCenter); mainLayout-addWidget(leftButton, 8, 0, Qt:AlignTop | Qt:AlignLeft); mainLayout-addWidget(downBut

25、ton, 8, 1, Qt:AlignBottom); mainLayout-addWidget(rightButton, 8, 2, Qt:AlignRight | Qt:AlignTop); mainLayout-addWidget(bButton, 8, 3, Qt:AlignBottom | Qt:AlignHCenter); mainLayout-setRowMinimumHeight(7, 30); mainLayout-setRowMinimumHeight(8, 50); this-setLayout(mainLayout); this-setWindowTitle(tr(Te

26、tris); this-setFixedSize(240, 400);QLabel *HTetrisWindow:createLabel(const QString &text) QLabel *lbl = new QLabel(text); lbl-setAlignment(Qt:AlignHCenter | Qt:AlignBottom); return lbl;/* *Filename: HTetrisPiece.h *Author: Hale Chan *Date: 2011-11-24 */#ifndef HTetrisPIECE_H#define HTetrisPIECE_Htyp

27、edef enum HTetrisPieceShapeNone, HTetrisPieceShapeI, HTetrisPieceShapeT, HTetrisPieceShapeJ, HTetrisPieceShapeL, HTetrisPieceShapeO, HTetrisPieceShapeZ, HTetrisPieceShapeSHTetrisPieceShape;typedef enum HTetrisPieceRotateZero, HTetrisPieceRotate90, HTetrisPieceRotate180, HTetrisPieceRotate270HTetrisP

28、ieceRotate;class HTetrisPiecepublic: HTetrisPiece()setShape(HTetrisPieceShapeNone); void setRandomShape(); void setShape(HTetrisPieceShape shape); HTetrisPieceShape shape() const return pieceShape; int x(int index) const return coordsindex0; int y(int index) const return coordsindex1; int minX() con

29、st; int maxX() const; int minY() const; int maxY() const; void setRotate(HTetrisPieceRotate rotate); HTetrisPiece pieceFromRotatedLeft() const; HTetrisPiece pieceFromRotatedRight() const;private: void setX(int index, int x) coordsindex0 = x; void setY(int index, int y) coordsindex1 = y; HTetrisPiece

30、Shape pieceShape; int coords42;#endif / HTetrisPIECE_H/* *Filename: HTetrispiece.cpp *Author: Hale Chan *Date: 2011-11-24 */#include HTetrisPiece.h#include static const int coordsTable842 = 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 2, -1, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 0, 0, 1, -1, 1, 0, -1, 0,

31、0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, -1, -1, 0, -1, 0, 0, 1, 0, 1, -1, 0, -1, 0, 0, -1, 0;void HTetrisPiece:setRandomShape() setShape(HTetrisPieceShape)(qrand() % 7 + 1);void HTetrisPiece:setShape(HTetrisPieceShape shape) for (int i=0; i4; i+) coordsi0 = coordsTableshapei0; coordsi1 = coordsTables

32、hapei1; pieceShape = shape;int HTetrisPiece:minX()const int min = coords00; for (int i = 1; i 4; +i) min = qMin(min, coordsi0); return min;int HTetrisPiece:maxX()const int max = coords00; for (int i = 1; i 4; +i) max = qMax(max, coordsi0); return max;int HTetrisPiece:minY()const int min = coords01;

33、for (int i = 1; i 4; +i) min = qMin(min, coordsi1); return min;int HTetrisPiece:maxY()const int max = coords01; for (int i = 1; i 4; +i) max = qMax(max, coordsi1); return max;void HTetrisPiece:setRotate(HTetrisPieceRotate rotate) switch(rotate) case HTetrisPieceRotate90: for(int i=0; i4; i+) int tmp

34、 = x(i); setX(i,-y(i); setY(i, tmp); break; case HTetrisPieceRotate180: for(int i=0; i4; i+) setX(i,-x(i); setY(i, -y(i); break; case HTetrisPieceRotate270: for(int i=0; i4; i+) int tmp = x(i); setX(i,y(i); setY(i, -tmp); break; default: break; HTetrisPiece HTetrisPiece:pieceFromRotatedLeft()const i

35、f (pieceShape = HTetrisPieceShapeO) return *this; HTetrisPiece result; result.pieceShape = pieceShape; for (int i = 0; i 4; +i) result.setX(i, y(i); result.setY(i, -x(i); return result;HTetrisPiece HTetrisPiece:pieceFromRotatedRight()const if (pieceShape = HTetrisPieceShapeO) return *this; HTetrisPi

36、ece result; result.pieceShape = pieceShape; for (int i = 0; i 4; +i) result.setX(i, -y(i); result.setY(i, x(i); return result;/* *Filename: HTetrisBoard.h *Author: Hale Chan *Date: 2011-11-24 */#ifndef HTetrisBOARD_H#define HTetrisBOARD_H#include #include #include #include HTetrisPiece.hclass QLabel

37、;#define HTetrisBoardWidth 10#define HTetrisBoardHeight 20class HTetrisBoard : public QFrame Q_OBJECTpublic: HTetrisBoard(QWidget *parent = 0); void setNextPieceLabel(QLabel *label); QSize sizeHint() const; QSize minimumSizeHint() const;public slots: void start(); void pause(); void moveRight(); voi

38、d moveLeft(); void moveDown(); void rotateRight(); void rotateLeft();signals: void scoreChanged(int score); void levelChanged(int level);protected: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); void timerEvent(QTimerEvent *event);private: HTetrisPieceShape &shapeAt(int x

39、, int y) return board(y * HTetrisBoardWidth) + x; int timeoutTime() return 1000 / level; int squareWidth() return contentsRect().width() / HTetrisBoardWidth; int squareHeight() return contentsRect().height() / HTetrisBoardHeight; void clearBoard(); void dropDown(); void oneLineDown(); void pieceDrop

40、ped(int dropHeight); void removeFullLines(); void newPiece(); void showNextPiece(); bool tryMove(const HTetrisPiece &newPiece, int newX, int newY); void drawSquare(QPainter &painter, int x, int y, HTetrisPieceShape shape); QBasicTimer timer; QPointer nextPieceLabel; bool isStarted; bool isPaused; bo

41、ol isWaitingAfterLine; bool gameOver; HTetrisPiece curPiece; HTetrisPiece nextPiece; int curX; int curY; int score; int level; int exp; HTetrisPieceShape boardHTetrisBoardWidth * HTetrisBoardHeight;#endif / HTetrisBOARD_H/* *Filename: HTetrisBoard.cpp *Author: Hale Chan *Date: 2011-11-24 */#include

42、#include HTetrisBoard.hstatic const QRgb colorTable8 = 0x000000, 0x00F0F0, 0xA000F0, 0x0000F0, 0xF0A000, 0xF0F000, 0xF00000, 0x00F000;HTetrisBoard:HTetrisBoard(QWidget *parent) : QFrame(parent) setFrameStyle(QFrame:Panel | QFrame:Sunken); setFocusPolicy(Qt:StrongFocus); isStarted = false; isPaused =

43、 false; gameOver = false; clearBoard(); nextPiece.setRandomShape(); nextPiece.setRotate(HTetrisPieceRotate)(qrand()%4);void HTetrisBoard:setNextPieceLabel(QLabel *label) nextPieceLabel = label;QSize HTetrisBoard:sizeHint() const return QSize(HTetrisBoardWidth * 15 + frameWidth() * 2, HTetrisBoardHei

44、ght * 15 + frameWidth() * 2);QSize HTetrisBoard:minimumSizeHint() const return QSize(HTetrisBoardWidth * 5 + frameWidth() * 2, HTetrisBoardHeight * 5 + frameWidth() * 2);void HTetrisBoard:start() if (isPaused) return; isStarted = true; gameOver = false; isWaitingAfterLine = false; score = 0; level =

45、 1; clearBoard(); emit scoreChanged(score); emit levelChanged(level); newPiece(); timer.start(timeoutTime(), this);void HTetrisBoard:pause() if (!isStarted) start(); return; isPaused = !isPaused; if (isPaused) timer.stop(); else timer.start(timeoutTime(), this); update();void HTetrisBoard:paintEvent(QPaintEvent *ev

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論