|
block.h - #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 :public QObject
- {
- Q_OBJECT
- private:
- int id; //方块的种类
- int x,y; //方块的坐标
- int dir; //方块的方向
- public:
- bool putdown; //判断方块可否再下降
- public:
- Block(QObject *parent=0);
- Block (const Block &obj);
- void OnRotate(); //翻转方块
- void OnLeft(); //方块左移
- void OnDown(); //方块下移
- void OnSink(); //方块沉底
- void OnRight(); //方块右移
- bool ChectBlock(); //检查方块是否可以移动
- void PutBlock(); //放置方块
- friend class BlockGame;
- };
- #endif
block.cpp - #include<QtGui/QtGui>
- #include"block.h"
- 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
- };
- Block::Block(QObject *parent):QObject(parent)
- {
- putdown=false;
- }
- Block::Block(const Block &obj)
- {
- x=obj.x;
- y=obj.y;
- }
- 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 - #ifndef BLOCKGAME_
- #define BLOCKGAME_
- #include <QtGui/QtGui>
- #include "block.h"
- class BlockGame:public QWidget
- {
- Q_OBJECT
- private:
- enum CTRL{ctrl_down,ctrl_up,ctrl_left,ctrl_right,ctrl_default};
- Block g_CurBlock,g_NextBlock;
- 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 - #include<QtGui/QtGui>
- #include"blockgame.h"
- extern int g_Blocks[7][4];
- extern int GameArea[10][15];
- 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(time(NULL));
- 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(g_CurBlock.putdown==true)
- {
- EraseBlock();
- NewBlock();
- g_CurBlock.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 - #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();
- }
这个程序运行几秒钟就会异常结束,不知到怎么回事,请高手帮忙看看!!!
|