• 大小: 14KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: 其他
  • 标签: QT  2048  

资源简介

用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

评论

共有 条评论