基于51单片机的俄罗斯方块游戏毕业设计论文


     基于单片机的俄罗斯方块游戏设计 摘 要 俄罗斯方块是一款风靡全球的益智游戏。它规则简单,容易上手,且游戏过程变化无穷,使用户在游戏中得到乐趣。 本文讨论了一种基于增强型单片机硬件平台和实时操作系统的智能俄罗斯方块游戏的设计与实现。该设计选用的处理器型号为STC12C5A60S2的单片机,实时操作系统采用适用于8051处理器的RTX51 Tiny多任务实时操作系统。重点从软件工程角度论述了俄罗斯方块模型构造,图形旋转,坐标变换,双人游戏中多任务实时操作的设计法方,以及背景音乐的处理等技术。同时,该设计的独创性是在8051系列单片机中使用操作系统实现了双人游戏和音效的添加。 关键词:单片机;RTX51;LCD;俄罗斯方块 ABSTRACT Tetris is a section became popular in the world of puzzles.The rules are simple, easy to operate and the game process changes.Users in the game to get fun. This paper discussed a method based on enhanece microcontroller hardware platform and real-time operating system of intelligent Tetris game of design and implementa- tion.This design multi-back STC12C5A60S2 single-chip processor regult and real-time operating system adopt suitable for the 8051 processor RTX51 of multi-tasking real- time operating system.This paper mainly discusses the from software engineering tetris model of structure,graphics rotation,coordinate transform,the double game multitasking real-time operating design,and the background music of the formation of technology.At the same time,the design originality in the 8051series micro- controller is used in the operating system realizing double game and sound add. Key words: singlechip;RTX51;LCD;Tetris 目 录 摘 要 I ABSTRACT II 1 绪 论 1 1.1 课题背景 1 1.2 课题的主要研究内容 1 1.3 课题的研究现状及意义 1 2 系统硬件平台设计 2 2.1 STC12C5A60S2单片机概述 2 2.2 STC12C5A60S2最小系统 3 2.3 电源系统 3 2.4 振荡电路 3 2.5 复位系统 4 2.6 程序下载系统 5 2.7 音乐播放系统 6 2.8 LCD液晶显示接口电路 6 2.9 操作控制接口 7 3 系统软件平台构建 8 3.1 μVision简介 8 3.2 LCD12864液晶屏显示原理 8 3.2.1 LCD模块总线选择及时序 8 3.2.2 LCD显示RAM区映射概况 9 3.2.3 LCD的驱动方法 10 3.2.4 LCD驱动程序架构 10 3.3 俄罗斯方块游戏设计 11 3.3.1 俄罗斯方块游戏功能简介 11 3.3.2 系统界面的设计 12 3.3.3 游戏系统“枚举算法”概述 14 3.3.4 俄罗斯方块造型设计的方法 15 3.3.5 随机产生俄罗斯方块的方法 15 3.3.6 俄罗斯方块平移的实现方法 17 3.3.7 俄罗斯方块旋转的实现方法 18 3.3.8 俄罗斯方块下移的实现方法 20 3.3.9 满行检测及消行功能的实现方法 21 3.3.10 游戏积分的计算方法 22 3.4 双人俄罗斯方块游戏设计 24 3.4.1 RTX51 Tiny简介 24 3.4.2 RTX51 Tiny的内核分析 24 3.4.3 游戏开发环境的配置 27 3.4.4 双人单机对战模式的实现流程 28 3.5 系统背景音乐的设计 28 3.5.1音乐的设计原理 28 3.5.2 音乐播放的实现方法 30 3.5.3 音效程序流程 30 3.6 系统主程序流程图 31 4 产品功能说明与系统性能测试 32 4.1 产品功能说明 32 4.2 系统性能测试 33 5 结束语 33 参考文献 35 致 谢 1 绪 论 1.1 课题背景 如今,计算机系统的发展已明显地朝三个方向发展,这三个方向就是:巨型化,单片化,网络化。对于解决复杂计算和高速数据处理的问题仍然是巨型机在起作用,因而,目前巨型机正在朝高速及高处理能力的方向发展。单片机在出现时Intel公司就给其单片机取名为嵌入式微控制器[4]。单片机的最明显的优势,就是可以嵌入到各种仪器、设备中。这一点是巨型机和网络不可能做到的。单片机在内部已集成了趆来趆多的部件,这些部件包括一般常用的电路,例如:定时器,比较器,EEPROM,D/A转换器,串行通信接口,Watchdog电路等。 同时,俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,目前在网络单机游戏和kele8等上都有它的身影。而它曾经造成的轰动与经济价值可以说是游戏史上一件大事。因此,对它的研究,无论从技术上,还是社会意义上看都是很有价值的。 单片机在游戏上的应用是具有非常大的潜力的,它能将游戏带入到另一个阶段。此次设计仅仅是为了举一个单片机在游戏应用方面的简单例子,它可以很好的说明单片机功能的强大,体现其更高的可控性和高集成度的好处,因此它可以在电子游戏方面成为一个不可计量的明日之星。 1.2 课题的主要研究内容 本课题研究和实现了基于8051+RTX51到Tiny平台下的智能俄罗斯方块游戏系统。主要研究内容是实现智能俄罗斯方块游戏系统软硬件平台的搭建;本系统以8051微处理器为核心来运行RTX51 Tiny多任务实时操作系统,利用KEIL C51开发工具进行软件开发,通过LCD12864液晶屏显示游戏界面。该设计能实现单人单机游、双人单机对战游戏、游戏背景音乐的播放和单人最高积分存储等功能。 在俄罗斯方块游戏系统开发过程中,本文作者首先进行硬件平台的搭建,包括单片机最小系统的搭建、电源系统的搭建、串口下载器的设计、游戏手柄的设计、音效播放模块的设计以及LCD液晶显示接口的设计。然后,作者才开展软件平台的构建,这也是本设计的重要部分,主要包括对RTX51 Tiny操作系统的配置、俄罗斯方块模型的设计、模型图块的旋转及坐标变换设计、双人单机对战游戏设计和音效系统设计等。最后,从硬件和软件两方面对完成的智能俄罗斯方块游戏系统进行调试及运行试验。 1.3 课题的研究现状及意义 现今国内外的俄罗斯方块游戏设计主要有基于PC机上Windows平台的俄罗斯方块游戏、基于手机平台的智能俄罗斯方块游戏以及基于单片机平台的俄罗斯方块游戏等。前两种属于高端游机,性能优越,但成本高,而且计算机编程已不是新命题,VB、VC、Delphi版本的俄罗斯方块游戏都有发布[9]。 从学术角度来看,针对俄罗斯方块游戏的开发,国内外也有不少学者展开过研究,比如Niko将进化算法引入到俄罗斯方块中并验证了其有效性,Hoogeboom探讨了俄罗斯方块游戏的构造问题,王宇等针对存在于俄罗斯方块中的两个数学问题提出解决方案,高凌琴探讨游戏功能要求、数据结构、图形旋转、坐标变换等关键技术,胡代弟在SPCE061A单片机实现了俄罗斯方块游戏[10]。 综上,国内外的研究多着重于游戏数学原理的讨论,也有部分文献涉及游戏的具体实现,但多是在Windows操作系统下实现的,在单片机平台下的开发俄罗斯方块游戏鲜少有文献刊载。而单片机由于具有体积小、性能突出、价格低廉等特点,应用领域不断扩大,除了工业控制、智能化仪表、家用电器外,在智能化高档电子玩具产品也大量采用单片机芯片作为核心控制部件。曾经80年代非常流行的掌上游戏机便是单片机在电子玩具中的应用之一,其中的俄罗斯方块游戏现已被我们所熟知。 本文探讨基于8051单片机硬件平台和RTX51 Tiny多任务实时操作系统的俄罗斯方块游戏的设计与实现,将理论与实践相结合。其主要目标是再现经典的俄罗斯方块游戏,并在此基础上实现双人单机对战游戏模式,以丰富产品功能,增强游戏的趣味性。 2 系统硬件平台设计 2.1 STC12C5A60S2单片机概述 STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051系列单片机,指令代码完全兼容传统8051,但速度快8~12倍。用户程序空间为60KB,片上集成1280字节RAM,具有EEPROM功能,能够额外储蓄1KB的数据。该单片机共有4个16位定时器,两个与传统8051兼容的定时器/计数器,即16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,此两路可编程计数器阵列(PCA)可用来再实现2个定时器。此外,STC12C5A60S2内部还集成MAX810专用复位电路,2路PWM,8路高速度10位A/D转换(250K/S),针对电机控制,强干扰场地合。 综上所述,STC12C5A605S2单片机具有许多强大的功能,能够满足大多数用户对8位单片机的要求。 2.2 STC12C5A60S2最小系统 单片机最小系统主要由电源、振荡、复位电路以及扩展电路等部分组成。在本设计中,扩展了液晶显示接口。因此,本设计的最小系统如图2-1所示。 图 2-1 STC12C5A60S2最小系统 Fig 2-1 STC12C5A60S2 Minimum System 2.3 电源系统 本设计的电源系统比较简单,直接由LM7805稳压芯片输出的+5V电源供电。具体电路如图2-2所示。 图片2-2 电源系统 Fig 2-2 Power System 2.4 振荡电路 单片机系统里都有振荡电路,在单片机系统里晶振作用非常大,全称叫晶体振荡器,它结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率趆高,那么单片机运行速度就趆快,单片机的一切指令执行都是依靠单片机晶振提供的时钟频率。[4] 晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。本设计中STC12C5A60S2使用12MHz的晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF至50pF之间。如图2-3所示即为本设计的振荡电路。 图 2-3 振荡电路 Fig 2-3 oscillatory circuit 2.5 复位系统 MCS51单片机通常采用上电自动复位和按钮复位两种方式。通常因为系统运行等需要,常常需要人工复位,本设计采用按钮复位的方式,即按下开关一定时间就能使RTS引脚端为高电平,从而使单片机复位。同时,简单复位电路中,干扰信号易串入复位端,由此可能会引起内部某些寄存器错误复位,这时可在RST引脚上接去耦电容。在STC12C5A60S2单片机中有两个复位端口,即RST/P4.7、RST2/P4.6,当晶振频率小于或等于12MHz时,使用RST端口。由于本设计使用外接12MHz的晶振作为振荡时钟,所以采用如图2-4所示的复位系统。 图 2-4 复位系统 Fig 2-4 Rest System 2.6 程序下载系统 单片机系统的传统编程方式是先将单片机从电路板上取下,放入专用的编程器进行编程,再放入电路板进行调试。其缺点是频繁拔插器件容易损坏器件的引脚;如果频繁的调试程序,必须重复拔插,大降低了开发效率。ISP(在线系统编程)技术是一种无需将存储芯片从嵌入式设备上取出就能对其进行编程的过程。其优点是,即使器件焊接在电路板上,仍可对其进行编程。在线系统可编程是Flash存储器的固有特性(通常无需额外电路),Flash几乎都采用这种方式编程。 ISP的实现相对要简单一些,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写。对于8051系列单片机来讲可通过SPI接口或其它的串行接口接收上位机传来的数据并写入存储器中。而上位机PC机与下位机单片机通过RS-232串行接口总线进行的串行通信。8051系列单片机带有一个全双工的串行接口,因此用RS-232串行接口总线非常方便。PC机配置RS-232标准接口,RS-232信号电平为负逻辑(逻辑“0”为+12V ;逻辑“1”为-12V),8051单片机输入、输出电平为TTL电平(逻辑“0”为小于等于0.5V;逻辑“1”为大于等于2.4V)。所以8051单片机与PC机间点对点异步通信需加电平转换电路,否则将烧坏TTL电路。MAX232是MAXIM公司生产的电平转换器件,只需在外部接入相应的电解电容即可。因此,本设计采用直连串口线进行串口通信,其中STC12C5A60S2的P3^0/RXD和P3^1/TXD分别和下载器的第10管脚/T和第9管脚/R相连,串口线的第5管脚接地,2、3管脚和下载器的7、8管脚相连。具体电路如图2-5所示。 图 2-5 程序下载系统 Fig 2-5 Program Download System 2.7 音乐播放系统 在本设计中,音乐播放系统是通过三极管驱动有源蜂鸣器发声,而具体的音符声调则由程序控制。因此,音乐播放系统的硬件电路非常简单。具体接法为有源蜂鸣器正极直接接+5V电源,负极与三极管8050的发射极相连,8050的集电极直接接地,其基极串一个1K的电阻连接到STC12C5A60S2单片机的P2^0端口。如图2-6所示。 图片2-6 音乐播放系统 Fig 2-6 Music Player System 2.8 LCD液晶显示接口电路 液晶显示屏是整个系统硬件的重要组成部分,担当着人机交互的重要角色。本设计采用铭正同创公司生产的MzL02D-12864液晶点阵屏作为显示器件。它是一块128*64点阵的LCD显示模组,模组上的LCM采用COG技术将控制(包括显存)、驱动器集成在LCM的玻璃上,接口简单、操作方便。其特点为单电源供电,对比度编程可调,可采用并行接口为6800/8080时序或者串行SPI的MPU接口方式,整块液晶屏由3.3V的白色LED背光,美观大方。其外部接口分为电源端口、数据端口和命令端口三部分组成。本设计中LCD的数据端口连接到STC12C5A60S2单片机的P0端口,LCD的命令端口连接到单片机的P2端口。具体硬件电路如图2-7所示。 图 2-7 LCD液晶显示接口电路 Fig 2-7 Liquid Display Interface Circuit 2.9 操作控制接口 操作控制模块是智能俄罗斯方块游戏系统的输入器件。它包括主控制器和辅助控制器。主控制器包括七个按键,分别为:旋转/确定、向左/返回上级菜、向右/下一个、快速下降、使用道具、暂停、退出。副控制器则包括五个按键,分别为:旋转/确定、向左/返回上级菜、向右/下一个、快速下降、使用道具。在硬件电路方面辅控制器比主控制器少两个按键的连接。如图2-8所示为主控制器的接线图。与单片机的具体接口可根据实际设定。 图片2-8 控制模块接口 Fig 2-8 Control Interface 3 系统软件平台构建 3.1 μVision简介 μVision是德国Keil公司开发的单片机IDE软件,最初主要用于8051系列单片机,目前也有支ARM系列单片机的专用版本MDK-ARM。本设计使用的是keil μVision3版本的开发软件进行程序开发。 3.2 LCD12864液晶屏显示原理 3.2.1 LCD模块总线选择及时序 MzL02D模块提供了两个LCM的引脚(C86和PS引脚)供用户选择模块的接口类型,分别可以选择6800并行总线、8080并行总线或者SPI串行接口。模块默认情况下PS为高电平、C86为高电平,此时为6800总线接口类型,本设计采用6800总线模式。在此种接口模式下,WR 线为读写控制信号线,当WR 为高电平时为读状态,WR为低电来时为写入状态。在6800总线接口模式下LCD的时序如图3-1所示。 图 3-1 6800总线时序 Fig 3-1 6800 Bus Timing 3.2.2 LCD显示RAM区映射概况 驱动控制芯片的显示RAM区中,每个byte的数据对应屏上的点的排列方式为:纵向排列,低位在上高位在下;如图3-2所示。MzL02D-12864液晶显示模组的显示器上的显示点与驱动控制芯片中的显示缓存RAM是一一对应的;共有65(8Page * 8bit + 1)*132个位的显示RAM区。而显示器的显示点阵大小为64*128点,所以实际上在液晶显示模块中有用的显示RAM区为64*128个位;按byte为单位划分,共分为8个Page,每个Page为8行,而每一行为128个位。(即128列)。 图 3-2 字节数据排列情况 Fig 3-2 Byte data arrangement MzL02D-12864液晶显示模块的显示屏上的每一个点都对应有控制器片内的显示缓存RAM中的一个bit,显示屏上64*128个点分别对应着显示RAM的8个Page,每一个Page有128个byte的空间。因此可知显示RAM区中的一个Page空间对应8行的点,而该Page中的一个byte数据则对应一列(8个点)。 用户如要点亮LCD屏上的某一个点时,实际上就是对该点所对应的显示RAM区中的某一个位进行置1操作,所以就要确定该点所处的行地址、列地址。MzL02-12864液晶显示模组的行地址实际上就是Page的信息,每一个Page应有8行;而列地址则表示该点的横坐标,在屏上为从左到右排列,Page中的一个Byte对应的是一列(8行,即8个点),达128列。可以根据这样的关系在程序中控制LCD显示屏的显示。 3.2.3 LCD的驱动方法 在很多资料以及书籍当中,通常介绍有两种 LCD模块的连接方法:直接控制和间接控制;直接控制实际指的是 LCD模块的总线接口直接与MCU端口连接,然后 MCU 通过程序控制端口来模拟 LCD的总线时序来完成对其的控制操作;而间接控制指的是MCU本身就有外部总线拉出,与LCD的总线接口对应的连接上,程序中直接操作总线以控制LCD。目前有很多MCU 都把总线密封起来了,都没有引出外部总线;所以通常在用MCU控制LCD模块时,时常会选择直接控制的方式,即利用端口来模拟总线时序;当然了,如果本身就有总线而且也与LCD模块的总线配得上的话,肯定会使用总线连接的间控方式。 本设计采用直接控制的方式,将MzL02D-12864 LCD模块的总配置为6800总线,这与绝大部分引出外部总线的MCU的时序是不一样的。本设计的LCD12864模块中,用户程序对其进行显示控制时,无非就是通过对LCD模块内部的驱动控制器当中的寄存器进行设置操作;最常用的如LCD的显示开/关、操作显存地址(行与列地址)的设置等。这些寄存器一般都在LCD模块的驱动控制器文档中有详细介绍。 3.2.4 LCD驱动程序架构 LCD12864驱动程序主要由LCD底层驱动和LCD功能函数两部分组成。用户在应用层直接使用功能函数即可。具体框架如图3-3所示。 功能函数层 字库 驱动层函数声明 功能函数 LCD配置 驱动层 传输模式及IO端口配置 数据传输驱动 应用层 用户应用程序 功能函数声明 图 3-3 LCD驱动程序架构 Fig 3-3 LCD Driver architectures 3.3 俄罗斯方块游戏设计 3.3.1 俄罗斯方块游戏功能简介 俄罗斯方块游戏的规则很简单,当方块从屏幕上方落下来时,玩家控制方块的位置以及旋转方块,巧妙地安排布置达到充分利用屏幕空间的目的。每当屏幕的一整行被方块排满时,作为奖赏,整行从屏幕上消失,剩余的方块依次往下降一行。当方块堆积达到无法再落下方块的时候,游戏结束。本设计中游戏主要的功能点包括: (1) 每4个小方块可以组合成一组方块群,游戏共有7种方块群,每次随机产生一种;玩家使用向左、向右、快速向下这些按键控制方块的位置,旋转按键控制方块顺时针旋转。在主控制手柄上还有退出、暂停按钮,可以实现随时切换到启动时的状态和暂停游戏的功能。 (2) 在本设计中,系统为玩家提供了背景音乐,玩家可以根据个人喜好开启或关闭音效。 (3) 单人模式下,玩家使用主控制器进行操作。每消去一行,系统就给玩家加1分。在单人模式下,如果积分超过系统记录的最高积分,系统将更新最高积分。 (4) 本设计的亮点是实现双人对战游戏,通过主控制器在菜单选项中选择双人模式,第二玩家可以通过副控制器对第二游戏界面进行操作。本游戏系统规定,双人对战游戏中积分可分为两个阶段。第一阶段是普通积分阶段,即双方玩家每消去一行,其相应积分表加1分;第二阶段是多积分阶段,即每消去三行才获得1个积分。双方先达到第二阶段末尾者,即可取胜。同时,该设计中还为双方玩家增加了道具功能,即当使用该功能时,可令对手当前移动图块消失,随机出下一个图块。当玩家一次性消去三行,就能获得一次道具功能,最多一次性累积2个道具。系统默认为每个玩家提供1个道具。这样不仅丰富了俄罗斯方块游戏的功能,而且使其更具趣味性。 3.3.2 系统界面的设计 (1) 菜单选项界面 当玩家将本设计的作品上电启动后,系统首先在LCD显示器件上呈现一个动态的开机动画。然后,系统提供三个功能选项,即最高积分、游戏设置、开始游戏。其中,“游戏设置”选项包含了两级子菜单。一级菜单包括“模式选择”和“音效选择”。在这两个选项后面给出单字提示,以说明当前相应设置选项的状态。“模式选择”菜单包含的二级子菜单有“单人模式”和“双人模式”。“音效选择”菜单包含的二级子菜单有“开音效”和“关音效”通过控制按键即可设置成相应状态。“最高积分”菜单选项为玩家提供单人模式下系统记忆的最高积分。如果选择了“开始游戏”菜单选项,则系统根据“游戏设置”选项中的设置启动相应的游戏界面。菜单选项界面框架如图3-4所示。 菜单功能界面框架 最高积分 游戏设置 开始游戏 模式选择 音效选择 单人模式 双人模式 开音效 关音效 图 3-4 菜单选项界面框架 Fig 3-4 The menu option interface framework (2) 游戏操作界面 首先,我们先来介绍单人模式下游戏界面的一些情况。在启动单人模式后,LCD12864显示屏分成两屏,左半屏为俄罗斯方块游戏地图——map区,右半屏为俄罗斯方块图形预览区和实时积分显示区。其结构框架如图3-5所示。 启动单人模式 左半屏 图形预览 游戏map区 右半屏 积分显示 图 3-5 单人模式界面结构框架 Fig 3-5 The single-player game interface architecture 其次,如果玩家启动的是双人模式,LCD12864显示屏也分为两屏,左屏由主控器操作,称为map1区,右屏由副控制器操作,称为map2区。在两屏中间是双方积分显示区和各自的道具数量显示区。其结构框架如图3-6所示。 双人模式 双方积分进度条 双方道具使用情况 积分和道具区 Map2区 map1区 图 3-6 双人模式界面结构框架 Fig 3-6 Double mode interface architecture 系统界面整体程序流程图如图3-7所示。 N Y Y N N Y Y N Y 单人模式 音效选择 模式选择 游戏设置 双人模式 音效关 音效开 清模式标志 置模式标志 返回上一级 清音效标志 置音效标志 返回上一级 开机 启动动画 进入主菜单 显示单人最高积分 返回按键 最高积分 开始游戏 进入游戏 游戏设置 模式选择 音效选择 …… …… 图 3-7 开机界面功能框架 Fig 3-7 Boot interface function frame 3.3.3 游戏系统“枚举算法”概述 本文绕开了涩难懂、比较复杂的“矩阵算法”,提出了另一种“枚举算法”来实现这个经典游戏。“枚举算法”没有复杂的数学理论、避免了在程序中大量使用矩阵运算公式,设计思路清晰、明了,非常适合游戏设计的初学者理解和实现。 所谓枚举算法,就是直接枚举出游戏中各图块的基本形状和它们的旋转形状,然后控制每一种不同形状的方块在游戏戏中的产生、移动、旋转、落下、填满和清除等游戏过程。 3.3.4 俄罗斯方块造型设计的方法 众所周知,俄罗斯方块一般有七种基本形状,每个基本形状都由4个正方形的小方块构成。利用小方块不同的摆放位置,可产生19种旋转型图块。这七种图形分别是“I型”、“L型”、“反L型”、“Z型”、“反Z型”、“口型”、“T型”。如图3-8所示。 I型 L型 反L型 T型 Z型 反Z型 口型 图 3-8 方块模型 Fig 3-8 Square model 本系统在构造19个方块模型时的思路是:定义一个数组,用以存储各个模型中4个小方块的顶点坐标。比如L型,其数据结构为{0,0,0,4,0,8,4,8}。其中,每两个数据为一个小正方形的列、行坐标,如图 3-9所示。由图可知,整个界面的坐标原点在左上角,分别向右、向下作为横轴的正方向和纵轴的正方向。图中每一格代表了LCD12864中的连续四行,第1格的坐标是(0,0);第2格的坐标是(0,4);第3格的坐标是(0,8);第4格的坐标是(4,8);其它图块也按此方法编辑数组内容。 2 3 4 1 图 3-9 L型 Fig 3-9 L Shape 3.3.5 随机产生俄罗斯方块的方法 (1) 产生随机数的理论依据 为了实现随机落下各类方块图形,游戏过程序中必须抽取随机数来确定方块的类型。随机数是一个既简单又复杂的问题。 本设计采用众所周知的线性叠加法,虽然没有完美的方法产生随机数,不过线性叠加法是一个合适的方法,它彻底解决了8位机随机数的问题。如果从一个足够长的数字序列中的某一个点取出一边串的数字,那么这些数字就看似随机。这个开始的点(数字)叫做种子。如果从相同的点(种子)开始,将会得到相同的数字,这是因为我们是从固定的序列中取数字(所以叫伪随机)。但这却是一个有用的特性,我们可以每次从不同的点取数,即改变种子,从而可以实现真正的随机。 (2) “线性叠加法”的概况 “线性叠加法”其实只涉及二个内容即:乘法和加法。只需三个步骤即:第一,为了取得新的种子,旧的种子与一个常数A相乘;第二,所得的结果和第二个常数C相加;第三,新的种子就是第二步结果的低32位。保留低32位很重要,用来获得下一个种子。计算公式为: 种子 = A * 种子 + C (3-1) 此公式在几何图中表示为一条直线,而且新种子由旧种子反复相加得来,所以叫线性叠加。随机函数的关键在于选择优秀的“常数A”(也叫乘数A),其实也就是选择了一个固定的数字序列。“常数C”,不像乘数A那样重要,但是一定是个奇数。事实上,C可选1。因为奇数(旧的种子)乘奇数(乘数A)是奇数,再加奇数(常数C)将会是一个偶数学偶数(旧的种子)乘奇数(乘数A),加奇数(常数C)将会是一个奇数。如此种子会在奇数和偶数之间转变。因为种了的变化足够随机,所以种子的值可以作为8位或16位随机数。 (3) Keil C51中“线性叠加法”的实现方法 在Keil C51中生成伪随机数需要用到两个函数,一个是srand(unsigned int seed),一个是rand()。首先给srand(unsigned int seed)提供一个种子,该种子为unsigned int类型,其取值范围从0到65536,srand(unsigned int seed)根据这个种子会由上述特定的公式生成一个随机数序列;然后调用rand(),它会依次从这个序列中返回一个数,其值在0 到32767之间。因随机数函数rand()函数实际上是线性随机的,如果在不指定srand(unsigned int seed)的种子的情况下,它每次都使用默认的种子,因此生成的序列会是同一个,所以会取到相同的数字序列。这可能会导致每次重新运行游戏时其随机数结果都是一样的。为了解决该问题,本设计在玩家进入游戏时读取按键按下瞬间定时器T0的计数值,作为srand(unsigned int seed)的种子。从而实现真正的随机。 (4) 随机数程序流程图 如图3-10为随机数程序流程图。 srand(unsigned int seed)产生一数据序列 开始游戏 读取T0计数值作为seed rand() 将返回值进行处理后选择相应的方块数组 图 3-10 随机数程序流程图 Fig 3-10 Ramdom process flow program diagram 3.3.6 俄罗斯方块平移的实现方法 方块产生后,需要用全局变量来保存方块在游戏map区中的行坐标和列坐标。方块的平移包括左移和右移两种情况,无论那种情况都要首先进行合法性判断。 (1) 俄罗斯方块平移特性 在本设计中规定当按下一次左移或右移按键时,map区中的当前图块就左移或右移一个正方形的宽度。而一个小正方形的宽度,则对应着LCD12864中的4列。 (2) 平移合法性判断 平移的合法性判断经较简单,只需判断它旁边相邻位置是否被填充即可。 (3) 平移算法的实现 在程序中,当有任意一个平移按键被按下时,系统接收到信号,然后调用平移函数进行判断其合法性,得到该函数的返回值为1后,再进行平移操作。其程序流程如图3-11所示。 返回1 返回1 返回0 Y Y N N …… 左移按键被按下 right_left_judge函数 …… 列变量f_x减4行不变 右移按键被按下 列变量f_x加4行不变 right_left_judge函数 将图块左移一格 将图块右移一格 图 3-11 平移算法流程图 Fig 3-11 Translation algorithms flowchart 3.3.7 俄罗斯方块旋转的实现方法 (1) 俄罗斯方块旋转图形概况 方块旋转是一个游戏实现的关键问题,实现旋转的数学方法有多种,如矩阵变换法、枚举法、索引法等。本文前面已经论述了此次设计采用枚举的方法,对19种俄罗斯方块造型进行构造。游戏过程中,每一种基本方块都要做旋转控制,于是就产生了旋转后的方块形状,本文将其称为“旋转型”。 基本型中的“I型”,只有一种旋转型,即由竖直旋转90度后成为水平。因此,基本型加上一种旋转型,共有两种形状。 基本型中的“L型”和“反L型”有三种旋转型,将它按顺时针每旋转一个90度就产生一种旋转型,可以旋转三次,得到三种不同的旋转型,因此,它的三种旋转型加上其基本型,“L型”和“反L型”方块分别有四种形状。 基本型中“Z型”和“反Z型”可以顺时针旋转一次90度,加上他们的基型分别有两种形状。 基本型中的“T型”有三种旋转型,将他按顺时针旋转一个90度就产生一种旋转型,它可以旋转三次,得到三种不同的旋转型,因此,它的三种旋转型加上其基本型,“T型”方块共有四种形状。 基本型中的“口型”方块没有旋转型,在游戏中只有一种形状。 综上所述,七种基本型方块,因旋转产生了不同的旋转型,这些旋转型加上他们的基本型,整个游戏中,共有19种不同的方块形状。 本设计实现旋转操作的具体方法,可分为两类,一类是I型的旋转策略;另一类则是其余17种基本型的旋转策略。 (2) 旋转合法性判断 方块做顺时针旋转,每次旋转90度。本设计规定只要旋转后到达的地方未被填允,方块就可以进行旋转操作。 (3) I型的旋转策略 为了在视觉上实现I型的顺时针旋转,本设计采用位置错落的方式来实现。其具体过程如图3-12所示。 ① ② ③ ④ 图 3-12 I型的旋转方法 Fig 3-12 The rotation method of I shape 当落下的图块是图①所示时,其旋转周期为 ①——②——③——④——①。 当落下的图块是图②所示时,其旋转周期为 ②——③——④——①——②。 之所以把I型的旋转变换单独拿出来讨论,是因为I型只有基本型和旋转型共两种图块。如果在当前位置直接按这两种图块的坐标数组进行图形切换,则无法实现顺时针旋转的视觉效果。所以,在旋转处理程序中,当要旋转的当前图块为I型及其旋转型时,就要改变当前列、行这两个全局变量的值。 (4) 其余17种基本型的旋转策略 除了I型的旋转比较复杂外,其余17种类型的方块只需按各自旋转的顺序在当前位置用已经编辑好的坐标数组来实现旋转即可。具体程序流程如图3-13所示。 N Y Y Y N N Y N …… 按下旋转键 是否是I型、一型 判断方块经过了几次旋转 判断新位置是否可写 判断是哪类图块 I型及其旋转型 其它17种类型 …… 根据上述判断的结果决定当前位置行、列坐标的增减 进行旋转变换 是否是I型、一型以外的其它类型 按照已经排列好的变换顺序取坐标数据 恢复原先坐标 …… 图 3-13 旋转程序流程图 Fig 3-13 Rotating program flowchart 3.3.8 俄罗斯方块下移的实现方法 在整个游戏过程中,方块是不断向下运行的,其下移特性为:方块每次下移的格数对应着LCD12864屏幕中的一行。具体程序实现流程如图3-14所示。 Y N Y N Y N 进入下移判断程序 读取下移一行后每个小方块的行列坐标 判断每个小方块的行在LCD显示区中的哪一页 上半页 下半页 是否可写 标志加1 标志是否为4 程序返回1 是否循环了4次 程序返回0 图 3-14 下移判断程序流程图 Fig 3-14 Moves down judgment program flowchart 3.3.9 满行检测及消行功能的实现方法 随着方块的不断累积,方块每次下落到不能再运动时,系统就会检测游戏map区,当检测到map区中某一行堆积满后,系统就消去此行,作为奖励,其上方的方块群则依次下落一行。系统满行检测和消行功能是通过“满行检测及消行”函数实现的,即在每个图块落定和下一个图块未出来之前,按页扫描游戏map区,每半页算一行。若检测到某行被填满,则消去此行,并将其上方的图块往下移动相应的行数。 具体程序实现流程如图3-15所示。 Y N Y N Y N 某一方块已落定 进入满行检测程序,页标志n=7 从第n页开始检测 检测当前页的下半页 是否满行 消除此行,其上方块依次下落一行 检测当前页的上半页 是否满行 消除此行,其上方块依次下落一行 n减1 是否是第0页 退出 图 3-15 满行检测程序流程 Fig 3-15 Full line detection processes 3.3.10 游戏积分的计算方法 在游戏系统中,积分体现了玩家在此次游戏中的操作情况。本游戏系统分单人模式和双人模式两种积分计算方式。 单人模式下,玩家每消去一行,就能获得1个积分,如果当前游戏积分超过系统记录的单人最高游戏积分,则系统将更新记录,以便其他玩家挑战。 双人模式下,双方的积分制度是一样的,以进度条的方式展示在积分与道具区。其中积分区分为两个阶段,第一阶段每消去1行进度条向上走一格,共8个进度格;第二阶段每累计消去3行进度条才向上增加一格,共6个进度格。双方谁先到达进度条的顶端就算胜利。 当一次性同时消去3行时,则能获得一个道具功能的使用权。最多能累积两个道具。具体程序实现流程如图3-16所示。 N Y Y N Y N Y N Y N 消去一行 当前积分加1 是否大于最高纪录 存储当前积分 退出 单人模式下 双人模式下 增加n分,消去n行 消去n行? n>0 n>=3? 增加1道具 道具是否小于2个? 增加1道具 进度是否到顶? 结束所有进程 返回游戏 图 3-16 积分系统程序流程图 Fig 3-16 Score system program flowchart 3.4 双人俄罗斯方块游戏设计 3.4.1 RTX51 Tiny简介 许多微处理器应用程序要求同时执行多个任务。对于这样的应用程序,一个实时操系统(RTOS)允许灵活的分配系统资源(中央处理器、存储器等)给各个任务。RTX51它可以运行于所有的8051派生机型,是一个很好使用的强大的准并行实时操作系统。 RTX51可以简化那些复杂而且时间要严格的工程软件设计工作。有两个不同的RTX51版本可以利用:RTX51 Full和RTX51 Tiny。二者的主要区别是前者是可以强占(或者说可剥夺的)系统而后者是不可以强占的(不可剥夺的)。RTX51 Full版本是完整版,它使用四个任务优先级来完成,同时存在时间片轮转调度和抢先的任务切换。RTX51 Full工作在与中断功能相似的状态下,信号和信息可以通过邮箱系统在任务之间互相传递。程序员可以从一存储池中分配和释放内存,也可以强迫一个任务等待中断、超时或者是从另一个任务或中断发出的信号或信息。而本游戏系统采用的RTX51 Tiny是RTX51完整版的子集,它完全集成在Keil C51的集成开发环境中。自身仅占用900字节左右的程序存储空间。RTX51 Tiny仅支持时间片轮转任务切换和使用信号进行任务切换。不支持抢先式的任务切换,不包括消息历程,没有存储器池分配程序。 RTX51 Tiny虽然比较简陋,但它还是具备了一些实时操作系统的基本要素,又因为它完全集成在Keil C51的集成开发环境中,可以使用户把更多的精力关注在应用本身而无需考虑复杂的底层驱动,而且整个应用软件系统结构清晰,维护方便,可节省大量的时间和人力。当程序比较复杂时,它的优点就体现得更明显。RTX51 Tiny完全可以充当我们进入实时操作系统(RTOS)世界的领路者,更为重要的是,它是免费的。无论如何,RTX51 Tiny仍然是在8位单片机中应用操作系统的首选。 3.4.2 RTX51 Tiny的内核分析 该小节只介绍本设计中用到RTX51 Tiny系统的相关知识与配置方法。读者若想更全面了解RTX51 Tiny多任务实时操作系统,请阅读RTX51 Tiny的帮助文件或其它相关文件。 (1) RTX51 Tiny程序的编写方法 若要使用RTX51 Tiny的内核,只需包含文件RTX51TNY.H即可。所有的运行时库常量都在这个头文件中定义。可以采用以下方式包含它: #include <rtx51tny.h> 当使用Rtx51 Tiny时,要为每个任务建立独立的任务函数。同时,RTX51 Tiny任务必须是用_task_声明的C函数,返回值和参数都必须是void类型的, RTX51 Tiny程序不需要用户自已定义main函数,取而代之的是,RTX51 Tiny从任务0开始执行。在典型的应用中,任务0简单的建立所有其他的任务。 (2) 系统调用函数简介 RTX51 Tiny内核完全集成在KEIL C51编译器中,以系统函数调用的方式运行,因此可以很容易地使用KEIL C51语言编写和编译一个多任务程序,并嵌入到实际应用系统中,内核提供多组函数供应用程序引用。 (3) RTX51 Tiny的任务状态 RTX51 Tiny 的用户任务具有以下几个状态: RUNNING: 任务处于运行中,同一时间只有一个抢占任务可以处于“RUNNING”状态。 READY :任务正在等待运行,在当前运行的任务时间片完成之后,RTX51 Tiny运行下一个处于“READY”状态的任务。 WAITING: 任务由于时间片用完而处于“TIME OUT”状态,并等待再次运行。该状态与“READY”状态相似,但由于是内部操作过程使一个循环任务被切换而被冠以标记。如图3-17所示为任务状态转换图[8]。 信号或超时到来 等待信号或超时 时间片结束 时间片到来 READY/TIMEOUT RUNNING WAITING 图 3-17 任务状态转换图 Fig 3-17 Task state transition diagram (4) RTX51 Tiny的同步机制 为了能保证任务在执行次序上的协调,必须采用同步机制。内核用以下事件进行任务间的通信和同步。 ①SIGNAL:用于任务之间通信的位,可以用系统函数置位或清除。如果一个任务调用os_wait函数等待SIGNAL而SIGNAL未置位,则该任务被挂起直到SIGNAL置位,才返回到READY状态,并可被再次执行。 ②TIMEOUT:由os_wait函数开始的时间延时,其持续时间可由定时节拍数确定。带有TIMEOUT值调用os_wait函数的任务将被挂起,直到延时结束,才返回到READY状态,并可被再次执行。 ③INTERVAL:由os_wait函数开始的时间间隔,其间隔时间可由定时节拍数确定。带有INTERVAL值调用os_wait函数的任务将被挂起,直到间隔时间结束,然后返回到READY状态,并可被再次执行。与TIMEOUT不同的是,任务的节拍计数器不复位。 (5) RTX51 TINY的任务切换方式 任务切换是RTX51 TINY提供的基本服务。RTX51 TINY是基于时间片调度算法的操作系统,它支持的是非抢占式的任务切换。所以在一个任务被执行时不能对其进行中断,除非该任务主动放弃CPU的资源,中断才可以打断当前的任务,中断完成后把CPU的控制权再交还该被中断的任务。 任务切换的流程如图3-18所示[8]。 TASK SWITCHING SWITCHING NOW 寄存器组切换 当前任务时间片到标志置位 查找下一个“READY”状态的任务N 对任务N堆栈管理 重置任务N节拍数 任务N因时间片到转入就绪状态 任务N因等信号且信号到,转入就绪状态 任务N因等超时且超时到,转入就绪状态 任务N因其他原因转入就绪状态 清除时间片到标志 清除等待信号及信号到标志 清除等超时及超时标志 恢复因T0中断保护的现场 返回任务N执行,任务N成为当前任务(SWITCHING出口) 返回任务N执行,任务N成为当前任务 (SWITCHING NOW出口) 图 3-18 任务切换流程图 Fig 3-18 Task switching flowchart 任务切换方式分为两种:循环任务切换方式和协作任务切换方式。如果禁止了循环任务处理(如何禁止此方式在RTX51 Tiny系统配置一节中再作介绍),就必须让任务以协作的方式运作,用户可以用os_wait 函数或os_switch_task函数让RTX51 Tiny切换到另一个任务而不是等待任务的时间片用完。 os_wait函数挂起当前的任务(使之变为等待态)直到指定的事件发生(接着任务变为就绪态)。在此期间,任意数量的其他任务可以运行。 具体做法是在每个任务里调用os_wait函数或os_switch_task函数,以通知RTX51 Tiny切换到另一个任务。os_wait函数与os_switch_task函数的所不同是:os_wait函数是让任务等待一个事件,而os_switch_task函数是立即切换到另一个就绪的任务。 3.4.3 游戏开发环境的配置 (1) Keil的配置 编译和链接RTX51 Tiny应用程序有2种途径,一种是使用集成开发环境μVision 3 IDE,另一种是使用命令行工具CommandLine Tools。一般采用德国Keil Software公司提供的集成开发环境 μVision 3 IDE。 利用Keil Software公司提供的集成开发环境 μVision 3 IDE,创建RTX51 Tiny应用程序的开始的步骤如下: ① 运行Keil Software公司的集成开发环境 μVision 3 IDE。 ② 运行菜单命令Project→Options for Target‘Target 1’,打开Target对话框,并在对话框中选择Target选项卡。 ③ 从Operating下拉列表框中选择RTX-51 Tiny。 (2) RTX51 Tiny系统内核配置 建立了嵌入式应用后,RTX51 Tiny必须要配置。所有的配置设置都在CONF_TNY.A51文件中,该文件位于“KEIL C51/RTXTINY2“目录下。 CONF_TNY.A51默认包含在RTX51 Tiny库中。μVision 3 IDE编译RTX51 Tiny程序时已将CONF_TNY.A51文件拷贝到工程目录下并将其加入到工程中。通过改变CONF_TNY.A51中的设置来定制RTX51 Tiny的系统配置。 下面仅对本设计中所需做的系统配置进行详细介绍。 ① 在系统默认配置下应用程序设计中出现的问题 首先,在双人模式下,应用程序中的两个进程都需要对LCD12864显示屏进行读写操作。在多任务实时系统下就会出现“资源冲突”的问题。 其次是函数的重入性问题。 还有就是多个指针型数据在任务中使用的问题。C51编译器允许使用多个数据指针。RTX51 Tiny对他们不进行管理,所以在应用中必须确保在改变数据指针时不会发生round-robin切换。 ②具体配置方法 为解决上述问题,本设计禁止循环任务切换,采用协助任务切换的方式进行多任务间的切换。Round-robin切换是默认使能的,以下参数用来设定Round-robin切换的时间或禁能Round-robin切换。IMESHARING 指定任务在进行Round-robin切换前执行的RTX51 Tiny时钟节拍数。当这个值为0时禁止Round-robin切换。缺省值是5个时钟节拍。 如果禁止了round-robin多任务切换,必须设计将应用程序要执行的任务以Cooperative 任务切换的方式工作。特别地,必须在每个任务的某个地方调用os_wait函数或os_switch_task函数。这些函数告知RTX51 Tiny切换到另一任务。函数os_wait 和函数os_switch_task的不同之处在于os_wait函数可以让任务等待某一事件的发生,而函数os_switch_task函数直接切换到另一个准备就绪的任务。 3.4.4 双人单机对战模式的实现流程 本系统实现的双人游戏模式是建立在单人游戏模式的基础上的。其基本思路是利用RTX51 Tiny多任务实时操作系统来完成多个事件的准并行实行运行。其中进程0和进程1的程序流程是大致相同的。如图3-19所示为双人模式下的相关程序流程。 3.5 系统背景音乐的设计 3.5.1音乐的设计原理 对于单片机产生音乐,关键是控制频率的输出。我们知道,乐谱中每一个音符都与某一个特定的频率相对应,产生某种频率的输出就可以得到相应音符的声音。音乐中,有8个基本音符:do、re、mi、fa、so、la、xi、do,八个不同的音符对应着不同的频率。为了使单片机能输出美妙的音乐,曲谱不仅需要包含音名的信息,而且还要包含有节拍的信息。因此,本设计采用的是一种音名同节拍混排的一种方式来对曲谱进行的编码。即按照下列方法进行编码:一个字节共八位,高两位表示节拍,三四位表示音高,低四位表示音符。节拍是两位,有四种状态,表示四种节拍;音高是两位,有四种状态,表示三种不同的音高(低音、中音、高音);音符用四位表示,有十六种状态,来表示每个调的十二种不同的音符。这些乐谱数据的生成是由乐谱生成器来产生的。 在本设计中,RTX51 TINY允许同时“准并行”地执行多个任务,各个任务是在预先设定 Y N Y Y Y N Y N Y N Y N Y N Y N Y N 游戏配置为双人模式 启动游戏 进程0 进程1 使用协助方式进行任务切换 速降信号 平移信号 平移信号 道具信号 速降信号 道具信号 执行相关平移操作 执行相关平移操作 执行速降操作 执行速降操作 下移操作 下移操作 执行道具功能 执行道具功能 积分统计 积分统计 使用协助方式进行任务切换 积分到上限 积分到上限 停止游戏 停止游戏 图 3-19 双人游戏程序流程图 Fig 3-19 Double game processes flowchart 的时间片内执行的。CPU执行时间被划分为若干时间片,RTX51 TINY为每个任务分配一个时间片,在一个时间片内允许执行某个任务,然后RTX51 TINY切换到另一个就绪的任务并允许它在其规定的时间片内执行。这个过程的实现是RTX51 TINY利用单片机内部定时器T0的中断功能实现的。此外STC12C5A60S2单片机提供了用PCA模块实现16位定时器的功能。所以本设计通过控制内部PCA模块构成的定时器产生不同频率的脉冲,从而驱动蜂鸣器发出相应频率的声音,而发音时间的长短用定时器T1来控制。 3.5.2 音乐播放的实现方法 把乐谱中的音符对应的频率转换成PCA定时器常数,相应的节拍变为T1常数。通过对歌谱编码,程序可以到编码数组中取出音符的频率及节拍数据,然后将所取的数据经过系统的处理后,将音调定时时间和节拍定时时间送入相应的定时器。数据处理过程中的相关计算如下: (1) 音频脉冲的产生方法:算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,然后利用PCA定时器计时此半周期时间,每当计时到后就将输出脉冲的I/O取反,然后重复计时此半周期时间再对I/O取反,如此就可在I/O脚上得到此频率的脉冲。 (2) 让STC12C5A60S2单片机的内部计时器T1工作在计数模式MODE1下,改变计数值TH1及TL1以产生不同的频率。 (3) 以6MHz晶振为例:要产生频率为523Hz,其周期T=1/523=1912us,半周期为1912/2=956us,因此,只要令定时器计时956us/1us=956。所以在每计数956次时将I/O反相,就要以得到中音D0(523Hz)。 计数脉冲值与频率的关系公式如下: N=Fi/2/Fr (3-2) N:计数值 Fi:内部计时一次2us,以6MHz晶振为例,故其频率为500000Hz Fr:要产生的频率 (4) PCA定时器计数值的求法如下: T=65536-N=65536-Fi/2/Fr (3-3) 3.5.3 音效程序流程 本设计的音乐播放程序流程比较简单,其难点是设计人员对乐谱的认识和各种定时时间的计算。具体流程如图3-20所示。 Y N Y N N 开音效 初始化各定时器及数据针指 顺序读取音符数组中的数据 根据调号及升降八度生成新的频率表 计算音符时间长度值,将值赋给相应的定时器 T1计数到? PCA定时到? 音乐结束? 图 3-20 音效程序流程图 Fig 3-20 Sound program flowchart 3.6 系统主程序流程图 本小节主要是对整个系统主要的流程进行描述。对于每个任务的具体实现流程在前几节已经详细介绍过,在此用省略号表示,不再赘述。本节只对总体框架和前面没介绍到的部分功能进行描述,使文章结构的更加完整和帮助读者理顺思路。读者可以结合前文来阅读本节内容。相关流程如图3-21所示。 Y N N Y 开机 选项菜单 游戏设置 开始游戏 单人游戏 双人游戏 音效开关 退出游戏 暂停游戏 结束进所有进程 …… 图 3-21 主程序流程图 Fig 3-21 Main program flowchat 4 产品功能说明与系统性能测试 4.1 产品功能说明 本设计制作了一款智能俄罗斯方块游戏机。它主要实现以下功能:单人游戏模式、双人模式游戏以及音效嵌入等。整个作品硬件由+5V电源、STC12C5A60S2单片机、LCD12864液晶显示屏、主控制手柄和副控制手柄构成。每部分的详细介绍可以在本文的前面章节进行查阅。 启动系统后,首先出现的是一个动态的进度条。当此进度条结束后有三个功能选项呈现在界面上。玩家可以通过主控制器的“向下”按钮将光标指针进行移动,当按下“确定”按钮后进入相应选项程序。当按下“退出”按钮,则返回功能选项菜单界面。其中,第一个选项是“最高积分”查看选项,玩家选择此选项后能够查看单人模式中积分的最高记录。第二个选项是“游戏设置”选项,当玩家选择此选项后将进入一个二级菜单,在里面玩家可以选择是进入“模式选择”项还是“音效选择”项。当玩家进入“模式选择”项后可以将游戏配置为“单人模式”或“双人模式”;若玩家进入的是“音效选择”项,则可以将设置游戏中是否启动背景音乐。 当玩家将游戏系统配置为单人模式时,玩家只能使用主控制器对游戏界面进行操作。其中主控制器中的各个按钮的功能为:“旋转/确定”按钮可以实现方块的旋转,“向左/返回上级”按钮可以实现方块左移,“向右”按钮可以实现方块右移,“向下”按钮可以实现方块的快速向下移动,“道具”按钮可以实现在双人模式下的道具功能的使用。以上是副控制器也同样具有的按键功能。此外,主控器还有两个按钮,它们的功能是:“返回”按钮可以实现从正在运行的程序返回到“功能选项”界面;“暂停”按扭可以实现将游戏界面停止在当前状态。 当玩家将游戏系统配置为双从模式时,玩家可以增加副控制器来对第二界面进行操作。副控制器的按键功能在主控制器的相关介绍中已经进行了说明。 当玩家将游戏系统配置为开音效时,在游戏开始后,方块将伴随着音乐随机出现和下落。 如果玩家想从重新设置游戏模式和音效模式,就必须停止当前游戏,返回功能选项界面,进入“游戏设置”选项进行设置。 4.2 系统性能测试 系统性能测试的相关结果如表1所示。 表4-1 模式 旋转 左移 右移 速降 消去 积分 道具 返回 暂停 存储 音效 单人 实现 实现 实现 实现 实现 实现 —— 实现 实现 实现 实现 双从 实现 实现 实现 实现 实现 实现 实现 实现 实现 —— 实现 通过测试,本设计成功的实现了毕业选题所要求的全部功能,并在要求之外扩展了道具、积分存储等功能。 5 结束语 本文讨论了一种基于STC12C5A60S2单片机和RTX51 Tiny时实操作系统的俄罗斯方块游戏系统的设计开发,通过LCD12864液晶显示屏进行显示,设计并实现了智能俄罗斯方块游戏的多项功能。本文着重结合LCD12864的硬件特性探讨了游戏的数据结构、图形处理、游戏控制以及音乐处理等技术。 该设计实现了基于8位单片机上的俄罗斯方块游戏设计和开发,其功能包括单人模式、双人模式和音乐播放等功能。还可以在界面美化、人机对战等方面加以改进和完善。这对在低端处理器上实现多功能游戏开发具有非常好的借鉴意义。 参考文献 [1] 阎石.数字电子技术基础.第五版.北京:高等教育出版社,2006. [2] 童诗白.模拟电子技术基础.第四版.北京:高等教育出版社,2006. [3] 谭浩强.C语言程序设计.北京:清华大学出版社,2005. [4] 姜志海.单片机原理与应用.北京:电子工业出版社,2005. [5] 张培仁.基于C语言编程MCS-51单片机原理与应用.北京:清华大学出版社,2002. [6] 晨风.嵌入式实时多任务软件开发基础[M].北京:请化大学出版社,2004. [7] 刘明路,王亮生,李世煜.基于RTX51的单片机软件设计[J].单片机与嵌入式系统用,2002. [8] KEIL Software Inc.RTX51 Real-time Kernel[OL], 2004. [9] 高凌琴,陈青华.俄罗斯方块关键技术探讨,2005. [10] 赵东跃.俄罗斯方块编程,2001. 致 谢 在此次毕业设计中,我从XX老师身上学到了很多东西。老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我受益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我的实践创新能力得到较大的提升,这对于我以后的工作和学习都有着巨大的帮助,感谢他耐心的辅导与教诲。 另外,在游戏开发过程中我的同学和网友也给予我很大的帮助,使我解决了不少的难点,从而让本游戏系统能及时设计完成,这里一并表示感谢。 同时,也向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位老师表示衷心地感谢。 本文档由香当网(https://www.xiangdang.net)用户上传

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 8 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    基于AT89S51单片机无线传输系统设计毕业设计

    毕业论文(设计) 题 目: 单片机无线传输系统设计 完 成 人: ...

    4个月前   
    207    0

    基于51单片机的数字温度计毕业设计

    数字测温计设计摘要:随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术。在工业生产中温度是常用的被控参数,而采用单片机来对这些被控参数进行控制...

    1个月前   
    169    0

    基于51单片机压力检测系统设计毕业设计

     学号: xx 大 学 毕业设计(论文) (xxxx届) 题 目 ...

    2年前   
    1047    0

    论文:基于51单片机的智能充电器的设计

    在我们的日常生活中,手机已经变得越来越重要了。我们经常需要使用手机,打电话、发短信、上网、看电影、听歌、玩游戏等等。随着大屏幕和高主频的手机出现,锂离子电池就变得更加重要了,其锂离子电池充电器也...

    2年前   
    879    0

    基于单片机的鱼缸控制器设计毕业设计论文

    基于单片机的鱼缸控制器设计 摘 要 本文是基于单片机的鱼缸控制器的设计,目前市场上有各种各样的观赏类的鱼缸,进入了不同的应用场合,如家庭、宾馆和商场等等,但现有的鱼缸一般需要人为的...

    2年前   
    1271    0

    基于51单片机的智能窗帘控制系统

     毕业论文(设计) 学 院: 工学院 ...

    1个月前   
    105    0

    基于AT89C51单片机的简易计算器的设计

     毕 业 设 计 题目 简易计算器的制作 ...

    2年前   
    1377    0

    基于51单片机数字温度计设计课程设计

    课 题: 基于51单片机数字温度计设计专 业: 电子信息工程班 级: 班学 号: 姓 名: ...

    4周前   
    177    0

    基于51单片机音乐盒课程设计

    基于51单片机音乐盒课程设计 课程名称: 微机原理课程设计 题 目: 基于51单片机的音乐盒设计 摘要 随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。小小的...

    2年前   
    666    0

    关于单片机毕业设计论文

    关于单片机毕业设计论文  单片机毕业设计论文如下文  第一章 绪 论1. 1 课题的提出及意义  单片机作息时间控制实现了对时间控制的智能化,摆脱了传统由人来控制时间的长短的不便,实现代学校必...

    9年前   
    316    0

    基于Java的俄罗斯方块的设计与实现毕业论文

    本科生毕业论文(设计)基于Java的俄罗斯方块的设计与实现 姓  名学  号专  业指导教师 2013年X月X日摘 要俄罗斯方块作为一款风靡全球的多样化终端游戏,经...

    1个月前   
    260    0

    基于单片机的智能鱼缸的设计与实现毕业设计

    近年来嵌入式发展迅速,智能家居也进入了人们的生活。智能鱼缸却没有快速发展。我根据市场上相关设备现状的分析和研究,从系统集成角度进行设计和开发,提出了一套多功能的智能观赏鱼缸控制系统的设计方案。

    2年前   
    1799    0

    基于单片机的空调温度控制系统设计毕业设计

     毕业设计  题 目 基于单片机的空调温度控制系统设计 学生姓名 学 号 学 院 计算机与信息工程系 专业班级 指导...

    2年前   
    1304    0

    基于单片机的语音门铃设计毕业设计

    在现代电子产品中, 由于电子音乐门铃具有悦耳动听,价格低廉,耗电少等优点,在现代家居中的应用越来越流行。本毕业设计是基于单片机的“叮咚”门铃,通过单片机控制输出频率,由音频功率放大器LM386放...

    8个月前   
    414    0

    基于单片机的电子密码锁设计毕业设计

     ####工业大学城市学院 毕业设计说明书 作 者: 李xx 学 号: 09xx 系: 信息工程 ...

    2年前   
    639    0

    基于单片机的彩灯控制器设计毕业设计

     题目: 基于单片机的节日彩灯控制器的设计 作 者 姓 名: 学 号: ...

    1个月前   
    92    0

    基于单片机的智能温控风扇设计毕业设计

    XX职业技术学院毕业设计论文作者 学号 系部 电子信息学院 专业 物联网应...

    5个月前   
    188    0

    基于单片机的乒乓球游戏系统的设计

    基于单片机的乒乓球游戏系统的设计姓 名:学 号:专业班级: 院(系): 设计时间: 设计地点: 指导教师评语: ...

    2个月前   
    221    0

    基于AT89C51单片机多人抢答器设计(无仿真)

     单位代码 学  号 分 类 号 ...

    3周前   
    61    0

    基于AT89C51单片机的鸡舍温度控制系统

    基于AT89C51单片机制作一个温度控制器,用于自动接通电加热或制冷设备,从而使鸡舍内温度达到设想温度的要求,并能实时显示室内温度。当室内温度低于设定下限温度时,控制器连通电加热设备,当室内温度...

    3年前   
    13771    0

    文档贡献者

    文***享

    贡献于2020-12-26

    下载需要 8 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档