嵌入式Linux大作业实现Word文档格式.docx

上传人:b****5 文档编号:19378566 上传时间:2023-01-05 格式:DOCX 页数:29 大小:209.58KB
下载 相关 举报
嵌入式Linux大作业实现Word文档格式.docx_第1页
第1页 / 共29页
嵌入式Linux大作业实现Word文档格式.docx_第2页
第2页 / 共29页
嵌入式Linux大作业实现Word文档格式.docx_第3页
第3页 / 共29页
嵌入式Linux大作业实现Word文档格式.docx_第4页
第4页 / 共29页
嵌入式Linux大作业实现Word文档格式.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

嵌入式Linux大作业实现Word文档格式.docx

《嵌入式Linux大作业实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux大作业实现Word文档格式.docx(29页珍藏版)》请在冰豆网上搜索。

嵌入式Linux大作业实现Word文档格式.docx

要记录下该位置在同一回合中是否合并过,避免同一回合多次合并

核心步骤:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 中国风

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1