基于ARM的俄罗斯方块游戏的开发

上传人:卷*** 文档编号:146120046 上传时间:2022-08-30 格式:DOC 页数:34 大小:2.95MB
返回 下载 相关 举报
基于ARM的俄罗斯方块游戏的开发_第1页
第1页 / 共34页
基于ARM的俄罗斯方块游戏的开发_第2页
第2页 / 共34页
基于ARM的俄罗斯方块游戏的开发_第3页
第3页 / 共34页
点击查看更多>>
资源描述
学号: 常 州 大 学 毕业设计(论文)(2012届)题 目 学 生 学 院 专业班级 校内指导教师 专业技术职务 校外指导老师 专业技术职务 二一二年六月基于ARM的俄罗斯方块游戏的开发摘 要:随着现代化技术的高速发展,人们的生活已经离不开嵌入式了。在消费电子领域,嵌入式系统的游戏娱乐功能受到越来越多的关注。本课题是基于ARM微处理器S3C2440A硬件平台,设计并实现了俄罗斯方块游戏。系统的实现主要分为两个部分。首先,在PC机上安装qt creator开发软件,利用Qt的信号与槽、事件机制等技术,完成俄罗斯方块游戏程序的设计。程序设计的重点是实现方块的数据存储、移动旋转和消行等功能。然后搭建Qt/Embedded开发环境,嵌入式交叉编译俄罗斯方块游戏程序生成可执行文件,并下载到ARM开发板mini2440上运行。 经过测试,整个系统性能良好,满足设计要求。俄罗斯方块游戏通过键盘进行操作,人机交互效率较高。界面美观大方,功能说明简单完整。研究方案跟进时代主流,具有重要的现实意义。关键词:嵌入式Linux、S3C2440A、Qt、俄罗斯方块The Development of Tetris Game Based on the ARMAbstract : With the rapid development of modern technology, peoples lives have been inseparable from the embedded. The entertainment function of embedded system is paid more and more attention in consumer electronic application field.This paper designed and implemented Tetris game which is based on the ARM microprocessor S3C2440 hardware platform.The realization of the system is divided into two parts. First install the qt creator development software on a PC,and complete the design of Tetris game program with the techniques of Qts “signals and slots” and the event mechanism.The program focuses on the data storage of boxes and the functions of moving,rotation and removing.Then build the development environment of Qt/Embedded ,embedded cross compile Tetris game program to generate an executable file which is downloaded to run on ARM development board mini2440. After testing,The system runs quite well and meet the design requirements. Tetris game is operated with a keyboard and the man-machine efficiency is very high.It has a pretty interface. The functional description is both simple and complete. Research approach keeps with the times and it has important practical significance.Key words: embedded Linux、S3C2440A、Qt、Tetris目录摘 要IABSTRACTII1绪论11.1 课题研究背景及国内外研究现状11.2 课题的提出与意义21.3 解决问题的思路、方法以及取得成果22需求分析42.1 硬件需求42.1.1 嵌入式处理器42.1.2 开发板的选择52.2 软件需求62.2.2 Qt简介62.2.2 Qt Creator开发软件62.2.3 VMWare虚拟机72.2.4 Linux操作系统7 2.3 功能需求82.4 游戏界面需求92.5 方块图形需求103 系统设计113.1 qt creator安装与配置11 3.2 模块实现12 3.3 关键技术实现13 3.3.1 方块的数据结构13 3.3.2 方块的旋转和移动14 3.3.3 消行16 3.3.4 定时器实现17 3.3.5 UI设计和游戏区域的绘制18 3.3.6 键盘处理214 移植和测试234.1 交叉编译工具安装234.2 交叉编译Qt/Embedded234.3 下载运行245 总结与展望285.1 总结285.2 展望28参 考 文 献29致 谢301 绪论1.1 课题研究背景及国内外研究现状嵌入式系统是当前发展最快最有前途的IT应用领域之一,嵌入式技术的发展正以前所未有的速度影响和改变着我们的生活。人们平常所熟知的手机、摄像机、游戏机、智能玩具、3D电视、医疗仪器、汽车电子、工业控制设备、航天航空设备等都有嵌入式系统。嵌入式系统是二十一世纪科技领域的重大创新,将推进全球经济社会高速发展。嵌入式系统在硬件和软件交替发展的双螺旋的支撑下逐渐趋于稳定和成熟。作为一类特殊的计算机系统,主要由硬件平台、嵌入式操作系统和嵌入式应用程序构成。硬件平台包括嵌入式处理器和外围设备。嵌入式微处理器是嵌入式系统的核心部件,是控制、辅助系统运行的硬件单元,所以,嵌入式微处理器是决定嵌入式系统功能强弱的主要因素,也决定了嵌入式系统的应用范围和开发复杂度。ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件,技术具有性能高、成本低和能耗省的特点3。到目前为止,ARM微处理器及技术的应用几乎已经深入到各个领域: (1)工业控制领域:作为32位的RISC架构,基于ARM核的微控制器芯片不但占据了高端微控制器市场的大部分市场份额,同时也逐渐向低端微控制器应用领域扩展,ARM微控制器的低功耗、高性价比,向传统的8位/16位微控制器提出了挑战。 (2)无线通讯领域:目前已有超过85%的无线通讯设备采用了ARM技术,ARM以其高性能和低成本,在该领域的地位日益巩固。 (3)网络应用:随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。此外,ARM在语音及视频处理上行了优化,并获得广泛支持,也对DSP的应用领域提出了挑战。 (4)消费类电子产品:ARM技术在目前流行的数字音频播放器、数字机顶盒和游戏机中得到广泛采用。 (5)成像和安全产品:现在流行的数码相机和打印机中绝大部分采用ARM技术。手机中的32位SIM智能卡也采用了ARM技术。除此以外,ARM微处理器及技术还应用到许多不同的领域,并会在将来取得更加广泛的应用9。ARM的商业模式是开放的,任何厂商都可以购买授权,目前,总共有30家半导体公司与ARM签订了硬件技术使用许可协议,其中包括Intel、IBM、LG半导体、NEC、SONY、飞利浦和国家半导体这样的大公司。至于软件系统的合伙人,则包括微软、SUN和MRI等一系列知名公司。进入21世纪之后,由于手机制造行业的快速发展,出货量呈现爆炸式增长,ARM处理器占领了全球手机市场。由此可见,ARM处理器还具有广阔的发展空间,将会不断影响和改变我们的生活。1.2 课题的提出与意义当前,ARM正在与包括Android在内的所有Linux联盟合作,致力于从芯片级至操作系统级两方面统一,降低产品的开发门槛。“ARM+Linux” 代表了未来的趋势,标准化的硬件+软件的组合,可以令更多OEM厂商愿意去做差异化设计。Linux是开放源代码的操作系统,直接带来的就是开发成本的降低。另外,Linux不仅在系统资源上占用率较低,在高性能运算上又能媲美Windows,而良好的可扩展性和可维护性也是其优势所在,所以,“ARM+Linux”毫无疑问成为了嵌入式开发的主流组合6。Qt是跨平台的应用程序和UI框架。它包括跨平台类库、集成开发工具和跨平台 IDE。使用Qt,只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。所以本设计采用先在PC机上实现应用程序的编写,再跨平台移植到ARM硬件平台上的方法来实现嵌入式应用程序的开发。俄罗斯方块(Tetris)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。俄罗斯方块曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。本设计选择开发“俄罗斯方块”游戏不仅具有技术上的可行性,而且开发成果也具有相当的现实意义。1.3 解决问题的思路、方法以及取得成果本设计的目的是在ARM开发板上运行“俄罗斯方块”游戏程序,而硬件平台选用的是Mini2440开发板,它采用了S3C2440微处理器,这款开发板低价实用,重要的是Mini2440开发板已经移植了基于Linux-2.6.32内核的嵌入式Linux操作系统,还提供了arm版本的QtE-4.6.3,配合用户手册,可以快速入门。本设计的研究内容主要分为以下2个步骤:第一,鉴于Qt的跨平台特性,可以利用Qt的相关类库,选择在PC机上完成“俄罗斯方块”游戏程序的设计。本设计使用的是Windows版本的Qt Creator软件,根据官方描述,Qt Creator 的设计目标是使开发人员能够利用 Qt 这个应用程序框架更加快速及轻易的完成开发任务。游戏程序的设计需要解决几个关键的问题:方块的数据结构、方块的移动、碰撞和消行等。另外由于开发板屏幕分辨率为320*240,所以窗口界面的大小和布局要特别注意。游戏统一使用键盘操作,后续还可以扩展诸如计分,难度设置、颜色调节等等的功能。第二,由于PC机是X86结构,Mini2440是ARM架构,所以设计好的游戏程序必须通过嵌入式交叉编译以后才能在开发板上运行。因此,嵌入式交叉编译环境的搭建成为了游戏移植过程的关键。QTEmbedded是NOKIA公司的图形化界面开发工具Qt的嵌入式版本,本设计采用的是4.5.2版本,配置环境需要在PC机Linux环境下,Linux系统可以通过虚拟机安装,方便快捷。交叉编译工具需要提前安装,选用的是Mini2440配套的arm-linux-gcc-4.3.2,接着下载对应Qt/Embedded源码包,解压以后要配置编译参数,编译源码的过程非常漫长,大概需要三个小时,之后设置环境变量,再通过嵌入式交叉编译俄罗斯方块的游戏程序,将生成的目标文件下载到开发板上运行即可8。开发板外接USB接口键盘后,可以直接对游戏进行操作。2 需求分析2.1 硬件需求2.1.1 嵌入式处理器嵌入式处理器是嵌入式系统的核心,是控制、辅助系统运行的硬件单元。范围极其广阔,从最初的4位处理器,目前仍在大规模应用的8位单片机,到最新的受到广泛青睐的32位,64位嵌入式CPU。嵌入式处理器典型的特点就是工作稳定性高,功耗较小,对环境的适应能力强,体积小,且集成的功能较多。嵌入式处理器可以分成以下几类:(1)嵌入式微处理器 嵌入式微处理器是由通用计算机中的CPU演变而来的。它的特征是具有32位以上的处理器,具有较高的性能,当然其价格也相应较高。但与计算机处理器不同的是,在实际嵌入式应用中,只保留和嵌入式应用紧密相关的功能硬件,去除其他的冗余功能部分,这样就以最低的功耗和资源实现嵌入式应用的特殊要求。和工业控制计算机相比,嵌入式微处理器具有体积小、重量轻、成本低、可靠性高的优点。(2)嵌入式微控制器 嵌入式微控制器的典型代表是单片机,从70年代末单片机出现到今天,虽然已经经过了20多年的历史,但这种8位的电子器件目前在嵌入式设备中仍然有着极其广泛的应用。单片机芯片内部集成ROM/EPROM、RAM、总线、总线逻辑、定时/计数器、看门狗、I/O、串行口、脉宽调制输出、A/D、D/A、Flash RAM、EEPROM等各种必要功能和外设。和嵌入式微处理器相比,微控制器的最大特点是单片化,体积大大减小,从而使功耗和成本下降、可靠性提高。(3)嵌入式DSP处理器 DSP处理器是专门用于信号处理方面的处理器,其在系统结构和指令算法方面进行了特殊设计,具有很高的编译效率和指令的执行速度。在数字滤波、FFT、谱分析等各种仪器上DSP获得了大规模的应用。(4)SoC片上系统 SoC追求产品系统最大包容的集成器件,是目前嵌入式应用领域的热门话题之一。SOC最大的特点是成功实现了软硬件无缝结合,直接在处理器片内嵌入操作系统的代码模块。而且SOC具有极高的综合性,在一个硅片内部运用VHDL等硬件描述语言,实现一个复杂的系统。ARM属于嵌入式微处理器的范畴,本文的研究目标是基于ARM的程序开发,所以本设计采用三星公司推出的16/32位RISC微处理器S3C2440A,它为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。为了降低整体系统成本,S3C2440A提供了一系列丰富的内部设备。S3C2440A采用了ARM920t的内核,0.13um的CMOS的标准宏单元和存储器单元。其低功耗,简单,优雅,且全静态设计特别适合于对成本和功率敏感型的应用。它采用了新的总线架构Advanced Micro controller Bus Architecture(AMBA)。S3C2440A的杰出特点是其核心处理器(CPU),是一个由Advanced RISC Machines有限公司设计的16/32位ARM920T的RISC处理器。ARM920T实现了MMU,AMBA BUS和Harvard高速缓冲体系结构。这一结构具有独立的16KB指令Cache和16KB数据Cache。每个都是由具有8字长的行组成。通过提供一套完整的通用系统外设,S3C2440A减少整体系统成本和无需配置额外的组建。2.1.2 开发板的选择目前ARM开发板在市场上种类繁多,有多种型号与多家厂商可供选择,对于ARM的研究前提就是选择一个好的开发板来做开发和学习。Mini2440是一款真正低价实用的ARM9开发板,是目前国内性价比最高的一款学习板;它采用Samsung S3C2440为微处理器,并采用专业稳定的CPU内核电源芯片和复位芯片来保证系统运行时的稳定性。mini2440的PCB采用沉金工艺的四层板设计,专业等长布线,保证关键信号线的信号完整性,生产采用机器贴片,批量生产;出厂时都经过严格的质量控制,配合用户手册,可以迅速掌握嵌入式 Linux和WinCE开发的流程,只要有C语言基础的人一般2周即可入门。目前提供的Linux和WindowsCE 5.0/6.0系统,在技术和功能上已经达到国内2440开发板中最高水平,它们各自的bootloader以及BSP均是100%开放的。Mini2440开发板的硬件资源主要包含以下几个部分:(1)CPU 处理器 Samsung S3C2440A,主频400MHz,最高533Mhz 。(2)SDRAM 内存 64M SDRAM和32位数据总线。(3)FLASH 存储 均为掉电非易失的256M Nand Flash和2M Nor Flash。(4)LCD 显示 标准配置为统宝3.5寸真彩 LCD屏,型号为W35,分辨率240x320,带触摸屏。(5)接口和资源 主要配备了 1 个 100M 以太网RJ-45 接口(采用DM9000 网络芯片)、3 个串行口 、1 个USB Host 、1 个USB Slave B 型接口 、1 个 SD 卡存储接口 、系统时钟源和实时时钟等等。(6)操作系统支持支持 Linux2.6.32.2 + Qtopia-2.2.0+QtE-4.6.1(独创双图形系统共存,无缝切换) 以及WindowsCE.NET 6.0(R3)。2.2 软件需求2.2.2 Qt简介 Qt拥有直观的的C+类库,Qt C+类库提供一套丰富的应用程序生成块,包含了构建高级跨平台应用程序所需的全部功能。具有直观,易学、易用,生成好理解、易维护的代码等特点7。 Qt还具有跨桌面和嵌入式操作系统的移植性,使用Qt,只需一次性开发应用程序,就可跨不同桌面和嵌入式操作系统进行部署,而无须重新编写源代码,可以说Qt无处不在。Qt有如下几个重要的特点: (1)使用单一的源代码库定位多个操作系统; (2)通过重新利用代码可将代码跨设备进行部署; (3)无须考虑平台,可重新分配开发资源; (4)代码不受担忧平台更改影响的长远考虑 ; (5)使开发人员专注于构建软件的核心价值,而不是维护 API 。 Qt作为一种跨平台的图形界面开发平台,可以直接建立在简单的帧缓冲驱动上,并且有良好的可配置、可裁剪特性,因此也经常用在嵌入式系统上。Qt支持一般图形界面系统的由事件驱动的变成模型,并且支持特有的信号与槽的变成模型,应用非常灵活。Qt拥有丰富的API和大量的开发文档,对于用户开发来说是非常方便的。经常多年的发展,Qt已经不单纯是一个图形界面开发平台,它对应用变成的各种领域(如网络、数据库等)都提供了自己的支持,功能非常强大。2.2.2 Qt Creator开发软件Qt Creator是跨平台的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收购后推出的一款新的轻量级集成开发环境(IDE)。此 IDE 能够跨平台运行,支持的系统包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。在功能方面,Qt Creator 包括项目生成向导、高级的 C+ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等。Qt Creator 主要是为了帮助新 Qt 用户更快速入门并运行项目,还可提高有经验的 Qt 开发人员的工作效率。它的优势主要有以下三个方面: 第一,使用强大的 C+ 代码编辑器可快速编写代码,语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能。 第二,使用浏览工具管理源代码,集成了领先的版本控制软件,包括 Git、Perforce 和 Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换。 第三,为 Qt跨平台开发人员的需求而量身定制 ,集成了特定于 Qt 的功能,如信号与槽 (Signals & Slots)图示调试器, 对 Qt 类结构可一目了然集成了 Qt Designer 可视化布局和格式构建器只需单击一下就可生成和运行 Qt 项目。2.2.3 VMWare虚拟机VMWare是一个虚拟PC软件,VMWare的产品可以使你在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。VMWare是真正“同时”运行,多个操作系统在主系统的平台上,就象标准Windows应用程序那样切换。而且每个操作系统你都可以进行虚拟的分区、配置而不影响真实硬盘的数据,你甚至可以通过网卡将几台虚拟机用网卡连接为一个局域网,极其方便。安装在VMware操作系统性能上比直接安装在硬盘上的系统低不少,因此,比较适合学习和测试。VMware虚拟机中自带的一种增强工具VMware Tools,相当于VirtualBox中的增强功能(Sun VirtualBox Guest Additions),是VMware提供的增强虚拟显卡和硬盘性能、以及同步虚拟机与主机时钟的驱动程序。只有在VMware虚拟机中安装好了VMware Tools,才能实现主机与虚拟机之间的文件共享,同时可支持自由拖拽的功能,鼠标也可在虚拟机与主机之前自由移动(不用再按ctrl+alt),且虚拟机屏幕也可实现全屏化。 VMware产品主要的功能有: (1)不需要分区或重开机就能在同一台PC上使用两种以上的操作系统。 (2)完全隔离并且保护不同OS的操作环境以及所有安装在OS上面的应用软件和资料。 (3)不同的OS之间还能互动操作,包括网络、周边、文件分享以及复制粘贴功能。 (4)有复原(Undo)功能。 (5)能够设定并且随时修改操作系统的操作环境,如:内存、磁碟空间、周边设备等等。 (6)热迁移,高可用性。本设计需要完成Qt/Embedded的环境搭建才能实现程序的跨平台移植,所以在计算机上还得安装Linux操作系统,通过VMware安装Linux操作系统,能够在Windows系统和Linux系统之间自由切换,方便技术开发。2.2.4 Linux操作系统Linux是一个免费的操作系统,用户可以免费获得其源代码,并能够随意修改。Linux的内核稳定、功能强大、支持多种硬件平台、应用软件多、兼容性好:内核可根据需要任意裁减以及使用成本低的特点非常适合嵌入式应用。Linux凭借自身诸多优势,进军嵌入式这个IT产业的新的关键领域。嵌入式Linux操作系统适时地出现在各嵌入式厂商面前,吸引了许多开发商地目光,成为嵌入式操作系统的新宠。由此可见,嵌入式Linux在理论研究和实际应用中都具有重要意义。 RedHat是美国RedHat公司的产品,是相当成功的一个Linux发行版本,也是目前使用最多的Linux发行版本。Red Hat最早由Bob Young和Marc Ewing在1995年创建。原来的Red Hat版本早已停止技术支持,目前Red Hat的Linux分为两个系列,其中一个是由Red Hat公司提供收费技术支持和更新的Red Hat Enterprise Linux系列;另一个是由社区开发的免费的Fedora Core系列。本设计在PC机上采用的Red Hat Enterprise Linux 5操作系统发布于1997年12月,它支持Intel、alpha和Sparc8平台和大多数的应用软件。极其简单易用的RPM模块化的安装、配置和卸载工具,使程序的安装可在15分钟内完成。软件升级也很方便,这对刚开始使用Linux的用户来说是一大福音。嵌入式linux 是将Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。一个嵌入式Linux系统从软件的角度看通常分为引导加载程序BootLoader、Linux内核、文件系统和用户应用程序。Bootloader是系统加电后运行的第一段代码,目的是加载操作系统,Linux内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性,文件系统是操作系统中负责管理和存储文件信息的软件机构,这些都已经在ARM开发板上实现,加上本设计完成的应用程序,就组成了一个完整嵌入式Linux系统。2.3 功能需求(1)基本功能:游戏区域顶部随机产生单个方块并下落,在此过程中通过操作方块的移动和旋转来进行游戏,直到方块填充到游戏区域底部并开始堆积。碰撞过程中检测到一行或多行完全填满,就将组成这些行的所有方块消除,同时增加积分。而不能消除的方块会一直堆积,如果方块堆积的高度达到游戏区域顶部,则宣布游戏结束。图2.1为俄罗斯方块游戏基本设计框图。(2)扩展功能:能够显示下一个将要出现的方块;自由选择难度,决定方块下落的速度;游戏随时可以暂停和恢复、或者重新开始;颜色可以随机变化以增强趣味性;“下”键可以自由调整,决定是直接下落到底还是加速下移。图2.1俄罗斯方块游戏基本设计框图2.4 游戏界面需求良好的游戏界面可以增强游戏的魅力,所以界面布局至关重要。mini2440开发板标配的3.5寸触摸屏W35分辨率为320*240。本文将游戏区域设置宽高大小为100*200。最小单位为10*10的小方块。用网格线划分后使游戏区域清晰明目。方块在这个区域内进行移动和旋转等变化。默认白色背景,绿色方块填充色和黑色方块边框。其余地方除了一个位置,用来显示下一个将出现的方块,还有的则设置成分数显示、按键说明等等。2.5 方块图形需求使用数组存储方块7 种基本状态的数据结构,分别为田字形、长条形、Z 字形、反Z 形、7 字形、反7 形和T 字型,如图2.2所示,每个方块都能够实现它的旋转变形,本设计采用的是逆时针旋转。田字形 长条形 Z 字形反Z 形 反7 形 7字形 T 字型图2.2 方块图3 系统设计3.1 qt creator安装与配置本设计的程序设计部分是在windows平台上来进行的,选用的开发软件是Qt Creator,安装程序为qt-creator-win-opensource-2.0.1.exe,而Qt的安装程序为qt-win-opensource-4.6.3-mingw.exe。首先安装Qt Creator,然后再安装Qt4.6.3,注意在安装Qt4.6.3时,要指定MinGW Installation目录为Qt Creator安装目录下的mingw文件夹,如图3.1所示。图3.1 Qt4.6.3安装mingw目录选择安装完成以后还需要进行配置,如图3.2所示打开Qt Creator软件,选择“Tools|Options”,在“Qt4”选项中点击“添加按钮”,设置qmake location为Qt4.6.3安装目录下的binqmake.exe,然后点击OK完成qt creator环境的搭建。图3.2 qmake配置3.2 模块实现系统源文件布局如下:图3.3 源文件布局“俄罗斯方块”游戏的设计需要实现3个类,分别为MyItem、Widget和GameArea,还需要一个用户界面的设计文件widget.ui。MyItem类:定义了基本的7种方块类,除此之外还实现了几个重要的类成员函数,getItem()函数随机选取一个图形,使游戏能够不断地生成不同的图形,currentItem_endPos()函数返回当前图形在其4*4网格中的位置信息,方便对方块在整个游戏区域的位置进行处理,itemChange()函数实现了方块按逆时针旋转改变其形状。Widget类:实现了定时器和按键的功能,这个类是可以整合到GameArea类中的,本设计将其独立开来可以更好的实现控制功能。对应的主要类成员函数函数有三个:changeEvent()函数能够重绘游戏界面,当界面语言变化时就刷新界面显示。timer_upDate()函数实现定时器处理,一个是方块到底的溢出处理,一个是方块到顶游戏结束的溢出操作,keyPressEvent()函数定义各个按键的功能。GameArea类:这个类是游戏功能类,重点包括游戏算法实现,界面绘制实现等等,对应的主要功能函数如下:init_gameArea()游戏区域的初始化函数,用来设定游戏界面。init_Game()首次进入游戏对变量初始化。gameStart()游戏运行入口函数。draw_gameArea()绘制游戏区域,包括网格和游戏区的方块。draw_Grid()绘制游戏区域背景的网格。draw_currentMap()绘制游戏区域上存在的方块。draw_nextItem()显示下一个要出现的图形。GameArea:paintEvent(QPaintEvent *e) /重绘事件(才能显示图形)isMoveEnd()判断图形是否移动到了最下面或和别的图形重合了。isMoveLeft()是否到最左边或和别的图形重合了。isMoveRight()是否到最右边或和别的图形重合了。do_itemChange()对改变图形后超出窗口或和别的图形重合进行处理。clearRow()清除已满的行。widget.ui是在Qt Creator的QT界面编辑器里完成的,通过拖取很多的控件摆放在上面,然后设置相关属性等来实现,设计完成的图形文件最后会转为ui_widget.h源码文件来进行程序编译。3.3 关键技术实现3.3.1 方块的数据结构游戏区域占据100(宽)*200(高)的界面空间,每个单元格以10为基本单位,方块得以在10*20的方阵中活动。按照游戏需求所述,方块共有7种基本形状,本设计使用一维数组存储方块的数据结构。“1”和“0”分别表示方块的填充和空白。详细存储方式如下所示: unsigned char item14*4=0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0;/田字形unsigned char item24*4=0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1;/长条形unsigned char item34*4=0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0;Z字形unsigned char item44*4=0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0;/反Z形unsigned char item54*4=0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0;/反7形unsigned char item64*4=0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0;/7字形unsigned char item74*4=0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0;/T形游戏过程中,需要产生随机形状方块,这可以通过调用QT库函数qrand()来实现,qsrand(time(0)配置随机种子,qrand()%7产生随机数。3.3.2 方块的旋转和移动本设计使用了一维数组0-15来表示4*4网格中的每个单元格,要求方块逆时针旋转90度,可以很容易得到旋转操作的算法。关键实现代码如下: for(int i=0;i4;i+) for(int j=0;j4;j+) *(tempItem +(3-j)*4+i)=*(currentItem +i*4+j);/坐标转换 i为行,j为列。由当前数组currentItem保存到临时数组tempItem中,方块在进行选择以后还要进行检测是否越界,左超界让其靠左,右操作让其靠右,此外,下边超界意味着不能进行旋转操作,所以在进行旋转操作之前需要备份数组,然后恢复原图形。如图3.4是左侧越界调整示意图。图3.4 旋转方块左侧越界调整方块的移动有向下、向左和向右三个操作。重点就是检测方块是否与下、左、右边界或者其他图形重合。这里拿方块与左边界或者左边图形是否重合来说,首要解决的问题就是要得到当前方块在其所在的4*4网格中的位置信息,其中实现方块从左边向右数占用4*4网格第几列的关键代码如下所示:for(int col=0;col4;col+)for(int row=0;row4;row+)if(*(currentItem+row*4+col)/数组中有方块填充就返回列数return col;col为列,row为行,扫描整个4*4网格得到当前方块在最左边的位置item_endLeft。item_Col为4*4网格左边缘在整个100*200游戏区域中的位置,只要满足item_Col+item_endLeft0;i-) /从下向上扫描整张网格 for(int j=0;j0;row-) for(int col = 0;colstart(1000);然后update()槽每秒被触发一次。start()函数参数改变可以调节触发速率,以此改变游戏难度,timer-stop()可以随时停止定时器以实现游戏暂停的功能。 这里运用到了信号与槽的机制。信号(SIGNAL)和槽(SLOT)是Qt编程的一个重要部分。这个机制可以在对象之间彼此并不了解的情况下将它们的行为联系起来。Qt 组件有很多预定义的信号,同时,我们也可以通过继承这些组件,添加自定义的信号。槽则能够响应特定信号的函数。Qt 组件有很多预定义的槽,但是更常见的是,通过继承组件添加你自己的槽,以便你能够按照自己的方式处理信号。槽和普通的c+成员函数很像。不同之处在于一个槽函数能和一个信号相连接,只要信号发出了,这个槽函数就会自动被调用,这个任务是由connect函数来实现的。信号与槽的连接示意图3.4如下:图3.6 信号与槽的连接示意图槽能够被用于接收信号,也能够像普通函数一样使用。正如一个对象并不知道究竟有没有别的对象正在接收它的信号一样,一个槽也不知道有没有信号与它相连。这保证了使用 Qt 可以创建真正相互独立的组件10。 定时器溢出有2种情况,一种情况是检测到游戏运行结束了,这时候使用QMessageBox类成员函数warning()来弹出警告对话框,点击对话框”yes”可以重新开始游戏。关键代码如下:QMessageBox:warning(this,tr(warning),tr(Game Over!),QMessageBox:Yes);另一种情况是方块已经下移到最底下了,这时候需要进行一下几步操作:this-gameArea-nextItem(); /出现下一个图形 int num = this-gameArea-getFullRowNum(); /获得已满的行数 this-doScore(num); /显示分数 this-gameArea-gameStart(); /继续游戏3.3.5 UI设计和游戏区域的绘制1、UI的设计本设计最终实现好的UI界面如图3.5所示,游戏界面上并没有使用按钮的操作,只是通过标签的形式,说明了各个按键的功能。界面左边是游戏区域,小边框显示的是下一个要产生的方块,游戏过程中,分数和难度数值的动态改变只要即时改变标签显示内容即可。如下是改变分数值的函数代码:void Widget:doScore(int num) score += num*100;this-ui-label_2-setText(tr(%1).arg(score);/改变对应标签内容num是应该消除的行数,本设计以1行100分来计算得分,第2个标签显示的就是得分,在程序代码中改变这个标签内容也就相应改变了得分的显示。图3.7 游戏界面示意图界面使用图形窗口设计,widget.ui在建立工程以后会自动转换为源码文件ui_widget.h,而在widget类构造函数中,调用函数ui-setupUi(this)使得UI界面和widget类建立联系,QWidget类成员函数resize()用来定义游戏界面大小,使用setWindowTitle(tr(Tetris(zhoujunhao)设置窗口标题栏的内容 1。2、游戏的绘制在UI系统中,不同的widget会经常发各种消息,通常UI系统都会把这些消息和消息参数规范化,QT把消息类型和消息参数都封装到QEvent及其子类中,同时定义了QObject:event(QEvent *e)函数来处理各种QEvent,这就是QT的event机制。信号通过事件实现,事件可以过滤,事件更底层,事件是基础,信号是扩展。当一个事件产生时,Qt 通过实例化一个 QEvent 的合适的子类来表示它,然后通过调用 event() 函数发送给 QObject 的实例(或者它的子类)。event() 函数本身并不会处理事件,根据事件类型,它将调用相应的事件处理函数,并且返回事件被接受还是被忽略。一些事件,比如 QMouseEvent 和 QKeyEvent,来自窗口系统;有的,比如 QTimerEvent,来自于其他事件源;另外一些则来自应用程序本身2。QPaintEvent是个类,继承于QEvent,包含了绘画的事件。当控件本身更新的时候,绘画事件会发送到控件,对于实例来讲,这种事情一般是遮住他的控件移动了,导致其需要重绘。void QWidget:paintEvent ( QPaintEvent * )是虚函数,只要窗口部件需要被重绘就被调用。每个要显示输出的窗口部件必须实现它。这个事件处理器可以在子类中被重新实现来接收绘制事件。它可以是 repaint() 或 update() 的结果。很多窗口部件在当它们被请求时,它们很简单地重新绘制整个界面。QPainter类是在窗口部件上实现绘制的绘图工具类。QPainter可以绘制从简单的直线到像饼图和弦这样的复杂形状。它也可以绘制排列的文本和像素映射。本设计利用QPainter类相关成员函数来实现游戏界面的绘制4。游戏背景的网格可有可无,并不影响游戏的进行,若需要让方块直接下落到底,增进游戏操作节奏,添加网格背景就能使得方块的位置更加清晰明目,便于游戏。网格的绘制首先需要使用函数painter.setPen(Qt:DotLine)定义绘笔风格为点线,DotLine就是指由一些像素分隔的点,然后进行绘图。如下代码是绘制网格区域横线的关键代码;for(int i=0; igameArea_width,i*step);map_row指网格行数10,for循环中从第一行开始到最后一行绘制点线,这里使用的函数void QPainter:drawLine ( int x1, int y1, int x2, int y2 );绘制从(x1, y1)到(x2, y2)的直线并且设置当前画笔位置为(x2, y2),利用这个函数快速绘制直线。网格竖线的绘制方法与此相似。绘制方块前,用函数painter.setPen()设定方块边框颜色,用painter.setBrush()设定画刷用了填充方块颜色,之后扫描整个游戏网格区域,网格数组中,只要检测到值为1就证明有方块,然后利用QPainter成员函数drawRect()绘制矩形就可以了,关键代码如下:for(int i=0;imap_row;i+) for(int j=0;jkey() case Qt:Key_S : break; case Qt:Key_P : break; default: QWidget:keyPressEvent(event); 本设计除了实现几个基本按键操作外,还有一些扩展功能。所有的功能按键如图3.6所示:图3.8 键盘事件功能说明这里Key_Down键定义了两个功能,一个是只让方块加速下移一步,另一个是使方块直接下落到底,通过Key_D键盘可以对这两个功能进行切换。Key_Down键每次按下都会进行判断,默认功能是加速下移。Key_C
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 建筑环境 > 建筑工程


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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