众所周知……在雷课堂后大部分人都掌握了QT界面的能力。 本着浪费人生与无聊写游戏的宗旨,我决定用QT写一个2048玩玩。(以后可能还会更新黑白棋和五子棋哟!) 那么2048其实难度不大,主要考虑几个点,一个是刷新,需要随机更新2或4,一个是堆叠和合并,因为堆叠过程中由于可能出现一行4个2这些情况,所以合并后要再次堆叠。于是乎,首先需要一个游戏界面,一个游戏核心类,外加一个主界面。所以QT先是把Mainwindow设计好,然后处理游戏。 在这过程中还要进行打分,并且还自带了log类似的功能。 先看看总体是这样! 那么再看看核心类 gamecore.h
class gamecore { public: gamecore(); //构造函数 ~gamecore(); //析构函数 void RESET(); //初始化棋盘 int judgewin(); //分析是否胜利,返回值为1则胜利,0则未胜利,2则输 bool push(char x); //推动数字,若能推动则堆叠并返回1,否则返回0表示无法堆叠 bool mix(char x); //将可能可合并的数字合并 void create(); //随机生成一个数字在空白区域,可能为2或4 int getcurrentscore();//获取当前分数 int gethighestscore();//获取当前最高分 bool savetodata(); //保存游戏 int board[4][4]; //棋盘 private: int highest_score; //记录历史最高分 int current_score; //记录当前分数 QString situation; //记录游戏情况,类似于log }; #endif // GAMECORE_Hgamecore.cpp
#include "gamecore.h" #include <QTime> gamecore::gamecore() //构造函数 { highest_score = 0; //每次游戏必须初始化 current_score = 0; for(int i = 0;i<4;i++) { for(int j = 0;j<4;j++) { board[i][j] = 0; //初始化棋盘 } } board[0][1] = 2; //一开始只能先这样凑合 board[2][2] = 2; situation = "Player starts playing\n"; } gamecore::~gamecore() //析构函数 { } void gamecore::RESET() //初始化棋盘,随便找两个位置弄数字 { int n,n1,n2; int i,j; for( i = 0;i<4;i++) { for( j = 0;j<4;j++) { board[i][j] = 0; //初始化棋盘 } } QTime t; t=QTime::currentTime(); qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime())); n=qrand()%255; //获取0~255的数字 n1 = n%16; n2 = n/16; if(n1 == n2) { board[n1/4][n1%4] = 2; board[n2/4+1][n2%4+1] = 2; } else { board[n1/4][n1%4] = 2; board[n2/4][n2%4] = 2; } current_score = 0; //现有分数也刷新为0 situation += "player restart game\n"; } int gamecore::judgewin() //分析是否胜利,返回值为1则胜利,0则未胜利,2则输 { int judge = 2; for(int i = 0;i<4;i++) { for(int j = 0;j<4;j++) { if(board[i][j] == 2048) { judge = 1; situation += "the player win!!!\n\n\n"; //先看有没有赢 return judge; } } } for(int i = 0;i<4;i++) //再看有没有空位 { for(int j = 0;j<4;j++) { if(board[i][j] == 0) { judge = 0; return judge; } } } //没有空位,看看有没有相邻相同的,这里用镜像棋盘 int mirror[6][6]; for(int i = 0;i<6;i++) { for(int j = 0;j<6;j++) { mirror[i][j] = -100; //初始化为负数 } } for(int i = 1;i<5;i++) { for(int j = 1;j<5;j++) { mirror[i][j] = board[i-1][j-1]; //心部分赋值 } } for(int i = 1;i<5;i++) //如果内部四块存在相邻相同 { for(int j = 1;j<5;j++) { if(mirror[i][j] == mirror[i+1][j] || mirror[i][j] == mirror[i-1][j] || mirror[i][j] == mirror[i][j-1] || mirror[i][j] == mirror[i][j+1]) { judge = 0; //可继续游戏 return judge; } } } //否则肯定输了 situation += "the player lose……\n\n\n"; return judge; } /******************************************************************* 【函数】push 【功能】按玩家指示方向推动数字并堆叠在一起 【参数】WASD 【返回值】若能推动则堆叠并返回1,否则返回0表示无法堆叠 【开发者】NEO 【修改记录】 ************************************************************************/ bool gamecore::push(char x) { int i,j,k; bool judge = false; if(x == 'W') { for(i = 1;i<4;i++) { for(j = 0;j<4;j++) { if(board[i][j]!= 0) { if(board[i-1][j] != 0) { continue; } for(k = i-1;k>=0;k--) { if(board[k][j] != 0 && k != i-1) //往上看,若出现一个不为0的,且不是贴着的 { board[k+1][j] = board[i][j]; //移动到它下方 board[i][j] = 0; judge = true; break; } else if(board[k][j] == 0 && k == 0) //如果上面都空的 { board[k][j] = board[i][j]; //移动到顶部 board[i][j] = 0; judge = true; break; } } } } } situation += "player pressed W\n"; return judge; } else if(x == 'S') { for(i = 2;i>=0;i--) { for(j = 0;j<4;j++) { if(board[i][j] != 0) { if(board[i+1][j] != 0) { continue; } for(k = i+1;k<4;k++) { if(board[k][j] != 0 && k != i+1) //往下看,若出现一个不为0的,且不是贴着的 { board[k-1][j] = board[i][j]; //移动到它上方 board[i][j] = 0; judge = true; break; } else if(board[k][j] == 0 && k == 3) //如果下面都空的 { board[k][j] = board[i][j]; //移动到底部 board[i][j] = 0; judge = true; break; } } } } } situation += "player pressed S\n"; return judge; } else if(x == 'A') { for(j = 1;j<4;j++) { for(i = 0;i<4;i++) { if(board[i][j] != 0) { if(board[i][j-1] != 0) { continue; } for(k = j-1;k>=0;k--) { if(board[i][k] != 0 && k != j-1) //往左看,若出现一个不为0的,且不是贴着的 { board[i][k+1] = board[i][j]; //移动到它右方 board[i][j] = 0; judge = true; break; } else if(board[i][k] == 0 && k == 0) //如果左面都空的 { board[i][k] = board[i][j]; //移动到左底部 board[i][j] = 0; judge = true; break; } } } } } situation += "player pressed A\n"; return judge; } else if(x == 'D') { for(j = 2;j >= 0;j--) { for(i = 0;i<4;i++) { if(board[i][j] != 0) { if(board[i][j+1] != 0) { continue; } for(k = j+1;k<4;k++) { if(board[i][k] != 0 && k != j+1) //往右看,若出现一个不为0的,且不是贴着的 { board[i][k-1] = board[i][j]; //移动到它左方 board[i][j] = 0; judge = true; break; } else if(board[i][k] == 0 && k == 3) //如果右面都空的 { board[i][k] = board[i][j]; //移动到右底部 board[i][j] = 0; judge = true; break; } } } } } situation += "player pressed D\n"; return judge; } return false; //如果if语句不进一定false } bool gamecore::mix(char x) //将可能可合并的数字合并 { int i,j; bool judge = false; switch(x) { case 'W': for(i = 1; i < 4; i++) { for(j = 0; j < 4; j++) { if(board[i][j] != 0) //如果发现非空 { if(board[i][j] == board[i-1][j]) //若相邻上面有数字可合并 { board[i-1][j] = board[i][j] * 2;//合并 board[i][j] = 0; //原位置空 current_score += board[i-1][j]; //当前分数更新 if(highest_score<current_score) //如果最高分低于当前分数,则更新 { highest_score = current_score; } judge = true; } } } } push('W'); //最后再推一下防止出现三个四个同数字情况 break; case 'S': for(i = 3; i >=0; i--) { for(j = 0; j < 4; j++) { if(board[i][j] != 0) //如果发现非空 { if(board[i][j] == board[i+1][j]) //若相邻下面有数字可合并 { board[i+1][j] = board[i][j] * 2;//合并 board[i][j] = 0; //原位置空 current_score += board[i+1][j]; //当前分数更新 if(highest_score<current_score) //如果最高分低于当前分数,则更新 { highest_score = current_score; } judge = true; } } } } push('S'); //最后再推一下防止出现三个四个同数字情况 break; case 'A': for(i = 0; i <4; i++) { for(j = 1; j < 4; j++) { if(board[i][j] != 0) //如果发现非空 { if(board[i][j] == board[i][j-1]) //若相邻左面有数字可合并 { board[i][j-1] = board[i][j] * 2; //合并 board[i][j] = 0; //原位置空 current_score += board[i][j-1]; //当前分数更新 if(highest_score<current_score) //如果最高分低于当前分数,则更新 { highest_score = current_score; } judge = true; } } } } push('A'); //最后再推一下防止出现三个四个同数字情况 break; case 'D': for(i = 0; i <4; i++) { for(j = 3; j >= 0; j--) { if(board[i][j] != 0) //如果发现非空 { if(board[i][j] == board[i][j+1]) //若相邻右面有数字可合并 { board[i][j+1] = board[i][j] * 2;//合并 board[i][j] = 0; //原位置空 current_score += board[i][j+1]; //当前分数更新 if(highest_score<current_score) //如果最高分低于当前分数,则更新 { highest_score = current_score; } judge = true; } } } } push('D'); //最后再推一下防止出现三个四个同数字情况 break; } return judge; } void gamecore::create() //随机生成一个数字在空白区域,可能为2或4 { int i,j,k = 0; int loc; int location[16] = {0}; for(i = 0;i<4;i++) { for(j = 0;j<4;j++) { if(board[i][j] == 0) { location[k] = i*4+j; k++; } } } if(k == 1) { loc = location[0]; } else { QTime t; t = QTime::currentTime(); qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime())); loc = qrand()%(k-1); //获取0~k-1的随机数 loc = location[loc]; } k = qrand()%3; //获取0~3的随机数 if(k == 0 || k == 1) { board[loc/4][loc%4] = 2; } else if(k == 2 || k == 3) { board[loc/4][loc%4] = 4; } } bool gamecore::savetodata() //保存游戏记录 { QString time = "游戏结束时间:"; QDateTime dat; time += dat.currentDateTime().toString("yyyy-MM-dd HH-mm-ss"); bool opx = false; QString fileName = time + "游戏日志.txt"; QFile file(fileName); opx = file.open(QIODevice::WriteOnly | QIODevice::Append); if(!opx) { return opx; } QTextStream in(&file); in<<situation; file.close(); return true; } int gamecore::getcurrentscore()//获取当前分数 { situation += "current score is " + QString::number(current_score) + "\n"; return current_score; } int gamecore::gethighestscore()//获取当前最高分 { situation += "the highest score is " + QString::number(highest_score) + "\n"; return highest_score; }emmm是不是非常浅显易懂。 对于玩游戏的play界面,主要问题一个是显示,要把board上的数字显示到QLabel上,同时还要把颜色标清楚,所以有点麻烦(超级麻烦 但感谢我健壮有力的肝和搬砖的决心,即使不知道怎么ui传参,我也硬怼出来了 下面放上我惨不忍睹的代码……○| ̄|_ play.h
#ifndef PLAY_H #define PLAY_H #include <QWidget> #include <QObject> #include "gamecore.h" /*********************************************************** 【函数】showing用于把镜像数组board显示到label上给玩家看 *************************************************************/ namespace Ui { class play; } class play : public QWidget { Q_OBJECT public: explicit play(QWidget *parent = nullptr); ~play(); void showing(); //展示到label上 void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event); private slots: void on_exit_clicked(); void on_restart_clicked(); private: Ui::play *ui; gamecore *p; //游戏核心的指针 bool move; //判断玩家是否按下任何按键,为真则不能接受其它按键 }; #endif // PLAY_Hplay.cpp
#include "play.h" #include "ui_play.h" #include <QKeyEvent> #include <synchapi.h> #include <QMessageBox> play::play(QWidget *parent) : QWidget(parent), ui(new Ui::play) { ui->setupUi(this); gamecore *game = new gamecore(); p = game; move = false; } play::~play() { delete ui; } void play::on_exit_clicked() { if(QMessageBox::Yes == QMessageBox::question(this,QStringLiteral("2048"),QStringLiteral("Do you really want to exit?"),QMessageBox::Yes | QMessageBox:: No)) { p->savetodata(); this->close(); delete ui; return; } else { return; } } void play::showing() //展示到label上 { if(p->board[0][0] == 0) { ui->AA->setText(nullptr); ui->AA->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[0][0] == 2) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[0][0] == 4) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[0][0] == 8) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[0][0] == 16) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[0][0] == 32) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[0][0] == 64) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[0][0] == 128) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[0][0] == 256) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[0][0] == 512) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[0][0] == 1024) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[0][0] == 2048) { ui->AA->setNum(p->board[0][0]); ui->AA->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[0][1] == 0) { ui->AB->setText(nullptr); ui->AB->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[0][1] == 2) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[0][1] == 4) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[0][1] == 8) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[0][1] == 16) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[0][1] == 32) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[0][1] == 64) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[0][1] == 128) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[0][1] == 256) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[0][1] == 512) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[0][1] == 1024) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[0][1] == 2048) { ui->AB->setNum(p->board[0][1]); ui->AB->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[0][2] == 0) { ui->AC->setText(nullptr); ui->AC->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[0][2] == 2) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[0][2] == 4) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[0][2] == 8) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[0][2] == 16) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[0][2] == 32) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[0][2] == 64) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[0][2] == 128) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[0][2] == 256) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[0][2] == 512) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[0][2] == 1024) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[0][2] == 2048) { ui->AC->setNum(p->board[0][2]); ui->AC->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[0][3] == 0) { ui->AD->setText(nullptr); ui->AD->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[0][3] == 2) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[0][3] == 4) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[0][3] == 8) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[0][3] == 16) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[0][3] == 32) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[0][3] == 64) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[0][3] == 128) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[0][3] == 256) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[0][3] == 512) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[0][3] == 1024) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[0][3] == 2048) { ui->AD->setNum(p->board[0][3]); ui->AD->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[1][0] == 0) { ui->BA->setText(nullptr); ui->BA->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[1][0] == 2) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[1][0] == 4) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[1][0] == 8) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[1][0] == 16) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[1][0] == 32) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[1][0] == 64) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[1][0] == 128) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[1][0] == 256) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[1][0] == 512) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[1][0] == 1024) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[1][0] == 2048) { ui->BA->setNum(p->board[1][0]); ui->BA->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[1][1] == 0) { ui->BB->setText(nullptr); ui->BB->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[1][1] == 2) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[1][1] == 4) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[1][1] == 8) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[1][1] == 16) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[1][1] == 32) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[1][1] == 64) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[1][1] == 128) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[1][1] == 256) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[1][1] == 512) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[1][1] == 1024) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[1][1] == 2048) { ui->BB->setNum(p->board[1][1]); ui->BB->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[1][2] == 0) { ui->BC->setText(nullptr); ui->BC->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[1][2] == 2) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[1][2] == 4) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[1][2] == 8) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[1][2] == 16) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[1][2] == 32) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[1][2] == 64) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[1][2] == 128) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[1][2] == 256) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[1][2] == 512) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[1][2] == 1024) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[1][2] == 2048) { ui->BC->setNum(p->board[1][2]); ui->BC->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[1][3] == 0) { ui->BD->setText(nullptr); ui->BD->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[1][3] == 2) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[1][3] == 4) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[1][3] == 8) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[1][3] == 16) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[1][3] == 32) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[1][3] == 64) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[1][3] == 128) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[1][3] == 256) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[1][3] == 512) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[1][3] == 1024) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[1][3] == 2048) { ui->BD->setNum(p->board[1][3]); ui->BD->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[2][0] == 0) { ui->CA->setText(nullptr); ui->CA->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[2][0] == 2) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[2][0] == 4) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[2][0] == 8) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[2][0] == 16) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[2][0] == 32) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[2][0] == 64) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[2][0] == 128) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[2][0] == 256) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[2][0] == 512) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[2][0] == 1024) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[2][0] == 2048) { ui->CA->setNum(p->board[2][0]); ui->CA->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[2][1] == 0) { ui->CB->setText(nullptr); ui->CB->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[2][1] == 2) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[2][1] == 4) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[2][1] == 8) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[2][1] == 16) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[2][1] == 32) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[2][1] == 64) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[2][1] == 128) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[2][1] == 256) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[2][1] == 512) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[2][1] == 1024) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[2][1] == 2048) { ui->CB->setNum(p->board[2][1]); ui->CB->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[2][2] == 0) { ui->CC->setText(nullptr); ui->CC->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[2][2] == 2) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[2][2] == 4) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[2][2] == 8) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[2][2] == 16) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[2][2] == 32) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[2][2] == 64) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[2][2] == 128) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[2][2] == 256) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[2][2] == 512) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[2][2] == 1024) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[2][2] == 2048) { ui->CC->setNum(p->board[2][2]); ui->CC->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[2][3] == 0) { ui->CD->setText(nullptr); ui->CD->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[2][3] == 2) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[2][3] == 4) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[2][3] == 8) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[2][3] == 16) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[2][3] == 32) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[2][3] == 64) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[2][3] == 128) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[2][3] == 256) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[2][3] == 512) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[2][3] == 1024) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[2][3] == 2048) { ui->CD->setNum(p->board[2][3]); ui->CD->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[3][0] == 0) { ui->DA->setText(nullptr); ui->DA->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[3][0] == 2) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[3][0] == 4) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[3][0] == 8) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[3][0] == 16) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[3][0] == 32) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[3][0] == 64) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[3][0] == 128) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[3][0] == 256) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[3][0] == 512) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[3][0] == 1024) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[3][0] == 2048) { ui->DA->setNum(p->board[3][0]); ui->DA->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[3][1] == 0) { ui->DB->setText(nullptr); ui->DB->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[3][1] == 2) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[3][1] == 4) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[3][1] == 8) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[3][1] == 16) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[3][1] == 32) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[3][1] == 64) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[3][1] == 128) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[3][1] == 256) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[3][1] == 512) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[3][1] == 1024) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[3][1] == 2048) { ui->DB->setNum(p->board[3][1]); ui->DB->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[3][2] == 0) { ui->DC->setText(nullptr); ui->DC->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[3][2] == 2) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[3][2] == 4) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[3][2] == 8) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[3][2] == 16) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[3][2] == 32) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[3][2] == 64) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[3][2] == 128) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[3][2] == 256) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[3][2] == 512) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[3][2] == 1024) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[3][2] == 2048) { ui->DC->setNum(p->board[3][2]); ui->DC->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } if(p->board[3][3] == 0) { ui->DD->setText(nullptr); ui->DD->setStyleSheet("QLabel{background-color:rgb(255,255,255);}"); } else if(p->board[3][3] == 2) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(255,255,0);}"); } else if(p->board[3][3] == 4) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(255,170,0);}"); } else if(p->board[3][3] == 8) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(190,125,100);}"); } else if(p->board[3][3] == 16) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(255,85,127);}"); } else if(p->board[3][3] == 32) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(255,85,255);}"); } else if(p->board[3][3] == 64) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(85,85,255);}"); } else if(p->board[3][3] == 128) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(0,255,255);}"); } else if(p->board[3][3] == 256) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(170,0,0);}"); } else if(p->board[3][3] == 512) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); } else if(p->board[3][3] == 1024) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(0,170,127);}"); } else if(p->board[3][3] == 2048) { ui->DD->setNum(p->board[3][3]); ui->DD->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); } } void play::on_restart_clicked() { if(QMessageBox::Yes == QMessageBox::question(this,QStringLiteral("2048"),QStringLiteral("Do you really want to restart?"),QMessageBox::Yes | QMessageBox:: No)) { p->RESET(); //重新开始 ui->score->setNum(0); showing(); return; } else { return; } } void play::keyPressEvent(QKeyEvent *event) { bool judge1 = false,judge2 = false; int judge3 = 0; if(event->key() == Qt::Key_W || event->key() == Qt::Key_Up) { if(move == false) { move = true; judge1 = p->push('W'); judge2 = p->mix('W'); if(!(judge1 || judge2)) //如果两个操作成功都失败了 { return; //说明是无效的移动,既不更新也不判断直接返回 } } } else if(event->key() == Qt::Key_S || event->key() == Qt::Key_Down) { if(move == false) { move = true; judge1 = p->push('S'); judge2 = p->mix('S'); if(!(judge1 || judge2)) //如果两个操作成功都失败了 { return; //说明是无效的移动,既不更新也不判断直接返回 } } } else if(event->key() == Qt::Key_A || event->key() == Qt::Key_Left) { if(move == false) { move = true; judge1 = p->push('A'); judge2 = p->mix('A'); if(!(judge1 || judge2)) //如果两个操作成功都失败了 { return; //说明是无效的移动,既不更新也不判断直接返回 } } } else if(event->key() == Qt::Key_D || event->key() == Qt::Key_Right) { if(move == false) { move = true; judge1 = p->push('D'); judge2 = p->mix('D'); if(!(judge1 || judge2)) //如果两个操作成功都失败了 { return; //说明是无效的移动,既不更新也不判断直接返回 } } } else { return; } if(judge1 || judge2) //如果两个操作成功 { showing(); //先展示 ui->highest->setNum(p->gethighestscore()); //显示分数 ui->score->setNum(p->getcurrentscore()); //显示分数 Sleep(200); //停顿 p->create(); //更新 showing(); //展示更新后情况 judge3 = p->judgewin(); //判定胜负 if(judge3 == 0) //未胜利 { return; //继续 } else if(judge3 == 1) //胜利 { QMessageBox::information(NULL, "2048", "Congratulations,you win!"); p->RESET(); //重新开始 ui->score->setNum(0); showing(); return; } else if(judge3 == 2) //输了 { QMessageBox::information(NULL, "2048", "OOPS,you lose!"); p->RESET(); //重新开始 ui->score->setNum(0); showing(); return; } } } void play::keyReleaseEvent(QKeyEvent *event) { if(event->key() == Qt::Key_W || event->key() == Qt::Key_Up||event->key() == Qt::Key_S || event->key() == Qt::Key_Down||event->key() == Qt::Key_A || event->key() == Qt::Key_Left||event->key() == Qt::Key_D || event->key() == Qt::Key_Right) { if(move == true) { move = false; } } }那么有需要的我把文件先放这里可以随意取用 https://download.csdn.net/download/Mr__NEO/12565934 如果有帮到你或是有所启发欢迎点赞+收藏+评论。