Qt开发源码俄罗斯方块.doc
《Qt开发源码俄罗斯方块.doc》由会员分享,可在线阅读,更多相关《Qt开发源码俄罗斯方块.doc(21页珍藏版)》请在三一文库上搜索。
1、俄罗斯方块游戏Main.cpp主程序代码:#include #include #include tetrixwindow.hint main(int argc, char *argv) / 为了能够正常显示中文,设置Tr编码环境为GB2312 (详见wiki) QTextCodec:setCodecForTr(QTextCodec:codecForName(GB2312); / app这个对象用于管理应用级别的资源 QApplication app(argc, argv); app.setStyleSheet(TetrixBoard background-color:lightGray); T
2、etrixWindow window; window.setWindowIcon(QIcon(:/Chrome.ico); window.show(); / 当前时间作为随机种子 qsrand(QTime(0,0,0).secsTo(QTime:currentTime(); return app.exec(); / 程序的事件循环Tetrixboard.h头文件代码:/ 主游戏区类#ifndef TETRIXBOARD_H#define TETRIXBOARD_H#include tetrixpiece.h#include #include #include #include / 前向声明cl
3、ass 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: / 信号:只需声明,根据参数变化来判断 void scoreChanged(i
4、nt score); void levelChanged(int level); void linesRemovedChanged(int numLines);protected: / 着色、键盘、计时事件:其中着色事件随着update()不断触发 void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); void timerEvent(QTimerEvent *event);private: enum BoardWidth = 10, BoardHeight = 22 ; / 把主游戏区宽分成10等份
5、高分成22等份,也就是说每行有10小矩形,总共有22行 TetrixShape &shapeAt(int x, int y) return board(y * BoardWidth) + x; int timeoutTime() return 1000 / (1 + level); / contentsRect():返回当前布局(QLayout)的矩形,可访问其长、宽 (详见API) / conntentsRect().width()/BoardWidth 把游戏区矩形的宽分成了BoardWidth份 int squareWidth() return contentsRect().width
6、) / BoardWidth; / 同上,把高分成了BoardHeight份 int squareHeight() return contentsRect().height() / BoardHeight; / 此时squareWidth(),squareHeight()分别是分割后的小矩形宽和高精选文档 void clearBoard(); / 清屏 void dropDown(); / 下落事件 void oneLineDown();/ 下落一行 void pieceDropped(int dropHeight); void removeFullLines(); / 移除填满的行 voi
7、d newPiece(); / 新方块 void showNextPiece(); / 显示下一个方块 bool tryMove(const TetrixPiece &newPiece, int newX, int newY); / 判断方块是否可以移动 void drawSquare(QPainter &painter, int x, int y, TetrixShape shape); / 着色 QBasicTimer timer; / 相当于QLabel *nextPieceLabel(QPointer详见API) QPointer nextPieceLabel; bool isStar
8、ted; bool isPaused; bool isWaitingAfterLine; TetrixPiece curPiece; / 当前方块 TetrixPiece nextPiece; / 下一个方块 int curX; int curY; int numLinesRemoved; int numPiecesDropped; int score; int level; TetrixShape boardBoardWidth * BoardHeight;#endif / TETRIXBOARD_HTetrixboard.cpp程序代码:#include #include tetrixbo
9、ard.hTetrixBoard:TetrixBoard(QWidget *parent) : QFrame(parent)精选文档 / 设置游戏区框架风格:内浮雕 setFrameStyle(QFrame:Panel | QFrame:Sunken); / 增加游戏区键盘鼠标等事件的焦点集中 setFocusPolicy(Qt:StrongFocus); isStarted = false; / 初始化:未开始状态 isPaused = false; clearBoard(); / 初始清屏 nextPiece.setRandomShape(); / 下一方块获得一个随机形状/ tetrix
10、piece.h : tetrixpiece.cpp中使用void TetrixBoard:setNextPieceLabel(QLabel *label) nextPieceLabel = label;/ 游戏区合适大小QSize TetrixBoard:sizeHint() const return QSize(BoardWidth*15 + frameWidth()*2, BoardHeight*15 + frameWidth()*2);/ 游戏区最小大小QSize TetrixBoard:minimumSizeHint() const return QSize(BoardWidth*5
11、 frameWidth()*2, BoardHeight*5 + frameWidth()*2);/ 开始事件:slotsvoid TetrixBoard:start() / 如果已暂停,则启动无效 if (isPaused) return;精选文档 isStarted = true; / 标记已开始 isWaitingAfterLine = false; / 此参数为判断是否有方块正在下落,false为有方块正在下落中 / 初始各参数 numLinesRemoved = 0; numPiecesDropped = 0; score = 0; level = 1; clearBoard();
12、 / 清屏 / emit 信号发射:触发对应信号槽内的函数(相关connect()在tetrixwindow.cpp中) emit linesRemovedChanged(numLinesRemoved); emit scoreChanged(score); emit levelChanged(level); newPiece(); / 调用新方块 timer.start(timeoutTime(), this);/ 游戏开始计时/ 暂停事件:slotsvoid TetrixBoard:pause() / 如果未开始,则暂停无效 if (!isStarted) return; / 否则,若未暂
13、停,则赋值为暂停,反之,取消暂停,继续游戏 isPaused = !isPaused; if (isPaused) timer.stop(); / 游戏计时停止 else timer.start(timeoutTime(), this); / 否则继续计时 update(); / 刷新窗口:动态显示画面/ 游戏区方块着色精选文档/ 重定义绘图事件,当调用update()时进行重绘void TetrixBoard:paintEvent(QPaintEvent *event) QFrame:paintEvent(event); QPainter painter(this); QRect rect
14、 contentsRect(); / QRect定义了平面上的矩形 (详见API),是主游戏区 / 暂停的时候显示的信息 if (isPaused) painter.drawText(rect, Qt:AlignCenter, tr(游戏暂停); return; / BoardHeight*squareHeight() 相当于 contentsRect().Height(),是小网格的高 / 因为squareHeight() return contentsRect().Width()/BoardWidth(); / 见tetrixboard.h中的定义 int boardTop = rect
15、bottom() - BoardHeight*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() 返回游戏区矩形左边的x坐标,squareWidth()为小网格的宽度 drawSq
16、uare(painter, rect.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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Qt 开发 源码 俄罗斯方块
