嵌入式Linux大作业实现(共34页).doc

上传人:飞****2 文档编号:14486057 上传时间:2022-05-04 格式:DOC 页数:34 大小:275.50KB
返回 下载 相关 举报
嵌入式Linux大作业实现(共34页).doc_第1页
第1页 / 共34页
嵌入式Linux大作业实现(共34页).doc_第2页
第2页 / 共34页
点击查看更多>>
资源描述

《嵌入式Linux大作业实现(共34页).doc》由会员分享,可在线阅读,更多相关《嵌入式Linux大作业实现(共34页).doc(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上2018-2019学年下学期嵌入式Linux应用程序开发期末大作业专 业: 软件工程 班 级: 1603 学 号: 5姓 名: 赵亮 任课教师: 薛正元 成 绩: 题目内容:在Linux下,用qt编程实现一个小游戏,2048.整体的代码结构如图1: 图1完成后预览如图2: 图2游戏主逻辑说明:1初始生成两个值,要么2,要么42 移动(上下左右四个方向):首先,在行/列上找到当前行第一个为空的值,记录下该位置,再往后找到第一个不为空的值,最后将这两个位置交换。3 合并:1:在 2.移动 中,边界值为空 当交换后的位置与交换后的位置的前一个位置(简称前一个位置)的值相等,

2、前一个位置值*2,删除要移动的值。2:在 2.移动 中,边界值不为空 判断边界值是否与后面第一个不为空的值相等3: 相等,边界值*2,删除第一个不为空的值4:不相等,不做任何操作4:游戏结束:如果出现2048,赢,游戏结束,当方格填满,没有合并项,失败,游戏结束1.注:要记录下该位置在同一回合中是否合并过,避免同一回合多次合并核心步骤:1设定背景样式:void BGWidget:paintEvent(QPaintEvent *event) QStylePainter painter(this); /用style画背景 (会使用setstylesheet中的内容) QStyleOption op

3、t; 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) fo

