用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<j;p++){
if(s[i][j]==0){
s[i][p]=s[i][j];
s[i][j]=0;
break;
}
}
}
}
//相加并移动
for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
if(s[i][j]==s[i][j+1]){
s[i][j+1]=2*s[i][j];
s[i][j]=0;
score+=s[i][j];
for(int p=j+2;p<4;p++){
s[i][p-1]=s[i][p];
}
}
}
}
}
4.随机生成2,判断游戏