• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Qt实现俄罗斯方块

qt 搞代码 4年前 (2022-01-06) 52次浏览 已收录 0个评论

这篇文章主要为大家详细介绍了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搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Qt实现俄罗斯方块

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址