Qt写2048游戏
用Qt写2048游戏。
程序功能:
0.游戏的开始按钮、重新开始按钮、规则提示
1.格子的左右移动 WASD
2.数字合并时的计算
3.得分计算
4.每次操作后随机出现2
5.判断游戏是否结束
6.游戏界面
设计思路:
0.对于2048这个4*4棋盘的游戏而言,我们可以设计一个int[4][4],于是直接对数组操作即可。
1.初始化函数,使得得分变为0,格子清空
2.随机函数生成2(检测有没有空的格子,若是有,那么直接生成2,如果没有,那么判断游戏是否结束)
3.格子的绘制paintEvent()
接下来,我们开始吧。
0.新建空项目
1.初始化部分 for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ s[i][j]=0; } } button=new QPushButton("开始游戏"); button->setGeometry(60,400,200,50); //随机种子 qsrand(uint(QTime(0,0,0).secsTo(QTime::currentTime()))); //槽与信号 connect(button,SIGNAL(clicked()),this,SLOT(slotStart()));
2.绘制格子(此处只贴出设置2和0的格子,其余数字(4,8,16,32......)以此类推,改变数字和颜色即可)void MainWindow::PaintEvent(QPaintEvent *) { QPainter p(this); p.setBrush(Qt::blue); p.setFont(QFont("微软雅黑",20,700,false)); //设置字体,颜色 QString strscore; p.drawText(QPoint(20,60),"分数:"+QString::number(score));//显示分数 //绘制格子 for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ p.setPen(Qt::transparent); if(s[i][j]==0){ p.setBrush(Qt::gray); p.drawRect(i*60+40,j*60+120,55,55); } else if (s[i][j]==2){ p.setBrush(QColor(255,250,222,255)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); //在格子中部显示出当前数字,并居中对齐 p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(2),QTextOption(Qt::AlignCenter)); } } } }
3.控制读取键盘,完成数字的移动和相加(此处演示向上移动+相加,左下右以此类推,具体细节见最终源码)void MainWindow::PressUp() { //看上方是否为空格,若是,则上移(注意:此处为整体上移) for(int i=0;i<4;i++){ for(int j=1;j<3;j++){ if(s[i][j]==0) continue; for(int p=0;p #include #include #include #include #include //用来 Debug #include //自定义消息提示框 QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); void paintEvent(QPaintEvent *); void keyPressEvent(QKeyEvent *event); void PressUp(); void PressDown(); void PressLeft(); void PressRight(); void myRand(); QPushButton *button; int s[4][4]; int score=0; bool state; struct Ns{ int i; int j; }; public slots: void slotStart(); //槽函数 private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
main.cpp:#include "mainwindow.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; //显示窗体 w.setFixedSize(320,480); //设置窗体固定的长宽 w.setWindowTitle("2048"); //设置窗体名 w.show(); return a.exec(); }
mainwindow.cpp:#include "MainWindow.h" #include "ui_MainWindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //初始化 for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ s[i][j]=0; } } button = new QPushButton("开始游戏",this); button->setGeometry(60,400,200,50);//从(60,400)做一个200*50的按钮 //随机函数 qsrand(uint(QTime(0,0,0).secsTo(QTime::currentTime()))); connect(button,SIGNAL(clicked()),this,SLOT(slotStart())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::paintEvent(QPaintEvent *) { QPainter p(this); p.setBrush(Qt::blue); p.setFont(QFont("微软雅黑",20,700,false)); QString strscore; p.drawText(QPoint(20,60),"分数: "+QString::number(score)); for (int i=0;i<4;i++) { for (int j=0;j<4;j++) { p.setPen(Qt::transparent);//? if(s[i][j]==0){ p.setBrush(QColor(255,250,222,255)); p.drawRect(i*60+40,j*60+120,55,55); } else if (s[i][j]==2) { p.setBrush(QColor(255,229,168,255)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); //在方块中 绘制Text, 并且文本位置位于中部 p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(2),QTextOption(Qt::AlignCenter)); } else if (s[i][j]==4) { p.setBrush(QColor(255,197,136,255)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(4),QTextOption(Qt::AlignCenter)); } else if (s[i][j]==8) { p.setBrush(QColor(251,179,129,255)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(8),QTextOption(Qt::AlignCenter)); } else if (s[i][j]==16) { p.setBrush(QColor(250,160,99,255)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(16),QTextOption(Qt::AlignCenter)); } else if (s[i][j]==32) { p.setBrush(QColor(251,103,55,255)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(32),QTextOption(Qt::AlignCenter)); } else if (s[i][j]==64) { p.setBrush(QColor(213,92,14,255)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(64),QTextOption(Qt::AlignCenter)); } else if (s[i][j]==128) { p.setBrush(QColor(252,161,159,255)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(128),QTextOption(Qt::AlignCenter)); } else if (s[i][j]==256) { p.setBrush(QColor(248,126,124,147)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(256),QTextOption(Qt::AlignCenter)); } else if (s[i][j]==512) { p.setBrush(QColor(255,50,80,255)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(512),QTextOption(Qt::AlignCenter)); } else if (s[i][j]==1024) { p.setBrush(QColor(188,25,22,255)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(1024),QTextOption(Qt::AlignCenter)); } else if (s[i][j]==2048) { p.setBrush(QColor(245,69,67,15)); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(2048),QTextOption(Qt::AlignCenter)); } else{ p.setBrush(Qt::darkBlue); p.drawRect(i*60+40,j*60+120,55,55); p.setPen(Qt::black); p.setFont(QFont("微软雅黑",10,700,false)); p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(s[i][j]),QTextOption(Qt::AlignCenter)); } } } } void MainWindow::keyPressEvent(QKeyEvent *event) { if(!state){ return ; } switch (event->key()) { case Qt::Key_W: PressUp(); break; case Qt::Key_S: PressDown(); break; case Qt::Key_A: PressLeft(); break; case Qt::Key_D: PressRight(); break; default: return;//忽略其他按钮 } myRand(); update(); } void MainWindow::slotStart(){ QMessageBox::about(this,"游戏规则","WSAD控制方块上下左右移动"); score=0; for (int i=0;i<4;i++) { for (int j=0;j<4;j++) { s[i][j]=0; } } button->setText("重新游戏"); int randi=qrand()%4; int randj=qrand()%4; s[randi][randj]=2; state=true; update(); } void MainWindow::PressUp(){ //移动 for (int i=0;i<4;i++) { for (int j=1;j<4;j++) { if(s[i][j]==0)continue; for (int p=0;p=0;j--) { if(s[i][j]==0)continue; for (int p=3;p>j;p--) { //查看前面是否有空格子可移动 if(s[i][p]==0){ s[i][p]=s[i][j]; s[i][j]=0; break; } } } } //相加 for (int i=0;i<4;i++) { for (int j=3;j>0;j--) { if(s[i][j]==s[i][j-1]){ s[i][j]=2*s[i][j]; s[i][j-1]=0; score+=s[i][j]; for (int p=j-2;p>=0;p--) { s[i][p+1]=s[i][p]; } } } } } void MainWindow::PressLeft(){ //移动 for (int j=0;j<4;j++) { for (int i=1;i<4;i++) { if(s[i][j]==0){ continue; } for (int p=0;p=0;i--) { if(s[i][j]==0){ continue; } for (int p=3;p>i;p--) { //查看前面是否有空格可移入 if(s[p][j] == 0){ s[p][j] = s[i][j]; s[i][j] = 0; break; } } } } //相加 for (int j=0;j<4;j++) { for (int i=3;i>=0;i--) { if(s[i][j]==s[i-1][j]){ s[i][j]=s[i][j]*2; s[i-1][j]=0; score+=s[i][j]; for(int p=i-2;p>=0;p--){ s[p+1][j] = s[p][j]; } } } } } void MainWindow::myRand(){ int i=0,j=0; //找出格子 struct Ns n[15]; int ni=0; for (i=0;i<4;i++) { for (j=0;j<4;j++) { if(s[i][j]==0){ n[ni].i=i; n[ni].j=j; ni++; } } } //判断游戏是否结束 if (ni==0) { for (i=0;i<4;i++) { for (j=0;j<3;j++) { if(s[i][j]==s[i][j+1]){ return; } } } for (j=0;j<4;j++) { for (i=0;i<3;i++) { if(s[i][j]==s[i+1][j]){ return; } } } QMessageBox::about(this,"游戏失败","分数为:"+QString::number(score)+" "); return; } int rand=qrand()%ni; s[n[rand].i][n[rand].j]=2; }
年画之乡滩头古镇直到小学的时候,才知道世界到底有多大。尽管如此,直到初中毕业之前,我都是极少离开滩头镇的,那是我童年生活的全部。虽然今非昔比,但往事如在眼前历历在目。我的出生地,在一个偏僻的小山村
河南这六个刚入选的全国乡村旅游重点村,每一个都不容错过点击右上关注,邀您共同领略探讨中原历史文化,方便下次阅读相关文章,感谢您的支持!10月27日,文旅部发布公示名单,河南6家单位拟入选第四批全国乡村旅游重点村,分别是巩义米河镇明月村
小伙穷游厦门,勇敢攀登光溜溜的日光岩,差点滑了下来幸亏我命大大家好,今天我来到了厦门鼓浪屿的日光岩,这里是鼓浪屿的最高点,海拔92。7米,日光岩的名字由民族英雄郑成功所起,厉害吧。还没登上鼓浪屿,仅仅是在半路的轮船上面,远远望见岛上硕大无比
散文六狗和他的侄儿今年八月十五,是李六苟八十岁的生日,也是他第三十次过生日。与往年生日不同的是,今年的生日,李六苟品尝到了五年珍藏的倒缸酒这是他侄儿专门为他八十大寿提前备好的。聚餐后,身着新衣的李六
许世友的母亲亲手缝寿衣,用血汗钱买棺材,没用过儿子的一分钱在新中国的众多开国将帅中,要说谁的母亲给笔者留下的印象最深刻,非胶东猛将许世友莫属。许世友的母亲行得端坐得正,所以才能培养出许世友这样的好干部好同志。许世友自认为,自己亏欠母亲太多
2000年武汉设计院长移民美国,将家人骗至美国,全家溺亡于地下室有国才有家。这句话从来都不是一句空话。然而,在任何国家总会有那么一群崇洋媚外的人,他们有的人日子过得苦,就要把罪责全部推给国家,有的人日子过得好,却还是觉得外国的月亮更圆。这些人来
平安烟台曾经的烟火气,焕发新生机!烟台这些农贸市场大变样位于牟平区的海德农贸市场大众网海报新闻记者屈晨晨烟台报道为充分展示烟台平安创建成效,提升公众对平安创建活动知晓度,营造平安创建浓厚氛围,近日,平安烟台建设领导小组组织开展2022年
写给焦虑的母亲怎样面对油盐不进的孩子?刚才看头条,一位母亲在哭诉她油盐不进的孩子,我感受到了她的悲痛和无助。突然好想写这篇文章,想帮助同样有困惑的朋友们。因为,我也是母亲,通过大量的学习和实践,现在情况大有好转。希望能
我最喜欢千年银杏树我阅读临泉县2005年编写的第三部临泉县志,在第467页文物遗址第一节,有这样的一段记载公元前1042年,周成王姬诵置沈子国(又称沈国)。沈子国古城遗址在今临泉县城外西侧,居高地,
神秘的量子纠缠对你的父母好一些,才会心想事成财运亨通2022年诺贝尔文学物理学奖颁给了在量子纠缠有重大贡献的三位科学家。量子纠缠用物理学的角度说起来晦涩难懂,用通俗的语言来解释,你和父母是一对量子纠缠体,你的意念和外边世界的某些事物
双11预售开启WiFi万能钥匙全连接服务助推直播带货今年的双11购物节作为年度消费大戏,被寄予了促进消费复苏,提振消费增长的厚望。销售模式上,直播带货依然是各平台C位,直播带货的商家平台和消费者们也都做好了万全准备。拥有WiFi万能