首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

学Qt一个月了,写了超级简陋俄罗斯方块,求鼓励!解决方法

2012-05-03 
学Qt一个月了,写了超级简陋俄罗斯方块,求鼓励!代码:Block.hC/C++ code#ifndef BLOCK_#define BLOCK_#inclu

学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是个勤学苦练的好孩子
[解决办法]
很不错,才学了一个月就能写自己的程序了。我也学习一下!
[解决办法]
这俄罗斯方块,关键是算法的实现,其他都是小问题。
[解决办法]
很不错啊,加油!
[解决办法]
看背景图的路过
[解决办法]
= =厉害
[解决办法]
佩服死了。。
[解决办法]
小伙子 不错啊 好好干
[解决办法]
很不错,才学了一个月就能写自己的程序了。我也学习一下! 
 

[解决办法]
不是程序员的我,虽然看不懂,但还是要赞一个
[解决办法]
好厉害~~
[解决办法]
不错啊。。呵呵
[解决办法]
求详解 我感觉没那么夸张啊

探讨

至少能指出10处规范方面的不足引用:

代码干净整齐,变量名方法名较规范,注释到位。
是我们愿意与其合作的程序员

[解决办法]
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()的区别。

热点排行