4、r(int col = 0; col 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 setStyleSheet(bgColor); /透明度 QGraphicsOpacityEffect *m_pGra

5、phicsOpacityEffect = new QGraphicsOpacityEffect(this); m_pGraphicsOpacityEffect-setOpacity(1); this-setGraphicsEffect(m_pGraphicsOpacityEffect); /动画让label慢慢出现 QPropertyAnimation *animation = new QPropertyAnimation(m_pGraphicsOpacityEffect,opacity,this); animation-setEasingCurve(QEasingCurve:Linear);

6、 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 setS

7、tyleSheet(bgColor); this-show(); this-repaint();这里,ui就不贴出了,见源代码。3 游戏主逻辑的设计与实现/初始化void GameWidget:initGame() /初始化分数为0 m_score = 0; m_highScore = 0; /初始化 for(int row = 0;row 4;+row) for(int col = 0;col open(QIODevice:ReadOnly) QByteArray ba = file-readAll(); QJsonDocument d = QJsonDocument:fromJson(ba

8、); QJsonObject json = d.object(); QJsonValue value = json.value(QString(m_highScore); QJsonValue score = json.value(QString(m_score); /最高分数 m_highScore = value.toVariant().toInt(); this-ui-best_2-setText(QString:number(m_highScore); /当前分数 m_score = score.toVariant().toInt(); this-ui-score_3-setText(

9、QString:number(m_score); /文件保存的进度 QJsonValue labelsArr = json.value(QString(labels); QJsonArray arr = labelsArr.toArray(); for(int i = 0;i arr.size(); i+) QJsonValue labelValue = arr.at(i); QJsonArray arr1 = labelValue.toArray(); for(int j = 0; jsetGeometry(x,y,66,66); label-setParent(m_bgWidget); l

10、abelsij = label; labelsij-show(); +m_labelCount; file-close(); / 判断读取的文件是否游戏结束 / 这里可以不用判断,为了防止游戏在结束的时候程序意外关闭 / gameOver(); else /初始化两个标签 for(int i=0;itext() = labelsrowcol-text() int x = labelsrowcol-x(); int y = row * rowHeight + yOffset;/y轴偏移 /动画效果 QPropertyAnimation *animation = new QPropertyAnim

11、ation(temp,geometry); animation-setStartValue(temp-geometry(); animation-setEndValue(QRect(x,y,temp-width(),temp-height(); animation-setDuration(100); animation-setEasingCurve(QEasingCurve:Linear); animation-start(QAbstractAnimation:DeleteWhenStopped); int score = 2*labelsrowcol-text().toInt(); labe

12、lsrowcol-reSetText(score); m_score += score; emit ScoreChange(); -m_labelCount; return true; return false;bool GameWidget:isMerge() for(int row = 0;row 4;+row) for(int col = 0;col 4;+col) if(isMergeDown(row,col) | isMergeRight(row,col) return true; return false;游戏胜利或者失败的判断:bool GameWidget:gameOver()

13、 bool flag = false; /如果格子全满(m_labelCount = 16) if(m_labelCount = 16) bool isWin = isMerge(); if(!isWin) /没有可以合并的标签,显示失败 QMessageBox:about(this, 信息, 失败!); flag = true; else /最大数出现2048,则显示胜利 for(int row = 0;row 4;+row) for(int col = 0;col text() = 2048) QMessageBox:about(this, 信息, 恭喜,你赢了!); flag = tru

14、e; break; if(flag) break; if(flag) /删除数组,从头开始 releaseRes(); m_labelCount = 0; m_score = 0; emit ScoreChange(); for(int i=0;iopen(QIODevice:WriteOnly) QJsonDocument d; QJsonObject json = d.object(); /进度 QJsonArray arr; for(int i = 0;i 4; i+) QJsonArray arr1; for(int j = 0; jtext(); else arr1.append(0

15、); arr.append(arr1); json.insert(labels,arr); /分数 json.insert(m_highScore,m_highScore); json.insert(m_score,m_score); d.setObject(json); QByteArray ba = d.toJson(QJsonDocument:Indented); /将数据写入文件 file-write(ba); file-close(); void GameWidget:releaseRes() for(int col = 0;col 4;+col) for(int row = 0;r

16、ow ui-score_3-setText(QString:number(m_score); if(m_score m_highScore) m_highScore = m_score; this-ui-best_2-setText(QString:number(m_highScore); void GameWidget:keyPressEvent(QKeyEvent *event) switch (event-key() case Qt:Key_Left: emit GestureMove(GestureDirect:LEFT); break; case Qt:Key_Right: emit

17、 GestureMove(GestureDirect:RIGHT); break; case Qt:Key_Down: emit GestureMove(GestureDirect:DOWN); break; case Qt:Key_Up: emit GestureMove(GestureDirect:UP); break; default: break; QWidget:keyPressEvent(event);void GameWidget:moveLabel(GestureDirect direction) bool isMove = false; switch (direction)

18、case LEFT: isMove = moveLeft(); break; case RIGHT: isMove = moveRight(); break; case UP: isMove = moveUp(); break; case DOWN: isMove = moveDown(); break; default: break; /游戏胜利结束 bool isOver = gameOver(); /能移动才创建,不能移动并且游戏结束不创建新的标签 if(isMove & !isOver) createLabel(); /游戏失败结束 if(!isOver) gameOver(); 游戏

19、重置:void GameWidget:on_bt_restart_clicked() /删除数组,从头开始 releaseRes(); m_labelCount = 0; m_score = 0; emit ScoreChange(); for(int i=0;im_bgWidget-setFocus();上下左右移动时的设计:bool GameWidget:moveUp() bool isMove = false; /是否能移动 int i , j ; /i:记录行 /j:记录当前元素是否合并过的行 for(int col = 0;col 4;+col) j = -1; for(int ro

20、w = 0;row 4;+row) /找到的第一个不为null的label if(labelsrowcol = NULL) i = row + 1; while(i x(); int y = row * rowHeight + yOffset;/y轴偏移 /动画让label往上升 QPropertyAnimation *animation = new QPropertyAnimation(temp,geometry); /开始值和结束值 animation-setStartValue(temp-geometry(); animation-setEndValue(QRect(x,y,temp-w

21、idth(),temp-height(); animation-setDuration(100);/动画播放时长 /设置动画的运动曲线 animation-setEasingCurve(QEasingCurve:Linear); animation-start(QAbstractAnimation:DeleteWhenStopped); /改变标签值,并改变分数 if(flag) int score = 2*labelsrowcol-text().toInt(); labelsrowcol-reSetText(score); m_score += score; emit ScoreChange

22、(); delete temp; temp = NULL; labelsicol = NULL; +row; +i; else if(row + 1 4) /当标签第一个不为空的时候 /如果该位置上有值,并且相邻的位置依然有值 MyLabel *temp = labelsrow + 1col; bool flag = merge(temp,row,col); if(flag) isMove = true; j = row; delete labelsrow + 1col; labelsrow + 1col = NULL; return isMove;bool GameWidget:moveDo

23、wn() bool isMove = false; /是否能移动,不能移动 int i , j ; /i:记录行 /j:记录当前元素是否合并过的行 for(int col = 0;col -1;-row) /找到的第一个不为null的label if(labelsrowcol = NULL) i =row-1; while(i -1) MyLabel *temp = labelsicol; if(temp != NULL) isMove = true; bool flag = false; if(j != (row + 1) flag= isMergeDown(i,col); if(flag) +row; j = row; -m_labelCount; else /交换两个元素 labelsrowcol = temp; j = -1; int x= temp-x(); int y = row * rowHeight + yOf

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