嵌入式系统的软硬件设计俄罗斯方块.docx

上传人:小飞机 文档编号:3480983 上传时间:2023-03-13 格式:DOCX 页数:11 大小:43.15KB
返回 下载 相关 举报
嵌入式系统的软硬件设计俄罗斯方块.docx_第1页
第1页 / 共11页
嵌入式系统的软硬件设计俄罗斯方块.docx_第2页
第2页 / 共11页
嵌入式系统的软硬件设计俄罗斯方块.docx_第3页
第3页 / 共11页
嵌入式系统的软硬件设计俄罗斯方块.docx_第4页
第4页 / 共11页
嵌入式系统的软硬件设计俄罗斯方块.docx_第5页
第5页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《嵌入式系统的软硬件设计俄罗斯方块.docx》由会员分享,可在线阅读,更多相关《嵌入式系统的软硬件设计俄罗斯方块.docx(11页珍藏版)》请在三一办公上搜索。

1、嵌入式系统的软硬件设计俄罗斯方块课程论文 嵌入式系统的软硬件设计 -俄罗斯方块 俄罗斯方块是家喻户晓的一款电视游戏机和掌上游戏机的益智游戏,它由俄罗斯人阿列克谢帕基特诺夫发明,故得此名。 俄罗斯方块的基本规则是移动、旋转和摆放游戏随机产生的各种方块,使之排列成完整的一行或多行并且消除得分。游戏区域会从顶部不断落下8种下坠物的一种,游戏区域左上角有一个区域可以显示下一个下坠物的形状,玩家可以控制下坠物移动、旋转和一键到底,通过玩家的操作,下坠物在游戏区域以“摆积木”的形式出现。下坠物在一行或多行堆满后就可以自动消除,消行后会得到相应的分数,如果当前下坠物堆积至窗口顶端,则游戏结束。 2 课程设计

2、目的 本课程是通过对嵌入式的课程设计让学生了解嵌入式的基本概念,基本编程指令与操作以及通过交叉编译完成在不同开发环境下的系统移植。另外,本嵌入式实验的课程设计的更主要目的是通过实际的嵌入式应用系统开发实例掌握嵌入式系统设计和开发的技能和专门知识,积累实践和工程经验。 3 课程设计背景 传统的俄罗斯方块只有7种基本形状,其是通过增加下降速度以减少玩家的反应时间来提升的游戏难度的。为了进一步提高游戏的难度,需要在其他方面提高游戏的难度。因此,我们小组以此为基础在原有的俄罗斯方块下进一步改进俄罗斯方块提高游戏难度。其次,传统的游戏是通过物理按键来控制游戏的,为实现在触摸屏上无物理按键的条件下玩俄罗斯

3、方块。我们采用触摸屏上的虚拟按键代替物理按键以操作游戏以满足现在手机用户无物理按键但仍能游戏的要求。 4实验设计要求 开发一个基于QT的俄罗斯方块游戏,并达到以下要求: 1、开始游戏随机产生13种方块并自动下落。左上角2*2预示框显示即将出现的图形; 2、按“pause”键可以暂停游戏,按“start”键开始游戏; 3、点击屏幕变换方块角度,触屏“left”键、“right”实现左、右移动,向下点击加速下移;“up”键实现同一种方块的变形;“switch”键实现方块之间的切换; 4、系统能够正确判断是否满行,并对已满的行实现消行并加分 5开发环境与硬件 操作系统:ubuntu12.04LTS;

4、 开发工具:gnu编译工具链、QtCreator、Qt4.6。 硬件系统:ARM2440、8寸液晶显示屏 5.1 Qt简介 Qt是跨平台的应用程序和UI框架。它包括跨平台类库、集成开发工具和跨平台IDE。使用Qt,只需一次性开发应用程序,无须重新编写代码,便可跨平台不同桌面和嵌入式操作系统部署这些应用程序。 5.2 Qt开发基础 5.2.1 Qt对象与对象树 QObject是所有Qt类的基类。QObject组织成为对象树。当创建QObject时,将另外的对象作为其父对象,这个对象就被加入其父对象的 children 列表,并且当父对象销毁时,这个对象也能够被销毁。事实证明,这种实现方法非常适合

