嵌入式Linux大作业实现2048
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2018-2019学年下学期《嵌入式Linux应用程序开发》
期末大作业
专业:软件工程
班级:1603
学号:************
*名:**
任课教师:***
成绩:
题目内容:在Linux下,用qt编程实现一个小游戏,2048. 整体的代码结构如图1:
图1
完成后预览如图2:
图2
游戏主逻辑说明:1初始生成两个值,要么2,要么4
2 移动(上下左右四个方向):首先,在行/列上找到当前行第一个为空的值,
记录下该位置,再往后找到第一个不为空的值,最后将这两个位置交换。
3 合并:1:在 2.移动中,边界值为空当交换后的位置与交换后的位置的前
一个位置(简称前一个位置)的值相等,前一个位置值*2,删除要移动的值。
2:在 2.移动中,边界值不为空判断边界值是否与后面第一个不为空的值相等
3:相等,边界值*2,删除第一个不为空的值
4:不相等,不做任何操作
4:游戏结束:如果出现2048,赢,游戏结束,当方格填满,没有合并项,失败,游戏结束
1.
注:要记录下该位置在同一回合中是否合并过,避免同一回合多次合并核心步骤:
1设定背景样式:
void BGWidget::paintEvent(QPaintEvent *event)
{
QStylePainter painter(this);
//用style画背景(会使用setstylesheet中的内容)
QStyleOption opt;
opt.initFrom(this);
opt.rect=rect();
painter.drawPrimitive(QStyle::PE_Widget, opt);
painter.setPen(QColor(204,192,180));
painter.setBrush(QColor(204,192,180));
//4*4的背景矩阵
const int colWidth = 75;
const int rowHeight = 75;
const int xOffset = 10;
const int yOffset = 10;
for(int row = 0; row < 4;++row)
{
for(int col = 0; col < 4; ++col)
{
//背景方框
int x = col * colWidth + xOffset;
int y = row * rowHeight +yOffset;
painter.drawRoundRect(x,y,65,65,10,10);
}
}
QWidget::paintEvent(event);
}
2 Label类构造:
MyLabel::MyLabel(int text)
{
this->setText(QString::number(text));
this->setAlignment(Qt::Alignment(Qt::AlignCenter));
this->setFont(QFont("Gadugi", 20, QFont::Bold));
//初始化样式
int index = log_2(text) - 1; //计算背景数组索引值
QString fontColor = "color:rgb(255,255,255);";
if(index < 8)
{
fontColor = "color:rgb(119,110,101);";
}
QString bgColor = QString("QLabel{background-color:%1;border-radius:5px;%2}").arg(digitBkg[index]).arg(fontColor );
this->setStyleSheet(bgColor);
//透明度
QGraphicsOpacityEffect *m_pGraphicsOpacityEffect = new QGraphicsOpacityEffect(this);
m_pGraphicsOpacityEffect->setOpacity(1);
this->setGraphicsEffect(m_pGraphicsOpacityEffect);
//动画让label慢慢出现
QPropertyAnimation *animation = new QPropertyAnimation(m_pGraphicsOpacityEffect,"opacity",this);
animation->setEasingCurve(QEasingCurve::Linear);
animation->setDuration(400);
animation->setStartValue(0);
animation->setEndValue(1);
animation->start(QAbstractAnimation::KeepWhenStopped);
}
void MyLabel::reSetText(int text)
{
this->setText(QString::number(text));
int index = log_2(text) - 1; //计算背景数组索引值
QString fontColor = "color:rgb(255,255,255);";
if(index < 8)
{
fontColor = "color:rgb(119,110,101);";
}
QString bgColor = QString("QLabel{background-color:%1;border-radius:5px;%2}").arg(digitBkg[index] ).arg(fontColor);
this->setStyleSheet(bgColor);
this->show();
this->repaint();
}
这里,ui就不贴出了,见源代码。
3 游戏主逻辑的设计与实现