《本科毕业设计--基于51单片机的俄罗斯方块游戏.doc》由会员分享,可在线阅读,更多相关《本科毕业设计--基于51单片机的俄罗斯方块游戏.doc(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2011203讲师曾繁政15078159503黄忠南物理与电子信息工程系07106171232007级电气工程及其自动化基于单片机的俄罗斯方块游戏设计基于单片机的俄罗斯方块游戏设计独 创 性 声 明本人郑重声明:所呈交的毕业论文(设计)是本人在指导老师指导下取得的研究成果。除了文中特别加以注释和致谢的地方外,论文(设计)中不包含其他人已经发表或撰写的研究成果。与本研究成果相关的所有人所做出的任何贡献均已在论文(设计)中作了明确的说明并表示了谢意。签名: 年月日授权声明本人完全理解贺州学院有关保留、使用本科生毕业论文(设计)的规定,即:学院有权保留并向国家有关部门或机构送交毕业论文(设计)的复印
2、件和磁盘,允许毕业论文(设计)被查阅和借阅。本人授权贺州学院可以将毕业论文(设计)的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编论文(设计)。本人论文(设计)中有原创性数据需要保密的部分为(如没有,请填写“无”):签 名: 年月日指导教师签名: 年月日基于单片机的俄罗斯方块游戏设计摘 要俄罗斯方块是一款风靡全球的益智游戏。它规则简单,容易上手,且游戏过程变化无穷,使用户在游戏中得到乐趣。本文讨论了一种基于增强型单片机硬件平台和实时操作系统的智能俄罗斯方块游戏的设计与实现。该设计选用的处理器型号为STC12C5A60S2的单片机,实时操作系统采用适用于805
3、1处理器的RTX51 Tiny多任务实时操作系统。重点从软件工程角度论述了俄罗斯方块模型构造,图形旋转,坐标变换,双人游戏中多任务实时操作的设计法方,以及背景音乐的处理等技术。同时,该设计的独创性是在8051系列单片机中使用操作系统实现了双人游戏和音效的添加。关键词:单片机;RTX51;LCD;俄罗斯方块ABSTRACTTetris 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
4、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 fo
5、r 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 tech
6、nology.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;TetrisI目 录摘 要IABSTRACTII1 绪 论11.1 课题背景11.2 课题的主要研究内容11.3 课题的研究现状及意义12 系统硬件平台设计22.1 STC12C5A60S2单片机概述22.2 STC12C5A60S2
7、最小系统32.3 电源系统32.4 振荡电路32.5 复位系统42.6 程序下载系统52.7 音乐播放系统62.8 LCD液晶显示接口电路62.9 操作控制接口73 系统软件平台构建83.1 Vision简介83.2 LCD12864液晶屏显示原理83.2.1 LCD模块总线选择及时序83.2.2 LCD显示RAM区映射概况93.2.3 LCD的驱动方法103.2.4 LCD驱动程序架构103.3 俄罗斯方块游戏设计113.3.1 俄罗斯方块游戏功能简介113.3.2 系统界面的设计123.3.3 游戏系统“枚举算法”概述143.3.4 俄罗斯方块造型设计的方法153.3.5 随机产生俄罗斯方
8、块的方法153.3.6 俄罗斯方块平移的实现方法173.3.7 俄罗斯方块旋转的实现方法183.3.8 俄罗斯方块下移的实现方法203.3.9 满行检测及消行功能的实现方法213.3.10 游戏积分的计算方法223.4 双人俄罗斯方块游戏设计243.4.1 RTX51 Tiny简介243.4.2 RTX51 Tiny的内核分析243.4.3 游戏开发环境的配置273.4.4 双人单机对战模式的实现流程283.5 系统背景音乐的设计283.5.1音乐的设计原理283.5.2 音乐播放的实现方法303.5.3 音效程序流程303.6 系统主程序流程图314 产品功能说明与系统性能测试324.1 产
9、品功能说明324.2 系统性能测试335 结束语33参考文献35致 谢III贺州学院本科生毕业论文(设计)1 绪 论1.1 课题背景如今,计算机系统的发展已明显地朝三个方向发展,这三个方向就是:巨型化,单片化,网络化。对于解决复杂计算和高速数据处理的问题仍然是巨型机在起作用,因而,目前巨型机正在朝高速及高处理能力的方向发展。单片机在出现时Intel公司就给其单片机取名为嵌入式微控制器4。单片机的最明显的优势,就是可以嵌入到各种仪器、设备中。这一点是巨型机和网络不可能做到的。单片机在内部已集成了趆来趆多的部件,这些部件包括一般常用的电路,例如:定时器,比较器,EEPROM,D/A转换器,串行通信
10、接口,Watchdog电路等。 同时,俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,目前在网络单机游戏和kele8等上都有它的身影。而它曾经造成的轰动与经济价值可以说是游戏史上一件大事。因此,对它的研究,无论从技术上,还是社会意义上看都是很有价值的。单片机在游戏上的应用是具有非常大的潜力的,它能将游戏带入到另一个阶段。此次设计仅仅是为了举一个单片机在游戏应用方面的简单例子,它可以很好的说明单片机功能的强大,体现其更高的可控性和高集成度的好处,因此它可以在电子游戏方面成为一个不可计量的明日之星。1.2 课题的主要研究内容本课题研究和实现了基于8051+RTX51到Tiny平台下的智能俄罗
11、斯方块游戏系统。主要研究内容是实现智能俄罗斯方块游戏系统软硬件平台的搭建;本系统以8051微处理器为核心来运行RTX51 Tiny多任务实时操作系统,利用KEIL C51开发工具进行软件开发,通过LCD12864液晶屏显示游戏界面。该设计能实现单人单机游、双人单机对战游戏、游戏背景音乐的播放和单人最高积分存储等功能。在俄罗斯方块游戏系统开发过程中,本文作者首先进行硬件平台的搭建,包括单片机最小系统的搭建、电源系统的搭建、串口下载器的设计、游戏手柄的设计、音效播放模块的设计以及LCD液晶显示接口的设计。然后,作者才开展软件平台的构建,这也是本设计的重要部分,主要包括对RTX51 Tiny操作系统
12、的配置、俄罗斯方块模型的设计、模型图块的旋转及坐标变换设计、双人单机对战游戏设计和音效系统设计等。最后,从硬件和软件两方面对完成的智能俄罗斯方块游戏系统进行调试及运行试验。1.3 课题的研究现状及意义现今国内外的俄罗斯方块游戏设计主要有基于PC机上Windows平台的俄罗斯方块游戏、基于手机平台的智能俄罗斯方块游戏以及基于单片机平台的俄罗斯方块游戏等。前两种属于高端游机,性能优越,但成本高,而且计算机编程已不是新命题,VB、VC、Delphi版本的俄罗斯方块游戏都有发布9。从学术角度来看,针对俄罗斯方块游戏的开发,国内外也有不少学者展开过研究,比如Niko将进化算法引入到俄罗斯方块中并验证了其
13、有效性,Hoogeboom探讨了俄罗斯方块游戏的构造问题,王宇等针对存在于俄罗斯方块中的两个数学问题提出解决方案,高凌琴探讨游戏功能要求、数据结构、图形旋转、坐标变换等关键技术,胡代弟在SPCE061A单片机实现了俄罗斯方块游戏10。综上,国内外的研究多着重于游戏数学原理的讨论,也有部分文献涉及游戏的具体实现,但多是在Windows操作系统下实现的,在单片机平台下的开发俄罗斯方块游戏鲜少有文献刊载。而单片机由于具有体积小、性能突出、价格低廉等特点,应用领域不断扩大,除了工业控制、智能化仪表、家用电器外,在智能化高档电子玩具产品也大量采用单片机芯片作为核心控制部件。曾经80年代非常流行的掌上游戏
14、机便是单片机在电子玩具中的应用之一,其中的俄罗斯方块游戏现已被我们所熟知。本文探讨基于8051单片机硬件平台和RTX51 Tiny多任务实时操作系统的俄罗斯方块游戏的设计与实现,将理论与实践相结合。其主要目标是再现经典的俄罗斯方块游戏,并在此基础上实现双人单机对战游戏模式,以丰富产品功能,增强游戏的趣味性。2 系统硬件平台设计2.1 STC12C5A60S2单片机概述STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051系列单片机,指令代码完全兼容传统8051,但速度快812倍。用户程序空间为60KB,片上集成1280字节
15、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单片机具有许多强大的功能,能够满足大多数用户对
16、8位单片机的要求。2.2 STC12C5A60S2最小系统单片机最小系统主要由电源、振荡、复位电路以及扩展电路等部分组成。在本设计中,扩展了液晶显示接口。因此,本设计的最小系统如图2-1所示。图 2-1 STC12C5A60S2最小系统Fig 2-1 STC12C5A60S2 Minimum System2.3 电源系统本设计的电源系统比较简单,直接由LM7805稳压芯片输出的+5V电源供电。具体电路如图2-2所示。图片2-2 电源系统Fig 2-2 Power System2.4 振荡电路单片机系统里都有振荡电路,在单片机系统里晶振作用非常大,全称叫晶体振荡器,它结合单片机内部电路产生单片机
17、所需的时钟频率,单片机晶振提供的时钟频率趆高,那么单片机运行速度就趆快,单片机的一切指令执行都是依靠单片机晶振提供的时钟频率。4晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。本设计中STC12C5A60S2使用12MHz的晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF至50pF之间。如图2-3所示即为本设计的振荡电路。图 2-3 振荡电路Fig 2-3 oscillatory circuit2.5 复位系统 MCS51单片机通常采用上电自动复位和按钮复位两种方式。通常因为系统运行等需要,常常需要人工复位,本设计采用按钮
18、复位的方式,即按下开关一定时间就能使RTS引脚端为高电平,从而使单片机复位。同时,简单复位电路中,干扰信号易串入复位端,由此可能会引起内部某些寄存器错误复位,这时可在RST引脚上接去耦电容。在STC12C5A60S2单片机中有两个复位端口,即RST/P4.7、RST2/P4.6,当晶振频率小于或等于12MHz时,使用RST端口。由于本设计使用外接12MHz的晶振作为振荡时钟,所以采用如图2-4所示的复位系统。图 2-4 复位系统Fig 2-4 Rest System2.6 程序下载系统单片机系统的传统编程方式是先将单片机从电路板上取下,放入专用的编程器进行编程,再放入电路板进行调试。其缺点是频
19、繁拔插器件容易损坏器件的引脚;如果频繁的调试程序,必须重复拔插,大降低了开发效率。ISP(在线系统编程)技术是一种无需将存储芯片从嵌入式设备上取出就能对其进行编程的过程。其优点是,即使器件焊接在电路板上,仍可对其进行编程。在线系统可编程是Flash存储器的固有特性(通常无需额外电路),Flash几乎都采用这种方式编程。ISP的实现相对要简单一些,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写。对于8051系列单片机来讲可通过SPI接口或其它的串行接口接收上位机传来的数据并写入存储器中。而上位机PC机与下位机单片机通过RS-232串行接口总线进行的串行通信。8051系列单片机带有
20、一个全双工的串行接口,因此用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的P30/RXD和P31/TXD分别和下载器的第10管脚/T和第9管脚/R相连,串口线的第5
21、管脚接地,2、3管脚和下载器的7、8管脚相连。具体电路如图2-5所示。图 2-5 程序下载系统Fig 2-5 Program Download System2.7 音乐播放系统在本设计中,音乐播放系统是通过三极管驱动有源蜂鸣器发声,而具体的音符声调则由程序控制。因此,音乐播放系统的硬件电路非常简单。具体接法为有源蜂鸣器正极直接接+5V电源,负极与三极管8050的发射极相连,8050的集电极直接接地,其基极串一个1K的电阻连接到STC12C5A60S2单片机的P20端口。如图2-6所示。图片2-6 音乐播放系统Fig 2-6 Music Player System2.8 LCD液晶显示接口电路
22、液晶显示屏是整个系统硬件的重要组成部分,担当着人机交互的重要角色。本设计采用铭正同创公司生产的MzL02D-12864液晶点阵屏作为显示器件。它是一块128*64点阵的LCD显示模组,模组上的LCM采用COG技术将控制(包括显存)、驱动器集成在LCM的玻璃上,接口简单、操作方便。其特点为单电源供电,对比度编程可调,可采用并行接口为6800/8080时序或者串行SPI的MPU接口方式,整块液晶屏由3.3V的白色LED背光,美观大方。其外部接口分为电源端口、数据端口和命令端口三部分组成。本设计中LCD的数据端口连接到STC12C5A60S2单片机的P0端口,LCD的命令端口连接到单片机的P2端口。
23、具体硬件电路如图2-7所示。图 2-7 LCD液晶显示接口电路Fig 2-7 Liquid Display Interface Circuit2.9 操作控制接口操作控制模块是智能俄罗斯方块游戏系统的输入器件。它包括主控制器和辅助控制器。主控制器包括七个按键,分别为:旋转/确定、向左/返回上级菜、向右/下一个、快速下降、使用道具、暂停、退出。副控制器则包括五个按键,分别为:旋转/确定、向左/返回上级菜、向右/下一个、快速下降、使用道具。在硬件电路方面辅控制器比主控制器少两个按键的连接。如图2-8所示为主控制器的接线图。与单片机的具体接口可根据实际设定。图片2-8 控制模块接口Fig 2-8 C
24、ontrol 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总
25、线模式。在此种接口模式下,WR 线为读写控制信号线,当WR 为高电平时为读状态,WR为低电来时为写入状态。在6800总线接口模式下LCD的时序如图3-1所示。图 3-1 6800总线时序Fig 3-1 6800 Bus Timing3.2.2 LCD显示RAM区映射概况驱动控制芯片的显示RAM区中,每个byte的数据对应屏上的点的排列方式为:纵向排列,低位在上高位在下;如图3-2所示。MzL02D-12864液晶显示模组的显示器上的显示点与驱动控制芯片中的显示缓存RAM是一一对应的;共有65(8Page * 8bit + 1)*132个位的显示RAM区。而显示器的显示点阵大小为64*128点,
26、所以实际上在液晶显示模块中有用的显示RAM区为64*128个位;按byte为单位划分,共分为8个Page,每个Page为8行,而每一行为128个位。(即128列)。图 3-2 字节数据排列情况Fig 3-2 Byte data arrangementMzL02D-12864液晶显示模块的显示屏上的每一个点都对应有控制器片内的显示缓存RAM中的一个bit,显示屏上64*128个点分别对应着显示RAM的8个Page,每一个Page有128个byte的空间。因此可知显示RAM区中的一个Page空间对应8行的点,而该Page中的一个byte数据则对应一列(8个点)。用户如要点亮LCD屏上的某一个点时,
27、实际上就是对该点所对应的显示RAM区中的某一个位进行置1操作,所以就要确定该点所处的行地址、列地址。MzL02-12864液晶显示模组的行地址实际上就是Page的信息,每一个Page应有8行;而列地址则表示该点的横坐标,在屏上为从左到右排列,Page中的一个Byte对应的是一列(8行,即8个点),达128列。可以根据这样的关系在程序中控制LCD显示屏的显示。3.2.3 LCD的驱动方法在很多资料以及书籍当中,通常介绍有两种 LCD模块的连接方法:直接控制和间接控制;直接控制实际指的是 LCD模块的总线接口直接与MCU端口连接,然后 MCU 通过程序控制端口来模拟 LCD的总线时序来完成对其的控
28、制操作;而间接控制指的是MCU本身就有外部总线拉出,与LCD的总线接口对应的连接上,程序中直接操作总线以控制LCD。目前有很多MCU 都把总线密封起来了,都没有引出外部总线;所以通常在用MCU控制LCD模块时,时常会选择直接控制的方式,即利用端口来模拟总线时序;当然了,如果本身就有总线而且也与LCD模块的总线配得上的话,肯定会使用总线连接的间控方式。本设计采用直接控制的方式,将MzL02D-12864 LCD模块的总配置为6800总线,这与绝大部分引出外部总线的MCU的时序是不一样的。本设计的LCD12864模块中,用户程序对其进行显示控制时,无非就是通过对LCD模块内部的驱动控制器当中的寄存
29、器进行设置操作;最常用的如LCD的显示开/关、操作显存地址(行与列地址)的设置等。这些寄存器一般都在LCD模块的驱动控制器文档中有详细介绍。3.2.4 LCD驱动程序架构LCD12864驱动程序主要由LCD底层驱动和LCD功能函数两部分组成。用户在应用层直接使用功能函数即可。具体框架如图3-3所示。功能函数层字库驱动层函数声明功能函数LCD配置驱动层传输模式及IO端口配置数据传输驱动应用层用户应用程序功能函数声明图 3-3 LCD驱动程序架构Fig 3-3 LCD Driver architectures3.3 俄罗斯方块游戏设计3.3.1 俄罗斯方块游戏功能简介俄罗斯方块游戏的规则很简单,当
30、方块从屏幕上方落下来时,玩家控制方块的位置以及旋转方块,巧妙地安排布置达到充分利用屏幕空间的目的。每当屏幕的一整行被方块排满时,作为奖赏,整行从屏幕上消失,剩余的方块依次往下降一行。当方块堆积达到无法再落下方块的时候,游戏结束。本设计中游戏主要的功能点包括:(1) 每4个小方块可以组合成一组方块群,游戏共有7种方块群,每次随机产生一种;玩家使用向左、向右、快速向下这些按键控制方块的位置,旋转按键控制方块顺时针旋转。在主控制手柄上还有退出、暂停按钮,可以实现随时切换到启动时的状态和暂停游戏的功能。(2) 在本设计中,系统为玩家提供了背景音乐,玩家可以根据个人喜好开启或关闭音效。(3) 单人模式下
31、,玩家使用主控制器进行操作。每消去一行,系统就给玩家加1分。在单人模式下,如果积分超过系统记录的最高积分,系统将更新最高积分。(4) 本设计的亮点是实现双人对战游戏,通过主控制器在菜单选项中选择双人模式,第二玩家可以通过副控制器对第二游戏界面进行操作。本游戏系统规定,双人对战游戏中积分可分为两个阶段。第一阶段是普通积分阶段,即双方玩家每消去一行,其相应积分表加1分;第二阶段是多积分阶段,即每消去三行才获得1个积分。双方先达到第二阶段末尾者,即可取胜。同时,该设计中还为双方玩家增加了道具功能,即当使用该功能时,可令对手当前移动图块消失,随机出下一个图块。当玩家一次性消去三行,就能获得一次道具功能
32、,最多一次性累积2个道具。系统默认为每个玩家提供1个道具。这样不仅丰富了俄罗斯方块游戏的功能,而且使其更具趣味性。3.3.2 系统界面的设计(1) 菜单选项界面当玩家将本设计的作品上电启动后,系统首先在LCD显示器件上呈现一个动态的开机动画。然后,系统提供三个功能选项,即最高积分、游戏设置、开始游戏。其中,“游戏设置”选项包含了两级子菜单。一级菜单包括“模式选择”和“音效选择”。在这两个选项后面给出单字提示,以说明当前相应设置选项的状态。“模式选择”菜单包含的二级子菜单有“单人模式”和“双人模式”。“音效选择”菜单包含的二级子菜单有“开音效”和“关音效”通过控制按键即可设置成相应状态。“最高积
33、分”菜单选项为玩家提供单人模式下系统记忆的最高积分。如果选择了“开始游戏”菜单选项,则系统根据“游戏设置”选项中的设置启动相应的游戏界面。菜单选项界面框架如图3-4所示。菜单功能界面框架最高积分游戏设置开始游戏模式选择音效选择单人模式双人模式开音效关音效图 3-4 菜单选项界面框架Fig 3-4 The menu option interface framework(2) 游戏操作界面首先,我们先来介绍单人模式下游戏界面的一些情况。在启动单人模式后,LCD12864显示屏分成两屏,左半屏为俄罗斯方块游戏地图map区,右半屏为俄罗斯方块图形预览区和实时积分显示区。其结构框架如图3-5所示。启动单
34、人模式左半屏图形预览游戏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系统界面整体程序流
35、程图如图3-7所示。NYYNNYYNY单人模式音效选择模式选择游戏设置双人模式音效关音效开清模式标志置模式标志返回上一级清音效标志置音效标志返回上一级开机启动动画进入主菜单显示单人最高积分返回按键最高积分开始游戏进入游戏游戏设置模式选择音效选择图 3-7 开机界面功能框架Fig 3-7 Boot interface function frame3.3.3 游戏系统“枚举算法”概述本文绕开了涩难懂、比较复杂的“矩阵算法”,提出了另一种“枚举算法”来实现这个经典游戏。“枚举算法”没有复杂的数学理论、避免了在程序中大量使用矩阵运算公式,设计思路清晰、明了,非常适合游戏设计的初学者理解和实现。所谓枚举
36、算法,就是直接枚举出游戏中各图块的基本形状和它们的旋转形状,然后控制每一种不同形状的方块在游戏戏中的产生、移动、旋转、落下、填满和清除等游戏过程。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个小方块的顶点坐标
37、。比如L型,其数据结构为0,0,0,4,0,8,4,8。其中,每两个数据为一个小正方形的列、行坐标,如图 3-9所示。由图可知,整个界面的坐标原点在左上角,分别向右、向下作为横轴的正方向和纵轴的正方向。图中每一格代表了LCD12864中的连续四行,第1格的坐标是(0,0);第2格的坐标是(0,4);第3格的坐标是(0,8);第4格的坐标是(4,8);其它图块也按此方法编辑数组内容。2341图 3-9 L型Fig 3-9 L Shape3.3.5 随机产生俄罗斯方块的方法(1) 产生随机数的理论依据为了实现随机落下各类方块图形,游戏过程序中必须抽取随机数来确定方块的类型。随机数是一个既简单又复杂
38、的问题。本设计采用众所周知的线性叠加法,虽然没有完美的方法产生随机数,不过线性叠加法是一个合适的方法,它彻底解决了8位机随机数的问题。如果从一个足够长的数字序列中的某一个点取出一边串的数字,那么这些数字就看似随机。这个开始的点(数字)叫做种子。如果从相同的点(种子)开始,将会得到相同的数字,这是因为我们是从固定的序列中取数字(所以叫伪随机)。但这却是一个有用的特性,我们可以每次从不同的点取数,即改变种子,从而可以实现真正的随机。(2) “线性叠加法”的概况“线性叠加法”其实只涉及二个内容即:乘法和加法。只需三个步骤即:第一,为了取得新的种子,旧的种子与一个常数A相乘;第二,所得的结果和第二个常
39、数C相加;第三,新的种子就是第二步结果的低32位。保留低32位很重要,用来获得下一个种子。计算公式为: 种子 = A * 种子 + C (3-1)此公式在几何图中表示为一条直线,而且新种子由旧种子反复相加得来,所以叫线性叠加。随机函数的关键在于选择优秀的“常数A”(也叫乘数A),其实也就是选择了一个固定的数字序列。“常数C”,不像乘数A那样重要,但是一定是个奇数。事实上,C可选1。因为奇数(旧的种子)乘奇数(乘数A)是奇数,再加奇数(常数C)将会是一个偶数学偶数(旧的种子)乘奇数(乘数A),加奇数(常数C)将会是一个奇数。如此种子会在奇数和偶数之间转变。因为种了的变化足够随机,所以种子的值可以
40、作为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(unsigne
41、d int seed)的种子的情况下,它每次都使用默认的种子,因此生成的序列会是同一个,所以会取到相同的数字序列。这可能会导致每次重新运行游戏时其随机数结果都是一样的。为了解决该问题,本设计在玩家进入游戏时读取按键按下瞬间定时器T0的计数值,作为srand(unsigned int seed)的种子。从而实现真正的随机。(4) 随机数程序流程图如图3-10为随机数程序流程图。srand(unsigned int seed)产生一数据序列开始游戏读取T0计数值作为seedrand()将返回值进行处理后选择相应的方块数组图 3-10 随机数程序流程图Fig 3-10 Ramdom process
42、flow program diagram3.3.6 俄罗斯方块平移的实现方法 方块产生后,需要用全局变量来保存方块在游戏map区中的行坐标和列坐标。方块的平移包括左移和右移两种情况,无论那种情况都要首先进行合法性判断。(1) 俄罗斯方块平移特性在本设计中规定当按下一次左移或右移按键时,map区中的当前图块就左移或右移一个正方形的宽度。而一个小正方形的宽度,则对应着LCD12864中的4列。(2) 平移合法性判断 平移的合法性判断经较简单,只需判断它旁边相邻位置是否被填充即可。(3) 平移算法的实现在程序中,当有任意一个平移按键被按下时,系统接收到信号,然后调用平移函数进行判断其合法性,得到该函
43、数的返回值为1后,再进行平移操作。其程序流程如图3-11所示。返回1返回1返回0YYNN左移按键被按下right_left_judge函数列变量f_x减4行不变右移按键被按下列变量f_x加4行不变right_left_judge函数将图块左移一格将图块右移一格图 3-11 平移算法流程图Fig 3-11 Translation algorithms flowchart3.3.7 俄罗斯方块旋转的实现方法(1) 俄罗斯方块旋转图形概况方块旋转是一个游戏实现的关键问题,实现旋转的数学方法有多种,如矩阵变换法、枚举法、索引法等。本文前面已经论述了此次设计采用枚举的方法,对19种俄罗斯方块造型进行构造
44、。游戏过程中,每一种基本方块都要做旋转控制,于是就产生了旋转后的方块形状,本文将其称为“旋转型”。基本型中的“I型”,只有一种旋转型,即由竖直旋转90度后成为水平。因此,基本型加上一种旋转型,共有两种形状。基本型中的“L型”和“反L型”有三种旋转型,将它按顺时针每旋转一个90度就产生一种旋转型,可以旋转三次,得到三种不同的旋转型,因此,它的三种旋转型加上其基本型,“L型”和“反L型”方块分别有四种形状。基本型中“Z型”和“反Z型”可以顺时针旋转一次90度,加上他们的基型分别有两种形状。基本型中的“T型”有三种旋转型,将他按顺时针旋转一个90度就产生一种旋转型,它可以旋转三次,得到三种不同的旋转
45、型,因此,它的三种旋转型加上其基本型,“T型”方块共有四种形状。基本型中的“口型”方块没有旋转型,在游戏中只有一种形状。综上所述,七种基本型方块,因旋转产生了不同的旋转型,这些旋转型加上他们的基本型,整个游戏中,共有19种不同的方块形状。本设计实现旋转操作的具体方法,可分为两类,一类是I型的旋转策略;另一类则是其余17种基本型的旋转策略。(2) 旋转合法性判断方块做顺时针旋转,每次旋转90度。本设计规定只要旋转后到达的地方未被填允,方块就可以进行旋转操作。(3) I型的旋转策略为了在视觉上实现I型的顺时针旋转,本设计采用位置错落的方式来实现。其具体过程如图3-12所示。 图 3-12 I型的旋
46、转方法Fig 3-12 The rotation method of I shape当落下的图块是图所示时,其旋转周期为 。当落下的图块是图所示时,其旋转周期为 。 之所以把I型的旋转变换单独拿出来讨论,是因为I型只有基本型和旋转型共两种图块。如果在当前位置直接按这两种图块的坐标数组进行图形切换,则无法实现顺时针旋转的视觉效果。所以,在旋转处理程序中,当要旋转的当前图块为I型及其旋转型时,就要改变当前列、行这两个全局变量的值。(4) 其余17种基本型的旋转策略除了I型的旋转比较复杂外,其余17种类型的方块只需按各自旋转的顺序在当前位置用已经编辑好的坐标数组来实现旋转即可。具体程序流程如图3-13所示。NYYYNNYN