5、 GUI 对象。例如,一个QShortcut对象是相关窗口的子对象,所以当用户关闭窗口时,这个对象也能够被删除。 QWidget作为所有能够显示在屏幕上的组件的父类,扩展了这种父子关系。一个子对象通常也成为一个子组件,就是说,它被显示在父组件的坐标系统中,受到父组件的边界影响可能会有剪切等等。例如,当应用程序销毁掉已关闭的消息对话框时,对话框上面的按钮和标签一起被销毁,就像我们希望的那样,因为这些按钮和标签都是对话框的子对象。 5.2.2 信号与槽 在 GUI 编程中,当改变了一个组件,经常需要通知另外的一个组件。更一般地,我们希望任何类型的对象都能够与另外的对象通讯。例如,如果用户点击了关闭

6、按钮,我们希望窗口的 close 函数被调用。 早期工具库对这种通讯使用回调实现。回调是一个指向一个函数的指针,所以如果希望某种事件发生的时候,处理函数获得通知,就需要将指向另外函数的指针传递给处理函数。这样,处理函数就会在合适的时候调用回调函数。回调有两个明显的缺点:第一,它们不是类型安全的。不能保证处理函数传递给回调函数的参数都是正确的。第二,回调函数和处理函数紧密地耦合在一起,因为处理函数必须知道哪一个函数被回调。 在Qt中,有回调技术之外的选择:信号槽。当特定事件发出时,一个信号会被发出。Qt组件有很多预定义的信号,同时,也可以通过继承这些组件,添加自定义的信号。槽则能够响应特定信号的

7、函数。Qt组件有很多预定义的槽,但是更常见的是,通过继承组件添加你自己的槽,以便你能够按照自己的方式处理信号。 信号槽机制是类型安全的:信号的签名必须同接受该信号的槽的签名一致。既然签名都是兼容的,那么编译器就可以帮助我们找出不匹配的地方。信号和槽是松耦合的:发出信号的类不知道也不关心哪些槽连接到它的信号。Qt的信号槽机制保证了,如果你把一个信号同一个槽连接,那么在正确的时间,槽能够接收到信号的参数并且被调用。信号和槽都可以有任意类型的任意个数的参数。它们全部都是类型安全的。 所有继承自QObject或者它的一个子类都可以包含信号槽。信号在对象改变其状态,并且这个状态可能有别的对象关心时被发出

8、。这就是这个对象为和别的对象交互所做的所有工作。它并不知道也不关心有没有别的对象正在接收它发出的信号。这是真正的信息封装,保证了这个对象能够成为一个组件。 槽能够被用于接收信号,也能够像普通函数一样使用。正如一个对象并不知道究竟有没有别的对象正在接收它的信号一样,一个槽也不知道有没有信号与它相连。这保证了使用Qt可以创建真正相互独立的组件。 可以将任意多个信号连接到同一个槽上,也可能将一个信号连接任意多个槽。同时,也能够直接将一个信号与另一个信号相连。 总之,信号槽建立起一种非常强大的组件编程机制。 5.2.3 事件 在Qt中,事件是作为对象处理的,所有事件对象继承自抽象类QEvent。此类用

9、来表示程序内部发生或者来自于外部但应用程序应该知道的动作。事件能够能过被QObject的子类接受或者处理,但是通常用在与组件有关的应用中。 当一个事件产生时,Qt通过实例化一个QEvent的合适的子类来表示它,然后通过调用 event 函数发送给QObject的实例。event 函数本身并不会处理事件,根据事件类型,它将调用相应的事件处理函数,并且返回事件被接受还是被忽略。一些事件,比如QMouseEvent和QKeyEvent,来自窗口系统;有的,比如QTimerEvent,来自于其他事件源;另外一些则来自应用程序本身。 通常事件的处理需要调用一个虚函数。比如,QPaintEvent事件的处

