嵌入式Linux大作业实现Word文档格式.docx
《嵌入式Linux大作业实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux大作业实现Word文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
要记录下该位置在同一回合中是否合并过,避免同一回合多次合并
核心步骤:
1设定背景样式:
voidBGWidget:
:
paintEvent(QPaintEvent*event)
{
QStylePainterpainter(this);
//用style画背景(会使用setstylesheet中的内容)
QStyleOptionopt;
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的背景矩阵
constintcolWidth=75;
constintrowHeight=75;
constintxOffset=10;
constintyOffset=10;
for(introw=0;
row<
4;
++row)
{
for(intcol=0;
col<
++col)
//背景方框
intx=col*colWidth+xOffset;
inty=row*rowHeight+yOffset;
painter.drawRoundRect(x,y,65,65,10,10);
}
QWidget:
paintEvent(event);
}
2Label类构造:
MyLabel:
MyLabel(inttext)
this->
setText(QString:
number(text));
setAlignment(Qt:
Alignment(Qt:
AlignCenter));
setFont(QFont("
Gadugi"
20,QFont:
Bold));
//初始化样式
intindex=log_2(text)-1;
//计算背景数组索引值
QStringfontColor="
color:
rgb(255,255,255);
"
;
if(index<
8)
fontColor="
rgb(119,110,101);
QStringbgColor=QString("
QLabel{background-color:
%1;
border-radius:
5px;
%2}"
).arg(digitBkg[index]).arg(fontColor);
setStyleSheet(bgColor);
//透明度
QGraphicsOpacityEffect*m_pGraphicsOpacityEffect=newQGraphicsOpacityEffect(this);
m_pGraphicsOpacityEffect->
setOpacity
(1);
setGraphicsEffect(m_pGraphicsOpacityEffect);
//动画让label慢慢出现
QPropertyAnimation*animation=newQPropertyAnimation(m_pGraphicsOpacityEffect,"
opacity"
this);
animation->
setEasingCurve(QEasingCurve:
Linear);
setDuration(400);
setStartValue(0);
setEndValue
(1);
start(QAbstractAnimation:
KeepWhenStopped);
voidMyLabel:
reSetText(inttext)
QStringbgColor=QString("
show();
repaint();
这里,ui就不贴出了,见源代码。
3游戏主逻辑的设计与实现
//初始化
voidGameWidget:
initGame()
//初始化分数为0
m_score=0;
m_highScore=0;
//初始化
row<
col<
4;
++col)
labels[row][col]=NULL;
//读取文件,最高分设置
//ReadOnly文件不存在,打开失败
//WriteOnly文件不存在,会自动创建文件
//ReadWrite文件不存在,会自动创建文件
//Append文件不存在,会自动创建文件
//Truncate文件不存在,打开失败
//Text文件不存在,打开失败
//Unbuffered文件不存在,打开失败
QFile*file=newQFile("
data.json"
);
if(file->
open(QIODevice:
ReadOnly))
QByteArrayba=file->
readAll();
QJsonDocumentd=QJsonDocument:
fromJson(ba);
QJsonObjectjson=d.object();
QJsonValuevalue=json.value(QString("
m_highScore"
));
QJsonValuescore=json.value(QString("
m_score"
//最高分数
m_highScore=value.toVariant().toInt();
ui->
best_2->
number(m_highScore));
//当前分数
m_score=score.toVariant().toInt();
score_3->
number(m_score));
//文件保存的进度
QJsonValuelabelsArr=json.value(QString("
labels"
QJsonArrayarr=labelsArr.toArray();
for(inti=0;
i<
arr.size();
i++)
QJsonValuelabelValue=arr.at(i);
QJsonArrayarr1=labelValue.toArray();
for(intj=0;
j<
arr1.size();
j++)
QJsonValuearrValue=arr1.at(j);
intoldValue=arrValue.toVariant().toInt();
if(oldValue!
=0)
MyLabel*label=newMyLabel(oldValue);
intx=j*colWidth+xOffset;
inty=i*rowHeight+yOffset;
label->
setGeometry(x,y,66,66);
setParent(m_bgWidget);
labels[i][j]=label;
labels[i][j]->
++m_labelCount;
file->
close();
//判断读取的文件是否游戏结束
//这里可以不用判断,为了防止游戏在结束的时候程序意外关闭
//gameOver();
else
//初始化两个标签
for(inti=0;
2;
i++){
createLabel();
对游戏期间数字相碰的逻辑处理:
boolGameWidget:
merge(MyLabel*temp,introw,intcol)
if(temp!
=NULL)
//判断两个值是否相等,是合并
if(temp->
text()==labels[row][col]->
text())
intx=labels[row][col]->
x();
inty=row*rowHeight+yOffset;
//y轴偏移
//动画效果
QPropertyAnimation*animation=newQPropertyAnimation(temp,"
geometry"
setStartValue(temp->
geometry());
setEndValue(QRect(x,y,temp->
width(),temp->
height()));
setDuration(100);
DeleteWhenStopped);
intscore=2*labels[row][col]->
text().toInt();
labels[row][col]->
reSetText(score);
m_score+=score;
emitScoreChange();
--m_labelCount;
returntrue;
returnfalse;
isMerge()
if(isMergeDown(row,col)||isMergeRight(row,col))
游戏胜利或者失败的判断:
gameOver()
{
boolflag=false;
//如果格子全满(m_labelCount==16)
if(m_labelCount==16)
boolisWin=isMerge();
if(!
isWin){
//没有可以合并的标签,显示失败
QMessageBox:
about(this,"
信息"
"
失败!
flag=true;
//最大数出现2048,则显示胜利
if(labels[row][col]!
=NULL&
&
text()=="
2048"
)
恭喜,你赢了!
break;
if(flag)
//删除数组,从头开始
releaseRes();
m_labelCount=0;
returnflag;
保存数据:
saveGame()
WriteOnly))
QJsonDocumentd;
//进度
QJsonArrayarr;
QJsonArrayarr1;
if(labels[i][j]!
arr1.append(labels[i][j]->
text());
arr1.append(0);
arr.append(arr1);
json.insert("
arr);
//分数
m_highScore);
m_score);
d.setObject(json);
QByteArrayba=d.toJson(QJsonDocument:
Indented);
//将数据写入文件
write(ba);
releaseRes()
deletelabels[row][col];
closeEvent(QCloseEvent*event)
saveGame();
setScore()
if(m_score>
m_highScore)
m_highScore=m_score;
keyPressEvent(QKeyEvent*event)
switch(event->
key()){
caseQt:
Key_Left:
emitGestureMove(GestureDirect:
LEFT);
Key_Right:
RIGHT);
Key_Down:
DOWN);
Key_Up:
UP);
default:
keyPressEvent(event);
moveLabel(GestureDirectdirection)
boolisMove=false;
switch(direction){
caseLEFT:
isMove=moveLeft();
caseRIGHT:
isMove=moveRight();
caseUP:
isMove=moveUp();
caseDOWN:
isMove=moveDown();
//游戏胜利结束
boolisOver=gameOver();
//能移动才创建,不能移动并且游戏结束不创建新的标签
if(isMove&
!
isOver){
//游戏失败结束
isOver)
gameOver();
游戏重置:
on_bt_restart_clicked()
m_bgWidget->
setFocus();
上下左右移动时的设计:
moveUp()
//是否能移动
inti,j;
//i:
记录行
//j:
记录当前元素是否合并过的行
j=-1;
//找到的第一个不为null的label
if(labels[row][col]==NULL)
i=row+1;
while(i<
4)
MyLabel*temp=labels[i][col];
isMove=true;
if(j!
=(row-1))
flag=isMergeUp(i,col);
--row;
j=row;
}else
//交换两个元素
labels[row][col]=temp;
//将j重置为-1;
intx=temp->
//动画让label往上升
//开始值和结束值
//动画播放时长
//设置动画的运动曲线
//改变标签值,并改变分数
if(flag){
deletetemp;
temp=NULL;
labels[i][col]=NULL;
++row;
++i;
elseif(row+1<
//当标签第一个不为空的时候
//如果该位置上有值,并且相邻的位置依然有值
MyLabel*temp=labels[row+1][col];
boolflag=merge(temp,row,col);
deletelabels[row+1][col];
labels[row+1][col]=NULL;
returnisMove;
moveDown()
//是否能移动,不能移动
for(int