日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT-2048小游戏

發(fā)布時(shí)間:2024/1/18 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT-2048小游戏 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

熟悉QT,將教程里代碼稍稍改了一下

嗶哩嗶哩2048教程——視頻里有詳細(xì)的教程
源文件

文章目錄

      • 一、MainWindow構(gòu)造函數(shù)
      • 二、初始化(start槽函數(shù))
      • 三、繪制功能-paintEvent函數(shù)
      • 四、按鍵操作
      • 五、移動(dòng)相加
      • 六、尋找空白格子,判斷游戲是否結(jié)束
      • 七、效果圖
        • 1、主界面
        • 2、游戲界面
      • 八、打包

一、MainWindow構(gòu)造函數(shù)

1、設(shè)置窗口大小及標(biāo)題

ui->setupUi(this);this->setFixedSize(320,480);this->setWindowTitle("2048");

2、按鈕
(1)定義3*3和4*4按鈕,設(shè)置大小,通過connect方法設(shè)置游戲的size

// 3*3按鈕QPushButton* size_btn_3 = new QPushButton("3X3");size_btn_3->move(50,80);size_btn_3->setParent(this);size_btn_3->setFixedSize(80,30);connect(size_btn_3,SIGNAL(clicked()),this,SLOT(ensureSize3()));// 4*4按鈕QPushButton* size_btn_4 = new QPushButton("4X4");size_btn_4->setFixedSize(80,30);size_btn_4->setParent(this);size_btn_4->move(180,80);connect(size_btn_4,SIGNAL(clicked()),this,SLOT(ensureSize4()));

(2)確定游戲大小的槽函數(shù)

// 3*3 void MainWindow::ensureSize3() {size = 3;button->setText("開始游戲"); }// 4*4 void MainWindow::ensureSize4() {size =4;button->setText("開始游戲"); }

3、提示語句
主頁面的提示語句

remind_1 = new QLabel("先選擇大小,再點(diǎn)擊開始游戲",this);remind_2 = new QLabel("WASD控制方向",this);remind_1->setGeometry(60,150,200,30);remind_2->setGeometry(60,170,100,30);

4、開始按鈕
定義開始按鈕,通過connect方法實(shí)現(xiàn)點(diǎn)擊開始按鈕初始化游戲界面

// 開始按鈕button = new QPushButton("開始游戲",this);button->setGeometry(60,400,200,50);connect(button,SIGNAL(clicked()),this,SLOT(start()));

二、初始化(start槽函數(shù))

1、若未選擇size則提示錯(cuò)誤并返回

void MainWindow::start(){if(size == 0){QMessageBox::warning(this,"提示!","請先選擇游戲類型!");return;}

2、設(shè)置提示語句為空

remind_1->setText(" ");remind_2->setText(" ");

3、初始化游戲格子及分?jǐn)?shù),并將按鈕值設(shè)為重新開始

score = 0; // 分?jǐn)?shù)清零for(int i = 0;i < size;i++){for(int j = 0;j < size;j++){if(size == 3)lattice_3[i][j] = 0;else if(size == 4)lattice_4[i][j] =0;}}button->setText("重新開始");

4、生成隨機(jī)格子的行與列,再生成隨機(jī)數(shù)2或4填入隨機(jī)格子中;將狀態(tài)設(shè)為true并update重新刷新界面

int rand_i = qrand()%size; // 生成格子的隨機(jī)行int rand_j = qrand()%size; // 生成格子的隨機(jī)列// 隨機(jī)生成2,4Rand_2_4 rand;int rand_number = rand.rand();if(size == 3)lattice_3[rand_i][rand_j] = rand_number;else if(size == 4)lattice_4[rand_i][rand_j] = rand_number;state = true;update(); }

三、繪制功能-paintEvent函數(shù)

1、繪制背景圖片及分?jǐn)?shù)

