学Qt一个月了,写了超级简陋俄罗斯方块,求鼓励!
代码:
Block.h
- C/C++ code
#ifndef BLOCK_#define BLOCK_#include<QtGui/QtGui>#define SIZE 40 //每个方格的单位宽度是20像素#define HEIGHT 15#define WIDTH 10 //定义游戏区的高度和宽度#define X_MIN 0 //最小x坐标#define X_MAX 10 //最大x坐标class BlockGame;class Block{ private: int id; //方块的种类 int x,y; //方块的坐标 int dir; //方块的方向 public: void OnRotate(); //翻转方块 void OnLeft(); //方块左移 void OnDown(); //方块下移 void OnSink(); //方块沉底 void OnRight(); //方块右移 bool ChectBlock(); //检查方块是否可以移动 void PutBlock(); //放置方块 friend class BlockGame;};#endif
Block.cpp
- C/C++ code
#include<QtGui/QtGui>#include"Block.h"#include"BlockGame.h"Block g_CurBlock,g_NextBlock;bool PutDown=false;int GameArea[WIDTH][HEIGHT]={0};int g_Blocks[7][4]={ {0x0f00,0x4444,0x0f00,0x4444},//I {0x0660,0x0660,0x0660,0x0660},//田 {0x4460,0x02e0,0x0622,0x0740},//L {0x2260,0x0e20,0x0644,0x0470},//反L {0x0c60,0x2640,0x0c60,0x2640},//Z {0x0360,0x4620,0x0360,0x4620},//反Z {0x4e00,0x4c40,0x0e40,0x4640} //T };bool Block::ChectBlock(){ int X,Y,i; int b=g_Blocks[id][dir]; for(i=0;i<16;i++) { if(b&0x8000) { X=x+i%4; Y=y+i/4; if(X<X_MIN||X>=X_MAX||GameArea[X][Y]==1||Y>=HEIGHT) return false; } b<<=1; } return true;}void Block::OnRotate(){ int dx; Block temp=*this; temp.dir=(temp.dir+1)%4; if(temp.ChectBlock()==true) {dx=0; goto rotate;} temp.x=x-1; if(temp.ChectBlock()==true) {dx=-1; goto rotate;} temp.x=x+1; if(temp.ChectBlock()==true) {dx=1; goto rotate;} temp.x=x-2; if(temp.ChectBlock()==true) {dx=-2; goto rotate;} temp.x=x+2; if(temp.ChectBlock()==true) {dx=2; goto rotate;} temp.x=x-3; if(temp.ChectBlock()==true) {dx=-3; goto rotate;} temp.x=x+3; if(temp.ChectBlock()==true) {dx=3; goto rotate;} return; rotate: dir=temp.dir; x+=dx;}void Block::OnLeft(){ Block temp=*this; temp.x--; if(temp.ChectBlock()==true) { x--; }}void Block::OnRight(){ Block temp=*this; temp.x++; if(temp.ChectBlock()==true) { x++; }}void Block::OnDown(){ Block temp=*this; temp.y++; if(temp.ChectBlock()==true) { y++; } else { PutBlock(); PutDown=true; }}void Block::PutBlock(){ int X,Y,i; int b=g_Blocks[id][dir]; for(i=0;i<16;i++) { if(b&0x8000) { X=x+i%4; Y=y+i/4; GameArea[X][Y]=1; } b<<=1; }}void Block::OnSink(){ Block temp=*this; temp.y++; while(temp.ChectBlock()==true) { y++; temp.y++; } PutBlock(); PutDown=true;}
BlockGame.h
- C/C++ code
#ifndef BLOCKGAME_#define BLOCKGAME_#include<QtGui/QtGui>enum CTRL{ctrl_down,ctrl_up,ctrl_left,ctrl_right,ctrl_default};class BlockGame:public QWidget{ Q_OBJECT private: CTRL ctrl; bool start; public: BlockGame(QWidget *parent=0); void InitGame(); //初始化游戏界面 void NewGame(); // 新游戏,产生新方块 void DispatchMessage(); //翻译按键消息 void Draw_CurBlock(); //绘制当前方块 void Draw_NextBlock(); //绘制下一个方块 void NewBlock(); //产生新的方块 void RenewGameArea(); //更新游戏区,显示已落下的方块 void EraseBlock(); //擦除要消掉的方块 protected: void paintEvent(QPaintEvent *paintevent); void timerEvent(QTimerEvent *timerevent); void keyPressEvent(QKeyEvent *keyevent);};#endif
BlockGame.cpp
- C/C++ code
#include<QtGui/QtGui>#include"BlockGame.h"#include"Block.h"extern Block g_CurBlock;extern Block g_NextBlock;extern int g_Blocks[7][4];extern int GameArea[10][15];extern bool PutDown;//判断方块可否再下降BlockGame::BlockGame(QWidget *parent):QWidget(parent){ start=true; ctrl=ctrl_default; resize(630,600); startTimer(500); NewGame();}void BlockGame::NewBlock(){ g_CurBlock.id=g_NextBlock.id; g_CurBlock.dir=g_NextBlock.dir; g_CurBlock.x=X_MIN+2; g_CurBlock.y=0; g_NextBlock.id=qrand()%7; g_NextBlock.dir=qrand()%4;}void BlockGame::NewGame(){ qsrand(2); g_NextBlock.id=qrand()%7; g_NextBlock.dir=qrand()%4; g_NextBlock.x=X_MAX+1; g_NextBlock.y=1; NewBlock();}void BlockGame::Draw_CurBlock(){ int x,y,i; int X=g_CurBlock.x,Y=g_CurBlock.y; int block=g_Blocks[g_CurBlock.id][g_CurBlock.dir]; QPainter painter(this); QBrush brush(QColor(255,10,110)); painter.setBrush(brush); for(i=0;i<16;i++) { if(block&0x8000) { x=X+i%4; y=Y+i/4; painter.drawRect(x*SIZE,y*SIZE,SIZE,SIZE); } block<<=1; }}void BlockGame::Draw_NextBlock(){ int x,y,i; int X=g_NextBlock.x,Y=g_NextBlock.y; int block=g_Blocks[g_NextBlock.id][g_NextBlock.dir]; QPainter painter(this); QBrush brush(QColor(120,200,110)); painter.setBrush(brush); for(i=0;i<16;i++) { if(block&0x8000) { x=X+i%4; y=Y+i/4; painter.drawRect(x*SIZE,y*SIZE,SIZE,SIZE); } block<<=1; }}void BlockGame::InitGame(){ QPainter painter(this); QPen pen1(Qt::blue,3); QBrush brush(QColor(110,10,30)); QRect rect1(0,0,400,600),rect2(410,0,210,220),rect3(410,250,210,340); QImage image(tr("bg.jpg")); painter.drawImage(rect1,image); painter.setPen(pen1); painter.drawRect(rect1); painter.setBrush(brush); painter.drawRect(rect2); painter.drawRect(rect3); QPen pen2(Qt::black,1); painter.setPen(pen2); for(int j=0;j<HEIGHT;j++) painter.drawLine(0,j*SIZE,WIDTH*SIZE,j*SIZE); for(int j=0;j<WIDTH;j++) painter.drawLine(j*SIZE,0,j*SIZE,HEIGHT*SIZE); painter.drawText(rect3,tr("WELCOME TO PLAYING BLOCK GAME!"));}void BlockGame::DispatchMessage(){ switch(ctrl) { case ctrl_up:g_CurBlock.OnRotate();break; case ctrl_down:g_CurBlock.OnSink();break; case ctrl_left:g_CurBlock.OnLeft();break; case ctrl_right:g_CurBlock.OnRight();break; default:g_CurBlock.OnDown();break; } ctrl=ctrl_default;}void BlockGame::paintEvent(QPaintEvent *paintevent){ InitGame(); RenewGameArea(); Draw_CurBlock(); Draw_NextBlock();}void BlockGame::timerEvent(QTimerEvent *timerevent){ DispatchMessage(); if(PutDown==true) { EraseBlock(); NewBlock(); PutDown=false; } update();}void BlockGame::keyPressEvent(QKeyEvent *keyevent){ switch(keyevent->key()) { case Qt::Key_Up:ctrl=ctrl_up;break; case Qt::Key_Down:ctrl=ctrl_down;break; case Qt::Key_Left:ctrl=ctrl_left;break; case Qt::Key_Right:ctrl=ctrl_right;break; default:ctrl=ctrl_default;break; }}void BlockGame::EraseBlock(){ int i,j,k,n,Y; int row[4]={0}; bool bRow=false; Y=g_CurBlock.y; for(j=Y;j<Y+4;j++) { n=0; for(i=0;i<X_MAX;i++) { if(GameArea[i][j]==1) n++; } if(n==WIDTH) { bRow=true; row[j-Y]=1; } } if(bRow==true) { for(k=0;k<4;k++) { if(row[k]==1) { for(j=Y+k;j>0;j--) for(i=0;i<X_MAX;i++) { GameArea[i][j]=GameArea[i][j-1]; GameArea[i][j-1]=0; } } } }}void BlockGame::RenewGameArea() { int i,j; QPainter painter(this); QBrush brush(QColor(100,120,155)); QRect rect; painter.setBrush(brush); for(j=0;j<HEIGHT;j++) for(i=0;i<X_MAX;i++) { rect.setRect(i*SIZE,j*SIZE,SIZE,SIZE); if(GameArea[i][j]==1) painter.drawRect(rect); }}
main.cpp
- C/C++ code
#include<QtGui/QtGui>#include"Block.h"#include"BlockGame.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); BlockGame mygame; mygame.show(); return a.exec();}
[解决办法]
upup,谢谢分享。
[解决办法]
厉害,我连俄罗斯方块都写不出来
[解决办法]
代码干净整齐,变量名方法名较规范,注释到位。
是我们愿意与其合作的程序员
[解决办法]
对不起 我不是程序员
我只关心 背景图 这才是亮点
[解决办法]
这不是Qt 感觉楼主在用MFC的方法 一点都没有用到Qt特有的东西
[解决办法]
不如用消方块来给美女脱衣服吧...
[解决办法]
支持一下
[解决办法]
有兴趣
[解决办法]
真心不错啊
[解决办法]
不错,赞一个。
[解决办法]
一个月也不错了
[解决办法]
xcbcvnbcvnvnvbn[color=#FF0000][/color]
[解决办法]
楼主能不能发个帖子,把编辑的过程有图贴出来啊?很想学习一下。 还有楼主看的什么参考书籍呢?能否推荐一下啊?
[解决办法]
背景图 这才是亮点
[解决办法]
不错。。。。
[解决办法]
赞一个!
[解决办法]
不错哦~
[解决办法]
自己也啥都原创不出来,只会拷贝+粘贴
[解决办法]
楼主已经很有基础了,深入学习就是高手了。
[解决办法]
至少能指出10处规范方面的不足
[解决办法]
不错,谢谢分享!!!!
[解决办法]
强烈支持楼主!
[解决办法]
不错,支持
[解决办法]
模块和背景换一下会更好~ 这样堆满的时候就能看到姑娘~
[解决办法]
[解决办法]
这才是亮点
[解决办法]
强烈支持楼主!
[解决办法]
还好了
------解决方案--------------------
great!
[解决办法]
可怜我不会c++
[解决办法]
很好,我用MFC写过一个
[解决办法]
谢谢楼主分享
[解决办法]
才学一个月就能自己写了,强阿
[解决办法]
LZ是个勤学苦练的好孩子
[解决办法]
很不错,才学了一个月就能写自己的程序了。我也学习一下!
[解决办法]
这俄罗斯方块,关键是算法的实现,其他都是小问题。
[解决办法]
很不错啊,加油!
[解决办法]
看背景图的路过
[解决办法]
= =厉害
[解决办法]
佩服死了。。
[解决办法]
小伙子 不错啊 好好干
[解决办法]
很不错,才学了一个月就能写自己的程序了。我也学习一下!
[解决办法]
不是程序员的我,虽然看不懂,但还是要赞一个
[解决办法]
好厉害~~
[解决办法]
不错啊。。呵呵
[解决办法]
求详解 我感觉没那么夸张啊
[解决办法]
nb
[解决办法]
学了一个月,就能搞个这出来,打击人不是~~~~~~~~~~~~~~~~~~
[解决办法]
做得真不错,支持
[解决办法]
有java写的版本么
[解决办法]
为什么你有方块的地方还有桌板的分割线,我用winAPI写的时候俄罗斯方块下落时,将分割线都擦出了!
[解决办法]
块每下落一个都要重绘分割线,你设置 InvalidateRect(HWND,NULL,TRUE),每次重绘将以前的全部擦除。
然后重新绘制分割
[解决办法]
鼓掌!!!很好啊,加油啊!!
[解决办法]
厉害啊 牛X啊
[解决办法]
背景给力啊!!!!!!!!!!!!!!!!!!
[解决办法]
我要分数可以不
[解决办法]
支持楼主,目前我还只会helloword,qt是啥都不知道。。
[解决办法]
支持下,我也想学qt
[解决办法]
支持下,我也想学qt
[解决办法]
没必要放个美女 吸引我把
------解决方案--------------------
[解决办法]
大多把注意力都集中在美女身上,无心看代码。
[解决办法]
上个月我也在写,但等我写得差不多的时候(只差做旋转的功能了),发现数据结构设计得不行,旋转的算法不好弄了。我用C写的,悲剧。
[解决办法]
这让我想起大学时候,用过汇编指令弄过,运行在DOS全屏模式下。。
[解决办法]
[解决办法]
写得好。不错,顶顶!!!!
[解决办法]
写得好必须鼓励的啊
[解决办法]
才一个月,很好了
[解决办法]
呵呵,楼主钱途无量啊。。。
[解决办法]
赞一个!
[解决办法]
赶上末班车了
[解决办法]
我在VC 6.0上运行,为什么显示fatal error C1083: Cannot open include file: 'QtGui/QtGui': No such file or directory...这样的错误?求大牛指教
[解决办法]
不错啊
[解决办法]
LZ一个月就搞出这程序,很厉害了!
[解决办法]
很简练的代码,让人一看就明了,另求goto与pack()的区别。