10、理需要调用QWidget:paintEvent 函数。这个虚函数负责做出适当的响应,通常是用来重绘组件。如果在自己的函数中并不打算实现所有的处理,可以调用基类的实现。 6 系统设计 6.1 框架设计 6.1.1 俄罗斯方块基本原则 一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为单位 一组由4个小型正方形组成的规则图形,通称为方块共有12种。 随机发生器不断地输出单个方块到场地顶部,以一定的规则进行移动、旋转、下落和摆放,锁定并填充到场地中。每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取一定的积分或者其他形式

11、的奖励。而未被消除的方块会一直累积,并对后来的方块摆放造成各种影响 如果未被消除的方块堆放的高度超过场地所规定的最大高度,则游戏结束。 6.1.2 系统模块 图1 系统界面 如上图所示,系统可由以下几个模块组成: 1)虚拟显示屏:为系统核心模块,负责游戏元素的显示、游戏逻辑的执行、以及游戏状态的维护、接收操作模块的操作信息、为辅助显示模块提供必要的信息 2)辅助显示模块:显示下一个方块单元的类型、当前分数、当前等级 3)操作区模块:为用户提供操作按键 6.2 系统实现 系统源文件布局如下: 图2系统源文件 tetrix.pro:系统工程文件 tetriswindow.h:tetriswindo

12、w类声明头文件 tetrispiece.h:tetrispiece类声明头文件 tetrisboard.h:tetrisboard类声明头文件 tetris.qrc:系统资源文件,存放了表示方向的图像数据 tetrispiece.cpp:tetriswindow类的实现 tetrispiece.cpp:tetrispiece类的实现 tetrisboard.cpp:tetrisboard类的实现 main.cpp:程序入口 main.cpp中初始化一个tetriswindow实例,并使其显示 tetriswindow对应程序窗口,用于界面设计。 tetrispiece类表示基本方块单元,总共有

13、13种。用tetrispiecehape来标识方块类型tetrispiece提供了设置方块形状、设置旋转、获取方块信息的一些公共成员函数。tetrispiece使用coords1342这个三维数组来存储方块的形状信息,第一维的每行表示一个点的坐标。 tetrisboard是整个程序的核心,相对前两个类,这个类要复杂很多。它提供了如下几个槽:start、pause、quit、right、left、down、up、switch、rotateRight、rotateLeft来实现具体功能。 7 系统测试 图3 Qt界面 图4 ARM2440触摸屏上实物图 程序的运行界面如上图3所示,实物如图4所示。

14、经实验测试,该程序不管是在Qt界面下还是在触摸屏上都能完成俄罗斯方块游戏的基本功能。 8 个人完成的部分 我主要负责tetriswindow和tetrisboard两部分。整个程序的设计是在已有的俄罗斯方块的基础上添加5个按键的功能,然后完成按键功能的实现以及按键与事件的连接,最后对界面进行整体布局。 tetriswindow是负责应程序窗口的,在其界面设计包含游戏显示区、游戏等级及分数的辅助显示区和一些按键,在tetriswindow的构造函数中完成对界面元素的初始化及布局工作,同时建立起必要的信号-槽连接。 tetrisboard是整个程序的核心。在其里面添加了几个槽:start、paus

15、e、quit、right、left、down、rotate、switch、rotateRight、rotateLeft。同时在tetrisboard.h提供了scoreChanged与levelChanged两个信号。paintEvent负责整个tetrisboard的重绘。removeFullLines负责判断是否某行全部为方块,如果是,则把该行消除,同时添加一定分数及经验。 具有步骤如下: 首先在tetriswindow.h中增加5个按键: QPushButton *leftButton; QPushButton *rightButton; QPushButton *upButton; Q