void MainWindow::paintEvent(QPaintEvent *){QPainter paint(this);// 設(shè)置背景圖片QPixmap pix;pix.load(":/res/background.jpg");paint.drawPixmap(0,0,this->width(),this->height(),pix);paint.setFont(QFont("微軟雅黑",20,700,false));QString str_score;paint.drawText(QPoint(30,50),"分?jǐn)?shù) "+QString::number(score));

2、對格子二維數(shù)組進(jìn)行循環(huán),根據(jù)格子值設(shè)置畫刷顏色對格子上色,如果值不為0則將值畫出,若為0則不將其畫出

// 格子實(shí)現(xiàn)0 2 4 8 16 32 64 128 256 512 1024 2048for(int i=0;i < size;i++){for(int j=0;j < size;j++){paint.setPen(Qt::transparent);if(size == 3)value = lattice_3[i][j];else if(size == 4)value = lattice_4[i][j];// 根據(jù)值設(shè)置格子刷子顏色switch (value) {case 0: paint.setBrush(QBrush(QColor(204,202,202,80))); break;case 2: paint.setBrush(QBrush(QColor(255,252,227,210))); break;case 4: paint.setBrush(QBrush(QColor(255,241,140,210))); break;case 8: paint.setBrush(QBrush(QColor(255,243,26,210))); break;case 16: paint.setBrush(QBrush(QColor(128,255,252,210))); break;case 32: paint.setBrush(QBrush(QColor(38,255,250,210))); break;case 64: paint.setBrush(QBrush(QColor(35,254,150,210))); break;case 128: paint.setBrush(QBrush(QColor(0,200,60,210))); break;case 256: paint.setBrush(QBrush(QColor(255,51,51,210))); break;case 512: paint.setBrush(QBrush(QColor(255,2,2,210))); break;case 1024: paint.setBrush(QBrush(QColor(96,78,254,210))); break;case 2048: paint.setBrush(QBrush(QColor(48,24,254,210))); break;default: paint.setBrush(QBrush(QColor(254,1,159,210))); break;}int x = 70,y = 150;if(size == 4){x = 40;y = 120;}paint.drawRect(i*60+x,j*60+y,55,55); // 對格子上色if(value != 0){paint.setPen(Qt::black);paint.setFont(QFont("微軟雅黑",10,700,false));//在方塊中 繪制Text, 并且文本位置位于中部paint.drawText(QRectF(i*60+x,j*60+y,55,55),QString::number(value),QTextOption(Qt::AlignCenter));}}} }

四、按鍵操作

根據(jù)鍵入的值調(diào)用相關(guān)函數(shù)進(jìn)行操作

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(); // 強(qiáng)制界面刷新 }

五、移動(dòng)相加

以向上為例,下、左、右均相同

  • 執(zhí)行先移動(dòng)再相加
  • 將移動(dòng)相加分別分為3*3和4*4

1、移動(dòng)

void MainWindow::pressUp() {// 向上移動(dòng)for(int i = 0;i < size;i++){for(int j = 1;j < size;j++){ // 從左上第二行開始向上移動(dòng)// 3*3if(size == 3){if(lattice_3[i][j] == 0) // 為0跳過continue;for(int k = 0;k < j;k++){if(lattice_3[i][k] == 0){ // 查看上面是否有格子可以移動(dòng)lattice_3[i][k] = lattice_3[i][j];lattice_3[i][j] = 0;break;}}}// 4*4else if(size == 4){。。。// 與3*3操作相同}}}

2、相加

// 向上相加for(int i = 0;i < size;i++){for(int j = 0;j < size;j++){// 3*3if(size == 3){ // 上面的格子等于下面的格子if(lattice_3[i][j] == lattice_3[i][j+1]){lattice_3[i][j] = lattice_3[i][j]*2; // 上面的格子加倍lattice_3[i][j+1] = 0; // 下面的格子置0score += lattice_3[i][j];for(int k = j+2;k < size;k++) // 將后面的格子往前一個(gè)格子移棟lattice_3[i][k-1] = lattice_3[i][k];}}// 4*4else if(size == 4){。。。 // 與3*3操作相同}}} }

六、尋找空白格子,判斷游戲是否結(jié)束

1、找出空白格子(即值為0處),并將格子的位置信息存入結(jié)構(gòu)體中

void MainWindow::myrand() {// 找出空白格子int i = 0,j = 0; // 記錄空白格子位置int number = 0; // 記錄空白格子個(gè)數(shù)// 儲存空白格子位置struct Position site_3[3*3];struct Position site_4[4*4];for(i = 0;i < size;i++){for(int j = 0;j < size;j++){if(size == 3){if(lattice_3[i][j] == 0){ // 若為0則代表為空白格子site_3[number].i = i;site_3[number].j = j;number++;}}else if(size == 4){if(lattice_4[i][j] == 0){site_4[number].i = i;site_4[number].j = j;number++;}}}}

2、判斷游戲是否結(jié)束

//判斷游戲是否結(jié)束if (number == 0) {// 上下相鄰是否有相等的for(i = 0;i < size;i++) {for(j = 0;j < (size-1);j++) {if(size == 3){if(lattice_3[i][j] == lattice_3[i][j+1])return;}else if(size == 4){if(lattice_4[i][j] == lattice_4[i][j+1])return;}}}// 左右相鄰是否有相等的for(j = 0;j < size;j++) {for(i = 0;i < (size-1);i++) {if(size == 3){if(lattice_3[i][j] == lattice_3[i+1][j]){return;}}else if(size == 4){if(lattice_4[i][j] == lattice_4[i+1][j]){return;}}}}QMessageBox::warning(this,"Game Over!","游戲結(jié)束!");return;}

3、獲取隨機(jī)的格子,將生成的隨機(jī)數(shù)放入格子

// 隨機(jī)獲取空白格子int site_rand = qrand()%number;// 隨機(jī)生成2,4Rand_2_4 ran;int rand_number = ran.rand();int x,y;if(size == 3){x = site_3[site_rand].i;y = site_3[site_rand].j;lattice_3[x][y] = rand_number;}else if(size == 4){x = site_4[site_rand].i;y = site_4[site_rand].j;lattice_4[x][y] = rand_number;} }

七、效果圖

1、主界面

2、游戲界面

(1)3*3

(2)4*4

八、打包

2048
提取碼:oxtk

QT.exe程序打包為安裝包

總結(jié)

以上是生活随笔為你收集整理的QT-2048小游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。