版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.俄羅斯方塊游戲Main.cpp主程序代碼:#include #include #include tetrixwindow.hint main(int argc, char *argv) / 為了能夠正常顯示中文,設(shè)置Tr編碼環(huán)境為GB2312 (詳見(jiàn)wiki) QTextCodec:setCodecForTr(QTextCodec:codecForName(GB2312); / app這個(gè)對(duì)象用于管理應(yīng)用級(jí)別的資源 QApplication app(argc, argv); app.setStyleSheet(TetrixBoard background-color:lightGray);
2、TetrixWindow window; window.setWindowIcon(QIcon(:/Chrome.ico); window.show(); / 當(dāng)前時(shí)間作為隨機(jī)種子 qsrand(QTime(0,0,0).secsTo(QTime:currentTime(); return app.exec(); / 程序的事件循環(huán)Tetrixboard.h頭文件代碼:/ 主游戲區(qū)類#ifndef TETRIXBOARD_H#define TETRIXBOARD_H#include tetrixpiece.h#include #include #include #include / 前向聲明c
3、lass QLabel;class TetrixBoard : public QFrame Q_OBJECTpublic: TetrixBoard(QWidget *parent = 0); void setNextPieceLabel(QLabel *label); QSize sizeHint() const;/最適合大小 QSize minimumSizeHint() const; / 最小限制public slots: / 公有槽 void start(); void pause();signals: / 信號(hào):只需聲明,根據(jù)參數(shù)變化來(lái)判斷 void scoreChanged(int
4、score); void levelChanged(int level); void linesRemovedChanged(int numLines);protected: / 著色、鍵盤、計(jì)時(shí)事件:其中著色事件隨著update()不斷觸發(fā) void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); void timerEvent(QTimerEvent *event);private: enum BoardWidth = 10, BoardHeight = 22 ; / 把主游戲區(qū)寬分成10等份,高分
5、成22等份,也就是說(shuō)每行有10小矩形,總共有22行 TetrixShape &shapeAt(int x, int y) return board(y * BoardWidth) + x; int timeoutTime() return 1000 / (1 + level); / contentsRect():返回當(dāng)前布局(QLayout)的矩形,可訪問(wèn)其長(zhǎng)、寬 (詳見(jiàn)API) / conntentsRect().width()/BoardWidth 把游戲區(qū)矩形的寬分成了BoardWidth份 int squareWidth() return contentsRect().width()
6、/ BoardWidth; / 同上,把高分成了BoardHeight份 int squareHeight() return contentsRect().height() / BoardHeight; / 此時(shí)squareWidth(),squareHeight()分別是分割后的小矩形寬和高 void clearBoard(); / 清屏 void dropDown(); / 下落事件 void oneLineDown();/ 下落一行 void pieceDropped(int dropHeight); void removeFullLines(); / 移除填滿的行 void newPi
7、ece(); / 新方塊 void showNextPiece(); / 顯示下一個(gè)方塊 bool tryMove(const TetrixPiece &newPiece, int newX, int newY); / 判斷方塊是否可以移動(dòng) void drawSquare(QPainter &painter, int x, int y, TetrixShape shape); / 著色 QBasicTimer timer; / 相當(dāng)于QLabel *nextPieceLabel(QPointer詳見(jiàn)API) QPointer nextPieceLabel; bool isStarted; bo
8、ol isPaused; bool isWaitingAfterLine; TetrixPiece curPiece; / 當(dāng)前方塊 TetrixPiece nextPiece; / 下一個(gè)方塊 int curX; int curY; int numLinesRemoved; int numPiecesDropped; int score; int level; TetrixShape boardBoardWidth * BoardHeight;#endif / TETRIXBOARD_HTetrixboard.cpp程序代碼:#include #include tetrixboard.hTe
9、trixBoard:TetrixBoard(QWidget *parent) : QFrame(parent) / 設(shè)置游戲區(qū)框架風(fēng)格:內(nèi)浮雕 setFrameStyle(QFrame:Panel | QFrame:Sunken); / 增加游戲區(qū)鍵盤鼠標(biāo)等事件的焦點(diǎn)集中 setFocusPolicy(Qt:StrongFocus); isStarted = false; / 初始化:未開始狀態(tài) isPaused = false; clearBoard(); / 初始清屏 nextPiece.setRandomShape(); / 下一方塊獲得一個(gè)隨機(jī)形狀/ tetrixpiece.h : t
10、etrixpiece.cpp中使用void TetrixBoard:setNextPieceLabel(QLabel *label) nextPieceLabel = label;/ 游戲區(qū)合適大小QSize TetrixBoard:sizeHint() const return QSize(BoardWidth*15 + frameWidth()*2, BoardHeight*15 + frameWidth()*2);/ 游戲區(qū)最小大小QSize TetrixBoard:minimumSizeHint() const return QSize(BoardWidth*5 + frameWidt
11、h()*2, BoardHeight*5 + frameWidth()*2);/ 開始事件:slotsvoid TetrixBoard:start() / 如果已暫停,則啟動(dòng)無(wú)效 if (isPaused) return; isStarted = true; / 標(biāo)記已開始 isWaitingAfterLine = false; / 此參數(shù)為判斷是否有方塊正在下落,false為有方塊正在下落中 / 初始各參數(shù) numLinesRemoved = 0; numPiecesDropped = 0; score = 0; level = 1; clearBoard(); / 清屏 / emit 信號(hào)
12、發(fā)射:觸發(fā)對(duì)應(yīng)信號(hào)槽內(nèi)的函數(shù)(相關(guān)connect()在tetrixwindow.cpp中) emit linesRemovedChanged(numLinesRemoved); emit scoreChanged(score); emit levelChanged(level); newPiece(); / 調(diào)用新方塊 timer.start(timeoutTime(), this);/ 游戲開始計(jì)時(shí)/ 暫停事件:slotsvoid TetrixBoard:pause() / 如果未開始,則暫停無(wú)效 if (!isStarted) return; / 否則,若未暫停,則賦值為暫停,反之,取消暫
13、停,繼續(xù)游戲 isPaused = !isPaused; if (isPaused) timer.stop(); / 游戲計(jì)時(shí)停止 else timer.start(timeoutTime(), this); / 否則繼續(xù)計(jì)時(shí) update(); / 刷新窗口:動(dòng)態(tài)顯示畫面/ 游戲區(qū)方塊著色/ 重定義繪圖事件,當(dāng)調(diào)用update()時(shí)進(jìn)行重繪void TetrixBoard:paintEvent(QPaintEvent *event) QFrame:paintEvent(event); QPainter painter(this); QRect rect = contentsRect(); /
14、 QRect定義了平面上的矩形 (詳見(jiàn)API),是主游戲區(qū) / 暫停的時(shí)候顯示的信息 if (isPaused) painter.drawText(rect, Qt:AlignCenter, tr(游戲暫停); return; / BoardHeight*squareHeight() 相當(dāng)于 contentsRect().Height(),是小網(wǎng)格的高 / 因?yàn)閟quareHeight() return contentsRect().Width()/BoardWidth(); / 見(jiàn)tetrixboard.h中的定義 int boardTop = rect.bottom() - BoardHe
15、ight*squareHeight(); for (int i=0; iBoardHeight; +i) for (int j=0; jBoardWidth; +j) / TetrixShape &shapeAt(int x, int y) return board(y * BoardWidth) + x; TetrixShape shape = shapeAt(j, BoardHeight-i-1); if (shape != NoShape) / rect.left() 返回游戲區(qū)矩形左邊的x坐標(biāo),squareWidth()為小網(wǎng)格的寬度 drawSquare(painter, rect.
16、left() + j*squareWidth(), boardTop + i*squareHeight(), shape); / 繪圖 if (curPiece.shape() != NoShape) for (int i=0; ikey() case Qt:Key_Left: tryMove(curPiece, curX-1, curY); / 左移 break; case Qt:Key_Right: tryMove(curPiece, curX+1, curY); / 右移 break; case Qt:Key_Up: tryMove(curPiece.rotatedLeft(),curX
17、,curY); / 方塊左轉(zhuǎn) break; case Qt:Key_Down: dropDown(); / 快速下落 break; default: QFrame:keyPressEvent(event); / 計(jì)時(shí)時(shí)間void TetrixBoard:timerEvent(QTimerEvent *event) if (event-timerId() = timer.timerId() / 如果還有方塊已下落完畢 if (isWaitingAfterLine) isWaitingAfterLine = false; / 重標(biāo)記為有方塊正在下落 newPiece(); / 添加新方塊 (tim
18、eoutTime(), this); else oneLineDown(); /否則進(jìn)行下落動(dòng)作 else QFrame:timerEvent(event); / 清空游戲區(qū)所有繪圖void TetrixBoard:clearBoard() for (int i=0; i 0) if (!tryMove(curPiece,curX,newY-1) break; -newY; +dropHeight; / 把下落高度傳遞給此函數(shù) pieceDropped(dropHeight);/ 正常下落操作void TetrixBoard:oneLineDown() if (!tryMove(curPiec
19、e, curX,curY-1) / 如果能移動(dòng),則下落一行 pieceDropped(0);/ 正常下落不幾分/ 進(jìn)行方塊下落后的行為,如繪圖,加分等 參數(shù):下落方塊的高度void TetrixBoard:pieceDropped(int dropHeight) for (int i=0; i= 0; -i) bool lineIsFull = true; / 判斷是否已滿一行 for (int j=0; j BoardWidth; +j) if (shapeAt(j,i)=NoShape) lineIsFull = false; break; / 上面所有行下移 if (lineIsFull
20、) +numFullLines; for(int k = i; k BoardHeight-1; +k) for (int j = 0; j BoardWidth; +j) shapeAt(j,k) = shapeAt(j, k+1); / 整行清零 for (int j = 0; j 0) numLinesRemoved += numFullLines; score += 10 * numFullLines; / 同時(shí)發(fā)送信號(hào)至相應(yīng)的槽 emit linesRemovedChanged(numLinesRemoved); emit scoreChanged(score); (500,this
21、); isWaitingAfterLine = true; curPiece.setShape(NoShape); update(); / 新方塊void TetrixBoard:newPiece() curPiece = nextPiece; / 預(yù)先隨機(jī)設(shè)置好一下塊方塊 nextPiece.setRandomShape(); showNextPiece(); / 設(shè)置其初始下落的位置,在游戲區(qū)頂部中央 curX = BoardWidth / 2 + 1; curY = BoardHeight-1 + curPiece.minY(); / 判斷其是否還能移動(dòng),如果不能,則停止游戲 if (!
22、tryMove(curPiece, curX, curY) curPiece.setShape(NoShape);/ painter.drawText(rect,tr(游戲結(jié)束); timer.stop(); isStarted = false; / 展示下一個(gè)方塊void TetrixBoard:showNextPiece() if (!nextPieceLabel) return; int dx = nextPiece.maxX() - nextPiece.minX() + 1; int dy = nextPiece.maxY() - nextPiece.minY() + 1; QPixm
23、ap pixmap(dx *squareWidth(), dy*squareHeight(); /映射要顯示方塊像素 QPainter painter(&pixmap); / 開始繪制該方塊 painter.fillRect(pixmap.rect(), nextPieceLabel-palette().background(); / 先繪制要顯示方塊的背景色 / 再開始繪制方塊本身 for (int i = 0; i setPixmap(pixmap);/ 最后加載它/ 判斷是否還能移動(dòng)bool TetrixBoard:tryMove(const TetrixPiece &newPiece,
24、 int newX, int newY) for (int i = 0; i 4; +i) int x = newX + newPiece.x(i); int y = newY - newPiece.y(i); if (x = BoardWidth | y = BoardHeight) return false; if (shapeAt(x,y) != NoShape) / 判斷當(dāng)前位置是否有其他方塊 return false; curPiece = newPiece; curX = newX; curY = newY; update(); return true;/ int squareWi
25、dth() return contentsRect().width() / BoardWidth; / int squareHeight() return contentsRect().height() / BoardHeight; void TetrixBoard:drawSquare(QPainter &painter, int x,int y,TetrixShape shape) / google色彩 static const QRgb colorTable8 = 0x000000, 0x1851ce, 0xc61800, 0xefba00, 0x1851ce, 0x1ba823, 0x
26、c61800, 0x606060 ; QColor color = colorTableint(shape); / 填充單元網(wǎng)格的顏色 / void fillRect(int x, int y, int width, int height, const QColor & color) painter.fillRect(x + 1, y + 1, squareWidth() - 2, squareHeight() - 2, color); painter.setPen(color.light(); / 左上角邊框顏色 / void drawLine(int x1, int y1, int x2,
27、 int y2) painter.drawLine(x, y + squareHeight() - 1, x, y); painter.drawLine(x, y, x + squareWidth() - 1, y); painter.setPen(color.dark(); / 右下角邊框顏色 painter.drawLine(x + 1, y + squareHeight() - 1, x + squareWidth() - 1, y + squareHeight() - 1); painter.drawLine(x + squareWidth() - 1, y + squareHeigh
28、t() - 1, x + squareWidth() - 1, y + 1);Tetrixpiece.h頭文件代碼:/ 俄羅斯方塊類:方塊形狀/旋轉(zhuǎn)情況#ifndef TETRIXPIECE_H#define TETRIXPIECE_H/ 定義一個(gè)枚舉類型(0-7):無(wú)形狀、Z字形、S字形、直線形,T字形,田字形形、L字形,翻轉(zhuǎn)L字形enum TetrixShape NoShape, ZShape,SShape,LineShape,TShape,SquareShape, LShape,MirroredLShape ;class TetrixPiecepublic: TetrixPiece()
29、setShape(NoShape); / inline構(gòu)造函數(shù):初始設(shè)置成NoShape void setRandomShape(); / 設(shè)置隨機(jī)規(guī)則 void setShape(TetrixShape shape); / 構(gòu)造方塊形狀的數(shù)據(jù)結(jié)構(gòu) / 通過(guò)inline公有函數(shù)成員shape()訪問(wèn)私有數(shù)據(jù)成員pieceShape TetrixShape shape() const return pieceShape; int x(int index) const return coordsindex0; int y(int index) const return coordsindex1;
30、int minX() const; int maxX() const; int minY() const; int maxY() const; TetrixPiece rotatedLeft() const; / 左轉(zhuǎn)private: void setX(int index, int x) coordsindex0 = x; void setY(int index, int y) coordsindex1 = y; TetrixShape pieceShape; / 枚舉類型創(chuàng)建一個(gè)該枚舉類型對(duì)象 int coords42;#endif / TETRIXPIECE_HTetrixpiece.c
31、pp程序代碼:#include #include tetrixpiece.h#include #include #include / 偽隨機(jī)函數(shù):利用當(dāng)前系統(tǒng)時(shí)間增加隨機(jī)性void TetrixPiece:setRandomShape() /QTime time = QTime:currentTime(); /qsrand( time.msec() + time.second()*1000 );/ 重設(shè)隨機(jī)種子:當(dāng)前時(shí)間為隨機(jī)變量 setShape(TetrixShape(qrand()%7 + 1); / 共六種方塊形狀void TetrixPiece:setShape(TetrixShap
32、e shape) / 按TetrixShape枚舉順序構(gòu)建: / 除NoShape外,每個(gè)形狀由4個(gè)小方塊組成,這里每行的四個(gè)坐標(biāo)即4個(gè)小方塊的坐標(biāo),其中橫向?yàn)閄,縱向?yàn)閅 / ZShape SShape LineShape TShape SquareShape LShape MirroredLShape/ -1 0 1 2 -1 0 1 2 -1 0 1 2 -1 0 1 2 -1 0 1 2 -1 0 1 2 -1 0 1 2/ -1 * -1 * -1 * -1 -1 -1 * * -1 * */ 0 * * 0 * * 0 * 0 * * * 0 * * 0 * 0 */ 1 * 1
33、* 1 * 1 * 1 * * 1 * 1 */ 2 2 2 * 2 2 2 2 static const int coordsTable842 = 0, 0 , 0, 0 , 0, 0 , 0, 0 ,/ NoShape 0, -1 , 0, 0 , -1, 0 , -1, 1 , 0, -1 , 0, 0 , 1, 0 , 1, 1 , 0, -1 , 0, 0 , 0, 1 , 0, 2 , -1, 0 , 0, 0 , 1, 0 , 0, 1 , 0, 0 , 1, 0 , 0, 1 , 1, 1 , -1, -1 , 0, -1 , 0, 0 , 0, 1 , 1, -1 , 0,
34、-1 , 0, 0 , 0, 1 ; for (int i=0; i4; i+) for (int j=0; j2; +j) coordsij = coordsTableshapeij; pieceShape = shape;/ 獲取最小X坐標(biāo)值,QtGlobal:qMinint TetrixPiece:minX() const int min = coords00; for (int i = 1; i 4; +i) min = qMin(min, coordsi0); return min;/ 獲取最大X坐標(biāo)值,QtGlobal:qMaxint TetrixPiece:maxX() cons
35、t int max = coords00; for (int i = 1; i 4; +i) max = qMax(max, coordsi0); return max;/ 獲取最小Y坐標(biāo)值int TetrixPiece:minY() const int min = coords01; for (int i = 1; i 4; +i) min = qMin(min, coordsi1); return min;/ 獲取最大Y坐標(biāo)值int TetrixPiece:maxY() const int max = coords01; for (int i = 0; i 4; +i) max = qMa
36、x(max, coordsi1); return max;/ 按順時(shí)針?lè)较蜃筠D(zhuǎn)90度:/ x = -y;/ y = x;TetrixPiece TetrixPiece:rotatedLeft() const if (pieceShape = SquareShape) return *this; TetrixPiece result; result.pieceShape = pieceShape; for (int i = 0; i 4; +i) result.setX(i,-y(i); result.setY(i,x(i); return result;Tetrixwindow.h頭文件代碼:
37、/ 主窗口類:控制區(qū)/游戲區(qū)#ifndef TETRIXWINDOW_H#define TETRIXWINDOW_H#include #include /* 前向聲明: 因?yàn)榇颂幹皇褂眠@些類的指針,沒(méi)有涉及相關(guān)函數(shù), 并不需要include它們的頭文件,那樣會(huì)減慢編譯速度 */QT_BEGIN_NAMESPACEclass QLCDNumber;class QLabel;class QPushButton;QT_END_NAMESPACEclass TetrixBoard;class TetrixWindow : public QWidget / 這個(gè)宏定義涉及到Qt高級(jí)部分,我們現(xiàn)在只需知道
38、 / tr()connecet()slotssignals與之有關(guān) Q_OBJECTpublic: TetrixWindow();public slots: void About();private: /* 聲明需要用到的一些部件的指針,包括:開始、暫停、退出按鈕, 分?jǐn)?shù)、等級(jí)、消去行數(shù)、下一個(gè)方塊顯示區(qū)等*/ QLabel *createLabel(const QString &text); TetrixBoard *board; / 自定義游戲邏輯類對(duì)象指針 QLabel *nextPieceLabel; QLCDNumber *scoreLcd; QLCDNumber *levelLcd
39、; QLCDNumber *linesLcd; QPushButton *startButton; QPushButton *quitButton; QPushButton *pauseButton; QPushButton *aboutButton;#endif /TETRIXWINDOW_HTetrixwindow.cpp程序代碼:#include #include tetrixboard.h#include tetrixwindow.h/ 構(gòu)造函數(shù):將聲明的抽象部件實(shí)例化TetrixWindow:TetrixWindow() board = new TetrixBoard; / boar
40、d為主游戲區(qū) nextPieceLabel = new QLabel; / Raised:浮雕 Box:draw a box around its contents /nextPieceLabel-setFrameStyle(QFrame:Box | QFrame:Raised); nextPieceLabel-setAlignment(Qt:AlignCenter); / 居中顯示 / 通過(guò)該函數(shù)將nextPieceLabel賦值給board對(duì)象私有變量nextPieceLabel: / 不是友元或繼承關(guān)系無(wú)法直接調(diào)用其私有成員 board-setNextPieceLabel(nextPie
41、ceLabel); / Lcd數(shù)字顯示器 scoreLcd = new QLCDNumber(5); / 最大為5位數(shù) scoreLcd-setSegmentStyle(QLCDNumber:Filled); / 浮雕顯示數(shù)字 (詳見(jiàn)API) levelLcd = new QLCDNumber(5); levelLcd-setSegmentStyle(QLCDNumber:Filled); linesLcd = new QLCDNumber(5); linesLcd-setSegmentStyle(QLCDNumber:Filled); / 按鈕實(shí)例化:設(shè)置為NoFocus,避免與游戲按鍵沖突
42、 startButton = new QPushButton(tr(&開始); startButton-setFocusPolicy(Qt:NoFocus); quitButton = new QPushButton(tr(&退出); quitButton-setFocusPolicy(Qt:NoFocus); pauseButton = new QPushButton(tr(&暫停); pauseButton-setFocusPolicy(Qt:NoFocus); aboutButton = new QPushButton(tr(&關(guān)于); aboutButton-setFocusPolicy(Qt:NoFocus); / 相應(yīng)信號(hào)槽連接Qt核心:QObject:connect(信號(hào)發(fā)射對(duì)象,SIGNAL(信號(hào)),接收對(duì)象,SLOT(觸發(fā)槽) / 信號(hào)(signals):可以只聲明不定義; 觸發(fā)槽(slots):信號(hào)響應(yīng)函數(shù) connect(startButton, SIGNAL(clicked(), board, SLOT(start(); connect(quitButton,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中等教育的文化理解與跨文化交流考核試卷
- 頜面美容外科手術(shù)-顴部美容手術(shù)(美容外科學(xué)課件)
- 木材的市場(chǎng)需求和發(fā)展趨勢(shì)考核試卷
- 人事行政的組織架構(gòu)與設(shè)計(jì)培訓(xùn)優(yōu)化工作流程考核試卷
- 廣告與品牌口碑管理考核試卷
- Salicin-Standard-生命科學(xué)試劑-MCE
- 社區(qū)電商客服述職報(bào)告
- 突然暈倒應(yīng)急處理
- 市場(chǎng)開拓委托合同(4篇)
- 水處理技術(shù)服務(wù)合同(3篇)
- 礦山地質(zhì)環(huán)境保護(hù)和土地復(fù)墾方案 編制規(guī)范指南規(guī)范
- 口腔科醫(yī)療護(hù)理技術(shù)操作規(guī)程版
- 九年級(jí)心理健康教育教案 全冊(cè)
- 在例題與命題研究中實(shí)現(xiàn)教師專業(yè)成長(zhǎng)
- 頭顱CT精美完整課件
- 安全總監(jiān)安全職責(zé)
- 附錄2.1-3培養(yǎng)目標(biāo)達(dá)成度評(píng)價(jià)報(bào)告修改
- 云南白族課件
- 消防應(yīng)急預(yù)案組織結(jié)構(gòu)圖
- 肝衰竭肝功能衰竭
- 油站使用說(shuō)明書
評(píng)論
0/150
提交評(píng)論