16、PushButton *downButton; QPushButton *switchButton; 其次,在tetriswindow.cpp中为每个按键进行命名: leftButton = new QPushButton(tr(&left); leftButton-setFocusPolicy(Qt:NoFocus); rightButton = new QPushButton(tr(&right); rightButton-setFocusPolicy(Qt:NoFocus); upButton = new QPushButton(tr(&rotate); upButton-setFocu

17、sPolicy(Qt:NoFocus); downButton = new QPushButton(tr(&down); downButton-setFocusPolicy(Qt:NoFocus); switchButton = new QPushButton(tr(&switch); switchButton-setFocusPolicy(Qt:NoFocus); 然后把信号与槽进行连接,使用connect函数,具体实现如下: connect(leftButton, SIGNAL(clicked), board, SLOT(left); connect(rightButton, SIGNAL

18、(clicked), board, SLOT(right); connect(upButton, SIGNAL(clicked), board, SLOT(up); connect(downButton, SIGNAL(clicked), board, SLOT(down); connect(switchButton, SIGNAL(clicked), board, SLOT(reshap); 其中,left、right、up、down、reshape函数是在tetrisboard.cpp中定义的函数功能。“left”键、“right”键通过改变方块的横坐标以实现左、右移动,“down”键通过

19、改变纵坐标以实现向下点击按键达到加速下移的目的;“rotate”键实现同一种方块的变形;“switch”键通过随见选取方块形状以实现方块之间的切换。 具体实现如下: voidTetrixBoard:left /cs begin tryMove(curPiece, curX - 1, curY);/改变X坐标 voidTetrixBoard:right tryMove(curPiece, curX +1, curY); voidTetrixBoard:up tryMove(curPiece.rotatedLeft, curX, curY); voidTetrixBoard:down dropDo

20、wn; voidTetrixBoard:reshap curPiece.setRandomShape; /随机选取形状 ; /cs end 为了实现信号与槽的连接在tetrisboard.cpp中把上述几个函数定义为槽: public slots: void right; void left; void up; void down; void start; void pause; voidreshap; 在实现按键功能的实现后就需要对整体界面进行布局,首先定义窗口大小:resize(550, 370),然后对各部分布局采用void addWidget ( QWidget * widget, i

21、nt row, int column, Qt:Alignment alignment = 0 )函数,具体界面布局如下: layout-addWidget(createLabel(tr(NEXT), 0, 0); layout-addWidget(nextPieceLabel, 1, 0); layout-addWidget(createLabel(tr(LEVEL), 2, 0); layout-addWidget(levelLcd, 3, 0); layout-addWidget(startButton, 4, 0); layout-addWidget(board, 0, 1, 6, 1)

22、; layout-addWidget(createLabel(tr(SCORE), 0, 2); layout-addWidget(scoreLcd, 1, 2); layout-addWidget(createLabel(tr(LINES REMOVED), 2, 2); layout-addWidget(linesLcd, 3, 2); layout-addWidget(quitButton, 4, 2); layout-addWidget(pauseButton, 5, 2); layout-addWidget(upButton, 6, 1); layout-addWidget(left

23、Button, 7, 0); layout-addWidget(rightButton, 7, 2); layout-addWidget(downButton, 8, 1); layout-addWidget(switchButton, 7, 1); 其中,把up 、down left、right、按键按照上下左右的位置排列在整个界面的最下面。而按键switch放在up和down之间。这种放置比较适应人们平时的习惯。界面显示结果如图4所示。 9 个人实验总结 这次实验首先我自己是先按照实验指导书上得到内容把实验平台的各模块熟悉了一遍。通过对模块的熟悉,基本的编程和交叉编译也基本熟悉了。后来在移

24、植时由于经常性的出现目标机上的内存不够的问题或者是移植成功却因为某些原因不能成功打开应用程序,也未能检查出原因。最后两天我们组选择使用自己的ARM开发板来实现此次实验。由于是Qt开发,而我之前不熟悉Qt的编程,因此在个人开始工作期间出现了一些问题,尤其是对Qt的类不是很了解,不知道怎么使用。后来通过自己上网查找资料以及看有关Qt的书籍,才了解了其界面设计步骤,得以顺利完成了实验要求。 通过此次实验,感触颇深的一点就是意识到要学会快速掌握一门自己不了解的东西。对于快速学习的这个过程,通过本实验深刻体会到了。了解到要快速学习的好办法就是通过别人的程序进行分析,然后模仿或者在其基础上修改,对于不懂的内容上网去查找资料。通过实例学习效果更有效,更容易掌握内容。另外,通过这次实验也对交叉编译有了更深刻的了解。此外,对于嵌入式的开发也增加了浓厚的兴趣。

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号