这篇文章主要为大家详细介绍了Qt实现俄罗斯方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了Qt实现俄罗斯方块,供大家参考,具体内容如下
最近在学习Qt,用它来进行图形界面的开发还是很方便的,想着做一个小游戏来锻炼一下自己,就想到了小时候玩的俄罗斯方块。折腾了一段时间,虽然界面做的不美观,但是总算是实现了基本的功能。
首先我写了一个俄罗斯方块的类Tetris,通过这个类来进行这个游戏的数据的处理;然后游戏窗口是继承的QWidget类,用来显示游戏的方块;“下一个方块”窗口也是继承的QWidget类,用来显示下一个方块;控制提示和分数的显示用的QLabel。然后将将这些控件整合到继承自QMainWindow的mainWindow类。运行的结果如下:
Tetris类:一共有7中不同形状的方块(如下图),每个方块由四个方格组成,Block结构体用来存储方块的方格坐、中心方格坐标、ID等数据,移动中的方块和下移个方块都是通过这个结构体来操作的;已经落下的方块的方格存储在二维数组box[][]中,x坐标从左到右为正方向,y坐标从上到下为正方向(如下图)。
项目源文件
- tetris.h
- tetris.cpp
- tetrisbox.h
- tetrisbox.cpp
- nexttetris.h
- nexttetris.cpp
- mainwindow.h
- mainwindow.cpp
tetris.h
#ifndef TETRIS_H #define TETRIS_H //为了获得随机数 #include #include #define MAXX 10 //显示窗口的横向格数 #define MAXY 20 //显示窗口的竖向格数 #define NEXTMAXX 6 //“下一个”显示窗口的横向格数 #define NEXTMAXY 6 //“下一个”显示窗口的竖向格数 #define WIDTH 30 //单格的宽度 #define HEIGHT 30 //单格的高度 #define INTERVAL 4 //单格之间的间隔 #define COUNT 4 //每个方块的格数 //Block结构体:一个方块 struct Block { int x[COUNT]; //方块单格的x坐标 int y[COUNT]; //方块单格的y坐标 int centerX; //方块的中心x坐标 int centerY; //方块的中心y坐标 int ID; //方块的ID }; class Tetris { public: Tetris(); void createBlock(); //创建当前方块 Block getNextBlock(); //获得下一个方块 Block getBlock(); //获得当前方块 int getScore(); //获得分数 int getBox(int x, int y); //获得相应坐标的状态 bool rotate(); //旋转 bool moveToLeft(); //向左移动 bool moveToRight(); //向右移动 bool moveToBottom(); //向下移动 bool isEnd(); //判断是否结束 void killLines(); //消去整行 void clear(); //重新初始化 static int getWidth(); //获得窗口的宽度 static int getHeight(); //获得窗口的高度 static int getNextWi<div style="color:transparent">来源gaodai.ma#com搞#代!码网</div>dth(); //获得“下一个”窗口的宽度 static int getNextHeight(); //获得“下一个”窗口的高度 private: void createNextBlock(); //创建下一个方块 bool move(int dx, int dy); //是否可以移动 void blockToBox(); //将block中的数据转移到box中 bool isRotatable(); //是否可以旋转 int getFirstFullLine(); //获得第一个整行 private: int score; //分数 Block block; //当前方块 Block nextBlock; //下一个方块 int box[MAXX][MAXY];//方格的坐标系 1表示右方格,0表示没有方格 }; #endif // TETRIS_H
Tetris.cpp
#include "tetris.h" Tetris::Tetris() { //初始化随机数发生器 srand(unsigned(time(NULL))); //初始化成员变量 score = 0; for (int i = 0; i <MAXX; i++) { for (int j = 0; j <MAXY; j++) { box[i][j] = 0; } } for (int i = 0; i <COUNT; i++) { block.x[i] = -1; block.y[i] = -1; } block.centerX = -1; block.centerY = -1; block.ID = 0; //创建下一个方块 createNextBlock(); } //创建当前方块 //将上一次生成的下一个方块nextBlock复制给block //并创建下一个nextBlock void Tetris::createBlock() { //nextBlock复制给block for (int i = 0; i <COUNT; i++) { block.x[i] = nextBlock.x[i]; block.y[i] = nextBlock.y[i]; } block.centerX = nextBlock.centerX; block.centerY = nextBlock.centerY; block.ID = nextBlock.ID; //创建下一个nextblock createNextBlock(); } //返回下一个方块 Block Tetris::getNextBlock() { return nextBlock; } //返回当前方块 Block Tetris::getBlock() { return block; } //返回当前分数 int Tetris::getScore() { return score; } //返回坐标(x,y)的值,以判断是否右方格 int Tetris::getBox(int x, int y) { return box[x][y]; } //旋转当前方块 //旋转成功返回true,否则返回false bool Tetris::rotate() { if (isRotatable()) { return true; } else { return false; } } //将当前方块向左移动一格 //成功返回true,否则返回false bool Tetris::moveToLeft() { if (move(-1, 0)) { return true; } else { return false; } } //将当前方块向右移动一格 //成功返回true,否则返回false bool Tetris::moveToRight() { if (move(1, 0)) { return true; } else { return false; } } //将方块向下移动一格 //成功返回true, 游戏结束返回false bool Tetris::moveToBottom() { if (!move(0, 1)) { //移动不成功 blockToBox(); //将当前方块复制到box中 killLines(); //消行 //判断是否结束 //否则创建新的方块 if(isEnd()) { return false; } else { createBlock(); } } return true; } //判断游戏是否结束 //结束条件为第一行有方格 bool Tetris::isEnd() { int j = 0; for (int i = 0; i 0; j--) { for (int i = 0; i <MAXX; i++) { box[i][j] = box[i][j-1]; } } count++; } //消行的分数奖励 score += count * count * 10; } //对成员变量进行初始化,重新开始游戏 void Tetris::clear() { //初始化 score = 0; srand(unsigned(time(NULL))); for (int i = 0; i <MAXX; i++) { for (int j = 0; j <MAXY; j++) { box[i][j] = 0; } } for (int i = 0; i <COUNT; i++) { block.x[i] = -1; block.y[i] = -1; } block以上就是Qt实现俄罗斯方块的详细内容,更多请关注gaodaima搞代码网其它相关文章!