資源簡介
用QT寫的一個很好用的2048,給大家分享一下,相互學習
代碼片段和文件信息
#include?“GameWidget.h“
//?顏色數組?存儲每個數字對應的背景色
QColor?digitBkg[11]?=?{QColor::fromRgb(0xFF?0xFF?0xCC)?QColor::fromRgb(0xFF?0xFF?0x99)
????????????????????????????QColor::fromRgb(0xFF?0xCC?0xCC)?QColor::fromRgb(0xFF?0xCC?0x99)
????????????????????????????QColor::fromRgb(0xFF?0x99?0x99)?QColor::fromRgb(0xFF?0x99?0x66)
????????????????????????????QColor::fromRgb(0xFF?0x66?0x66)?QColor::fromRgb(0xCC?0x99?0x66)
????????????????????????????QColor::fromRgb(0xCC?0x33?0x33)?QColor::fromRgb(0xCC?0x00?0x33)
????????????????????????????QColor::fromRgb(0xFF?0x00?0x00)};
//?每個方向位置的增量
QPointF?dPos[5];
GameWidget::GameWidget(QWidget?*parent)?:
????QGLWidget(QGLFormat(QGL::SampleBuffers)?parent)
????timer(this)
{
????//?連接手勢移動信號和相應的槽函數
????connect(this?SIGNAL(GestureMove(GestureDirect))?SLOT(onGestureMove(GestureDirect)));
????//?連接時鐘信號和畫板更新的槽
????connect(&timer?SIGNAL(timeout())?this?SLOT(update()));
????//?初始化board數組
????memset(board?0?sizeof(board));
????//?分數初始化為0
????score?=?0;
????//?數碼個數初始化為2
????digitCount?=?2;
????//?沒有在播放動畫效果
????isAnimating?=?false;
????//?初始化兩個方格
????init2Block();
}
void?GameWidget::init2Block()
{
????board[rand()?%?4][rand()?%?4]?=?2;
????int?i?=?rand()?%?4?j?=?rand()?%?4;
????while?(board[i][j]?!=?0)
????????i?=?rand()?%?4?j?=?rand()?%?4;
????board[i][j]?=?2;
????update();
}
void?GameWidget::mousePressEvent(QMouseEvent?*e)
{
????//?獲取起點坐標
????startPos?=?e->pos();
}
void?GameWidget::mouseReleaseEvent(QMouseEvent?*e)
{
????//?如果在播放動畫效果則直接退出防止重復產生手勢事件
????if?(isAnimating)
????????return;
????//?根據終點坐標和起點坐標計算XY坐標的增量
????float?dX?=?(float)(e->pos().x()?-?startPos.x());
????float?dY?=?(float)(e->pos().y()?-?startPos.y());
????//?確定手勢方向
????if?(abs(dX)?>?abs(dY))
????{
????????if?(dX?0)
????????????emit?GestureMove(LEFT);
????????else
????????????emit?GestureMove(RIGHT);
????}
????else
????{
????????if?(dY?0)
????????????emit?GestureMove(UP);
????????else
????????????emit?GestureMove(DOWN);
????}
}
void?GameWidget::onGestureMove(GestureDirect?direct)
{
????int?i?j?k;
????Animation?a;
????//?記錄是否移動過方格以及是否有方格合并
????bool?move?=?false?combine?=?false;
????//?記錄某個格子是否參與過合并
????bool?isCombined[4][4];
????memset(isCombined?0?sizeof(isCombined));
????//?處理不同方向
????switch?(direct)
????{
????//?向左
????case?LEFT:
????????//?循環每一行
????????for?(i?=?0;?i?4;?i++)
????????{
????????????/*?初始化j?k為0
?????????????*?這里j表示要交換的數字列號
?????????????*?k表示交換到的位置的列號
?????????????*?*/
????????????j?=?0?k?=?0;
????????????while?(true)
????????????{
????????????????//?循環找到第一個不是0的數字對應的列號
????????????????while?(j?4?&&?board[i][j]?==?0)
????????????????????j++;
????????????????//?如果超過了3則說明搜索完畢?推出循環
????????????????if?(j?>?3)
????????????????????break;
????????????????//?交換兩個數字
????????????????qSwap(board[i][k]?board[i][j]);
????????????????if?(j?!=?k)
????????????????????move?=?true;
????????????????//?記錄動
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2015-01-01?16:14??My2048\
?????文件???????19219??2014-05-23?14:54??My2048\GameWidget.cpp
?????文件????????2976??2014-05-23?14:36??My2048\GameWidget.h
?????文件?????????428??2014-05-22?14:50??My2048\My2048.pro
?????文件???????13584??2014-12-24?20:08??My2048\My2048.pro.user
?????文件???????29994??2014-05-23?00:27??My2048\My2048.pro.user.3.2-pre1
?????目錄???????????0??2015-01-01?16:15??My2048\debug\
?????文件?????????175??2014-05-21?15:27??My2048\main.cpp
?????目錄???????????0??2015-01-01?16:15??My2048\release\
?????文件????????3713??2014-05-23?14:33??My2048\widget.cpp
?????文件????????1423??2014-05-23?14:30??My2048\widget.h
- 上一篇:多項式的加法,減法和乘法運算
- 下一篇:軟件成本估算報告
評論
共有 條評論