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

资源简介

qt下简单的2048源码,参考网上的代码进行一些修改, 可以很好的运行

资源截图

代码片段和文件信息

#include 
#include “GameWidget.h“

// 颜色数组 存储每个数字对应的背景色
QColor digitBkg[11] = {QColor::fromRgb(0xEE 0xE5 0xDB) QColor::fromRgb(0xEC 0xE0 0xC8)
                            QColor::fromRgb(0xF2 0xAF 0x78) QColor::fromRgb(0xEE 0x8A 0x54)
                            QColor::fromRgb(0xFE 0x76 0x5E) QColor::fromRgb(0xE7 0x58 0xC)
                            QColor::fromRgb(0xFF 0x66 0x66) QColor::fromRgb(0xF1 0xCF 0x48)
                            QColor::fromRgb(0xCC 0x33 0x33) QColor::fromRgb(0xE3 0xB9 0x11)
                            QColor::fromRgb(0xFF 0x00 0x00)};

// 每个方向位置的增量
QPointF dPos[5] = {QPointF(-10 0) QPointF(10 0) QPointF(0 -10) QPointF(0 10) QPointF(-2 -2)};

GameWidget::GameWidget(QWidget *parent) :
    QWidget(parent)
{
    // 连接手势移动信号和相应的槽函数
    connect(this SIGNAL(GestureMove(GestureDirect)) SLOT(onGestureMove(GestureDirect)));
    // 初始化board数组
    memset(board 0 sizeof(board));
    // 随机填入两个2
    board[rand() % 4][rand() % 4] = 2;
    while(true) {
        int x = rand() % 4;
        int y = rand() % 4;
        if (board[x][y] != 0) {
            continue;
        }
        else {
            board[x][y] = 2;
            break;
        }
    }
    // 分数初始化为0
    score = 0;
    // 数码个数初始化为2
    digitCount = 2;
    isAnimating = false;
    cacheImg = NULL;
}

void GameWidget::keyPressEvent(QKeyEvent *event)
{
    if (isAnimating)
        return;
    switch (event->key()) {
        case Qt::Key_Left:
            emit GestureMove(LEFT);
        break;
        case Qt::Key_Right:
            emit GestureMove(RIGHT);
        break;
        case Qt::Key_Down:
            emit GestureMove(DOWN);
        break;
        case Qt::Key_Up:
            emit GestureMove(UP);
        break;
        default:
        break;
    }
    QWidget::keyPressEvent(event);
}

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 combine = false;
    // 处理不同方向
    switch (direct)
    {
    // 向左
    case LEFT:
        // 循环每一行
        for (i = 0; i < 4; i++)
        {
            /* 初始化j k为0
             * 这里j表示要交换的数字列号
             * k表示交换到的位置的列号
             * */
            j = 0 k = 0 combine = false;
  

评论

共有 条评论