已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于ARM9的贪吃蛇游戏摘要本课程设计是使用我们学习过的嵌入式系统的有关知识,在ARM9嵌入式硬件开发平台和C/OSII的软件开发框架下,实现一个还有AD转换,按键,LCD等硬件功能的实时多任务的简单贪吃蛇的设计。文中首先C/OSII系统和ARM9进行了介绍,然后对设计要求进行分析,给出了系统总体上设计,并对各个功能模块进行了介绍,紧接着给出了系统软件设计,最后介绍了系统的调试方法和测试结果。关键词C/OSARM9嵌入式贪吃蛇一开发环境简介1、C/OSII操作系统C/OSII是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。UC/OSII只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于UC/OSII良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。UC/OSII目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等C/OSII是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。C/OSII中最多可以支持64个任务,分别对应优先级063,其中0为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个,每个任务都有不同的优先级,用户在创建任务的时候定义该任务的优先级。C/OS操作系统中每个任务可以有5种状态休眠态、就绪态、运行态、等待或挂起状态、中断态,在任一个时候,任务的状态一定是这5种状态之一。任务在等待消息、邮箱或者信号量等事件的到来的时候会进入挂起状态,当任务接到消息以后,则处于就绪状态。UC/OSII的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。UC/OSII要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。在ANSIC中是使用MALLOC和FREE两个函数来动态分配和释放内存。但在嵌入式实时系统中,多次这样的操作会导致内存碎片,且由于内存管理算法的原因,MALLOC和FREE的执行时间也是不确定。UC/OSII中把连续的大块内存按分区管理。每个分区中包含整数个大小相同的内存块,但不同分区之间的内存块大小可以不同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。对一个多任务的操作系统来说,任务间的通信和同步是必不可少的。UC/OSII中提供了4种同步对象,分别是信号量,邮箱,消息队列和事件。所有这些同步对象都有创建,等待,发送,查询的接口用于实现进程间的通信和同步。UC/OSII采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。UC/OSII的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了简化系统设计,UC/OSII规定所有任务的优先级不同,因为任务的优先级也同时唯一标志了该任务本身。随着信息化技术的发展和数字化产品的普及,以计算机技术、芯片技术和软件技术为核心的嵌入式系统再度成为当前研究和应用的热点。对功能、可靠性、成本、体积和功耗严格要求的嵌入式系统一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,其中嵌入式微处理器和嵌入式操作系统分别是其硬件和软件的核心。ARM处理器由于其具有小体积、低功耗、低成本、高性能等特点,广泛应用在16/32位嵌入式RISC解决方案中,几乎占有嵌入式微处理器市场分额的75,本文选定三星公司生产的一款基于ARM920T核的高性能低功耗SOC芯片S3C2410作为移植方案的硬件平台。市场上主流的嵌入式实时操作系统有VXWORKS、PSOS、WINCE、LINUX等,基于实时性、成本以及开发难度方面的考虑,我们选择UC/OSII开放源代码的嵌入式实时操作系统。采用基于ARM9的S3C2410嵌入式微处理器,可以使系统具备高性能的运算能力的同时便于与各种外设连接扩展,简化了硬件设计,维持小型化的同时降低了系统成本。UC/OSII作为一个源代码公开的操作系统,在具体应用中稳定可靠,并且支持UIPTCP/IP协议栈、UCGUI等,可扩展性强,功能强大。本系统采ARM9UC/OSII开发设计,具有精度高、运行稳定、实时性好、抗干扰能力强、性价比高的特点,可以在各种工业场合中广泛应用,达到了设计的初衷。2、试验箱基本硬件信息1S3C2410SCORE小板采用S3C2410X处理器,64MNANDFLASH64RAM。2DOUBLE100METHERNET网卡均由AX88796构成,采用现有电路但分配不同地址。34HOST/1DEVICEUSB接口主USB口扩展为4个,由AT43301构成USBHUB,其中电源管理用MIC2525。USB从口保持处理器本身的1个。43UART/IRDA保持2个RS232串口,增加1个RS485串口,1个IRDA收发器,均从处理器的UART2引出。5168PINEXPORT有一个168PIN扩展卡插槽,并去掉已经被主板上各模块占用的资源。网卡部分还在局部总线上,其余电路包括168PIN扩展槽都在外部总线。6LCD兼容多种LCD,可采用5寸256色屏或8寸16BIT真彩屏,同时预留一个24BIT接口。可以支持板外8BIT或24BIT屏。7TOUCHSCR采用ADS7843,预备了直接用2410内部ADC构成的转换电路接口8AUDIO采用UDA1341,具有放音、录音等功能。9PS2KEYPAD使用ATMEGA8单片机控制2个PS2接口和板载17键小键盘。两个PS2可接PC键盘和鼠标。10LED使用ZLG7290只驱动8只小数码管。同时可作IIC总线实验。11POWERSUPPLY、RESET、RTC等必须资源。12ADC板载3个电位器和选择跳线,同时在板上设模拟电压输入专用接口。13IDE/CF卡插座支持25英尺的笔记本硬盘读写和IDE模式下的CF卡读写。14PCMCIA和SD卡插座由EPM3128A100CPLD实现。15IC卡插座。由ATMEGA8单片机控制。16DC/STEP电机。步进电机采用74HC573扩展IO,软件形成时序来控制。同时剩余IO可以控制CAN等电路,以节省CPU的GPIO资源。17CANBUS设置1个CAN口,采用MCP2510和TJA1050。18DOUBLEDA设置两个DAC端口,采用MAX504接SPI总线。19GPRS/GPS扩展板不做在主板上,单独设计扩展板。注意GPS的RS232需要增加MAX3232芯片来转换为TTL才能引到168PIN插座上。3、ADS12集成开发环境ADS12ADS是ARM公司的集成开发环境,他的功能非常强大。ADS包括了四个模块分别是SIMULATOR;C编译器;实时调试器;应用函数库。ADS12提供完整的WINDOWS界面开发环境。C编译器效率极高,支持C以及C,使工程师可以很方便的使用C语言进行开发。提供软件模拟仿真功能,使没有EMULATORS的学习者也能够熟悉ARM的指令系统。配合FFTICE使用,ADS12提供强大的实时调试跟踪功能,片内运行情况尽在掌握。ADS12需要硬件支持才能发挥强大功能。目前支持的硬件调试器有MULTIICE以及兼容MULTIICE的调试工具如FFTICE。ADS由命令行开发工具,ARM实时库,GUI开发环境CODEWARRIOR和AXD,适用程序和支持软件组成。有了这些部件,用户就可以为ARM系列的RISC处理器编写和调试自己的开发应用程序了。二系统设计要求贪吃蛇游戏是一款经典的小游戏,它的原型是1976年,GREMLIN平台推出了一款经典街机游戏BLOCKADE。真正走红的是该游戏随诺基亚手机走向世界。本课程设计有关贪吃蛇的功能描述1、可以通过嵌入式平台的键盘控制游戏,键盘中起作用的是方向键(2,4,6,8)和回车键,方向键控制蛇的上下左右运动,回车键控制游戏的继续和暂停。2、贪吃蛇由若干连续黄色方块构成,程序中随机出现一些“食物”用蓝色的方块表示,贪吃蛇通过吃“食物”增加自身的长度并增加相应的分值。3、游戏分三个关口,第一关没有障碍物,第二关有2个障碍物,第三关有四个障碍物。4、贪吃蛇撞到矩形边界,障碍物或者自己身体的一部分,游戏即结束,重新开始。5、为了增加难度,加入AD转换器用于控制蛇的运动速度,这也是本设计的创新点。6、贪吃蛇每吃一个食物分数会增加,屏幕上显示得分和游戏所用时间。三系统总体设计本设计需要创建两个任务,系统结构框图如图31所示,任务状态切换如图32所示。具体的任务流程和任务所要完成的功能如下在系统启动后,同时创建两个任务,任务一MAIN_TASK和任务二SNAKE_TASK。任务一主要功能是等待键盘消息,有键盘消息的时候判断是什么键盘,并对相应的变量重新赋值。任务二主要功能是控制并在屏幕上显示蛇的移动和速度,并完系统初始化任务一任务二等待键盘消息控制蛇移动AD采样LCD显示图31系统结构框图任务一,任务二就绪是否有键盘消息任务一挂起任务二运行任务二挂起任务一运行图32任务切换框图8等待键盘消息是否有按键按下识别是哪个按键是否如果蛇现在的方向是左或者右就把方向改成向上如果蛇现在的方向是左或者右就把方向改成向下如果蛇现在的方向是上或者下就把方向改成向左如果蛇现在的方向是上或者下就把方向改成向右如果游戏是运行的则改为竞争,静止就改为运行246/N图33系统主任务流程框图成对分数,游戏等级和其他相关参数的记录和显示。任务一为主任务,在创建任务的时候,赋给它的优先级别比任务二高,所以任务一优先运行,任务二处于就绪状态,因为任务一主要是等待键盘消息,在无键盘消息的时候,任务一被挂起,这时候任务二进入运行状态。1、任务一程序流程框图如图33所示,该任务完成对键盘消息的接收,识别,并改变相应变量2、任务二流程图如图34所示,主要功能是控制蛇的速度并在屏幕上显示蛇的移动,并完成对分数、游戏等级、和游戏用时的记录和显示。四系统具体功能的实现1初始化初始化包括了硬件初始化和软件初始化。硬件初始化主要有AD转换器的初始化,LCD的初始化,串口初始化,ARM目标板的初始化等,软件初始化包括了系统初始化,游戏初始化。系统初始化包括了任务的建立,信号量的创建,变量的创建,系统文件初始化,初始化绘图设备上下文,系统实时时钟的初始化和函数的声明等,游戏的初始化,包括了有关参数属性的初始化化和游戏界面的初始化。硬件初始化DEFINEADCCON_FLAG0X1TYPETP_SKHEADXNODEISBLOCK1HEADNODEXNODEUPDATENEXTNODEXNODE,LEFTXNODEPREDIRLEFT/SNAKEBODYXNODEXNODETYPETP_SKBODYXNODEISBLOCK1UPDATENEXTNODEXNODE,LEFTXNODEPREDIRLEFT/SNAKETAILXNODEXNODETYPETP_SKTAILXNODEISBLOCK1TAILNODEXNODEUPDATENEXTNODEXNODE,LEFTXNODEPREDIRLEFTRANDCAKE2判断蛇是否吃到食物判断蛇是否吃到食物的方法比较简单,只要判断蛇头的属性是否和下一个节点的属性一样。吃到食物后改变响应的游戏参数,并要让蛇的节数多三节,这时候要让变量LENADD加3,并且还要对蛇补画上一节,本设计采用补上蛇头的方法,要注意根据此时蛇的运动方向来确定新蛇头的坐标。,以后食物产生子程序能够判断食物已经被蛇“吃到”了,要重新产生食物。IFHEADNODETYPETP_CAKESCOREIFSCORE5FLAG11ELSEIFSCORE10FLAG21LENTOADDCAKELENGTHRANDCAKE3判断游戏是否结束1蛇头撞到蛇身判断蛇是否撞到蛇身的方法可以从蛇头开始依次开始判断蛇头的属性是否和下一个方块的属性相同,一样的话即表明蛇撞到蛇身了,此时游戏结束。2蛇头撞到游戏界面边框判断蛇是否撞到边框的方法,只要比较蛇头的属性是不是同时边框的属性一样,一样的话,即表明蛇撞到边框,游戏结束。IFHEADNODEISBLOCKNRET1/HITABLOCKGOTOSNAKESTEP_END4蛇移动功能这部分功能是游戏的主体,实现蛇移动的方式是首先擦除蛇尾,擦除的方发是改变蛇尾的属性,通过调用绘图上下文设备,蛇尾就变成白色底色不可见,然后从蛇尾开始,依次改变下一个节点的属性。例如刚开始蛇是5节,这时候依次把第2四节的属性给第1节;把第3节(即蛇头)的属性给第2节;把第4四节的属性给第3节;把第4节(即蛇头)的属性给第3节;把第5节(即蛇头)的属性给第4节。擦除蛇尾和转移坐标这两个顺序不能颠倒。这时候蛇头的属性和第4节的属性是一样的,这时候需要判断蛇的方向变量的值,根据蛇的方向变量的值补画上蛇头。IFLENTOADD0LENTOADDELSETAILNODETYPETP_SPACETAILNODEISBLOCK0DRAWPOINTTAILNODE/OLDTAILTAILNODETAILNODENEXTTAILNODETYPETP_SKTAILDRAWPOINTTAILNODE/NEWTAILHEADNODETYPETP_SKBODY/OLDHEADDRAWPOINTHEADNODEHEADNODENEXTPREDIRHEADNODEDIR/SAVEPREDIRHEADNODEHEADNODENEXT/NEWHEAD5食物的产生食物的产生主要要注意食物产生之前,我们必须要判断画面上面是已经存在食物,如有已经存在食物了,就不再产生食物,如果食物被蛇吃到了,那就要重新画上食物。本设计是通过在每次吃完食物后调用随机产生食物函数,另外还要保证食物不能超出蛇的活动界面,并要保证食物能被蛇吃到,所以需要指定食物坐标的范围,被通过舍去食物坐标个位的方法保证食物坐标是整十,这样就能被蛇吃到。本设计用一个矩形方框来代表食物,所以通过上面介绍的方法产生食物坐标后,对应在该坐标的位置画上一个矩形方框。VOIDRANDCAKEVOID/GETANEWRANDCAKEPOSITIONINT32UX,YWHILE1XRANDW_XSIZEYRANDW_YSIZEIFWORLDARRAYYXISBLOCKBREAKCAKENODECAKENODETYPETP_CAKEDRAWPOINTCAKENODE5、监听键盘动作任务通过等待消息而处于挂起状态,当任务接到消息以后,则处于就绪状态,然后开始判断所接受到的这个消息是不是需要处理,如果是执行相应的处理函数,最后,删除所接收到的消息,继续挂起等待下一条消息。VOIDMAIN_TASKVOIDIDPOSMSGPMSG0/定义消息结构CLEARSCREEN/清屏WORLDSEMOSSEMCREATE1GAMERUNOSSEMCREATE1PDCCREATEDCSETLCDUPDATAPDC,FALSE/消息循环FORPMSGWAITMESSAGE0/等待消息SWITCHPMSGMESSAGECASEOSM_KEY/键盘消息ONKEYPMSGWPARAM,PMSGLPARAMBREAKDELETEMESSAGEPMSG/删除消息DESTORYDCPDC6AD控制蛇速度在每次蛇前进一步后,通过刷新LCD屏幕来显示画面和相关参数,紧接着占用系统信号量,占用的时间是同过当前游戏的关口和调用AD采样函数来确定的额,游戏关口越高,蛇的前进速度越快,AD采样值越小,蛇的前进速度越快。OSTIMEDLYGETSPEEDGAMELEVELINT32SGETSPEEDU8LEVELINTADDATAU16LASTDATAADDATAGETADRESULT0LASTDATAADDATA3350/1023IFLEVEL1RETURN300LASTDATAELSEIFLEVEL2RETURN200LASTDATAELSERETURN100LASTDATA四程序下载与调试1、把程序下载到试验箱中(1)执行菜单PROJECT|MAKE对工程进行编译连接。在出现的错误/警告窗口中选择某错误/警告信息,ADS会自动打开相应源文件并用箭头指向出错的文本行。如果某个源文件被修改,重新编译时ADS会自动同步各文件的日期信息。(2)在ADS中执行菜单PROJECT|DEBUG启动ADS12的调试工具AXD。(3)在AXD中执行菜单OPTIONS|CONFIGURETARGET对AXD进行设置。选择ADP即远程调试,点CONFIGURE按钮进一步设置具体参数。(4)点SELECT按钮选择远程连接为ARMETHERNETDRIVER,点CONFIGURE按钮输入仿真器的IP地址。如果用户使用的是并行口仿真器,请输入127001即可。(5)等待程序装载完毕以后,通过EXECUTE|GO菜单以及EXECUTE|STOP(或者工具栏中的相应按钮)运行或暂停程序。程序暂停后在窗口中将显示出程序暂停的位置。(6)通过EXECUTE|STEP菜单(或者工具栏中的相应按钮)可以单步运行程序。也可以使用STEPIN、STEPOUT菜单命令进入或者跳出函数的调用。RUNTOCURSOR命令运行到光标位置。(7)程序停止后可以通过PROCESSORVIEWS|SOURCES菜单查看源文件,并可在适当位置按F9设置端点。(8)使用在PROCESSORVIEW菜单下的REGISTERS、VARIABLES和MEMORY命令可以查看工作寄存器或者内存变量。读者可以逐一地尝试,为以后调试程序打下基础。注意在进行调试时在ADS中必须选择当前工程的DEBUG版本,如果选择RELEASE版本则无法正常调试程序。但在调试通过后就必须选择RELEASE版本进行编译连接并将生产的SYSTEMBIN文件复制到开发板的FLASH中。将开发板上的FLASH激活并使WINDOWS认其为一个2、运行结果与不足本程序能够完成设计目的的所有基本要求;(1)能够通过方向键来控制蛇的移动方向;(2)蛇吃到食物后能够重新出现食物;并且能够更新和显示分数,时间;(3)每吃到5个食物后,游戏能够自动进入下一关,并能通过增加蛇的移动速度来增加游戏的难度;(4)能够通过实验箱上的旋钮控制蛇的运行速度。未能实现的功能;本程序设计时预想在游戏开始前能够停留在游戏界别设置画面,并能通过手动进行游戏级别的调整,“”按键用来增加游戏级别,“”按键用来减少游戏级别,并能在屏幕上显示游戏灌输,等到有确认信息,游戏才开始。但是此部功能没有实现,实验的时候程序能够进入级别调整画面,并等待用户对游戏等级进行调整,但是“”、“”按键和确认按键无效,没办法对游戏级别进行调整。由于调试时间有限,最后删掉次部分功能。不足之处(1)方向按键按下后,要有一定的延迟蛇才能对按键作出反应,这个延迟不是很明显,但是刚开始游戏的时候,总感觉不能刚好控制蛇吃到食物,需要稍微提早一些时间按下按键才能让蛇延目标方向移动。这个不足的原理是因为每次按键按下,要等到下一次循环,蛇才能响应方向改变,而蛇控制的程序中每次循环中用到了比较多的循环语句,判断,跳转,每次程序循环所需要的时间比较长,所以感觉按键有一点延迟,但是这个延迟非常的小,并不明显。解决方法要优化蛇控制程序,简化程序过程。(2)蛇的移动范围和游戏界面有些不一致,例如蛇会稍稍超出游戏界面的边框。这是因为蛇移动时候所用的坐标原点和画游戏界面所用的坐标原点不一样,在判断蛇是否超出边框时要注意计算在新坐标原点下,边框的位置,以便准确判断出蛇是否超出游戏界面。这个问题仅仅是画面上有点缺陷,不影响贪吃蛇的功能。解决方法要准确计算出游戏边框相对坐标原点的距离(像素点)。五总结想要写出好的程序,需要我们有扎实的基础,这样遇到一些基本算法的时候可能就会游刃有余了。在编程是我们要有丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,所以我们要通过多的途径来帮助自己建立较丰富的知识结构。在编程时我们会碰到了很多的困难,这就需要我们多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。在编程的过程中我们也看到了有良好的编程风格是十分重要的,至少在时间效率上就体现了这一点。养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致,这些都是提高我们编程的注意点。还有在变成中最能体现简单的原则。所以我们要思考讨论简单的程序,这样简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。附录程序代码/COPYRIGHTC20042007THREEWATERUPTECHCOM,ALLRIGHTSRESERVEDBYTHREEWTER2004512/说明CMAIN函数,UCOSII初始化等定义BUGTODOLIST修正2004512创建/INCLUDE“/UCOSII/INCLUDESH“/UC/OSINTERFACE/INCLUDE“/UCOSII/ADD/OSADDITIONH“INCLUDE“/INC/DRIVERSH“INCLUDE“/UCOSII/ADD/OSMESSAGEH“INCLUDE“/INC/SYS/LIBH“INCLUDE“/SRC/GUI/GUIH“INCLUDE“/UCOSII/ADD/RTCH“INCLUDEINCLUDEINCLUDEINCLUDEPRAGMAIMPORT_USE_NO_SEMIHOSTING_SWI/ENSURENOFUNCTIONSTHATUSESEMIHOSTING/任务定义/OS_STKMAIN_STACKSTACKSIZE0,/MAIN_TEST_TASK堆栈VOIDMAIN_TASKVOIDID/MAIN_TEST_TASKDEFINEMAIN_TASK_PRIO12OS_STKSNAKE_STACKSTACKSIZE0,/SNAKE_TEST_TASK堆栈VOIDSNAKE_TASKVOIDID/SNAKE_TEST_TASKDEFINESNAKE_TASK_PRIO16/已经定义的OS任务DEFINESYS_TASK_PRIO1/系统任务DEFINETOUCH_SCREEN_TASK_PRIO9/触摸屏任务DEFINEMAIN_TASK_PRIO12/主任务DEFINESNAKESTACK_PRIO16/游戏任务DEFINEKEY_SCAN_TASK_PRIO58/按键扫描任务DEFINELCD_FRESH_PRIO59/液晶屏刷新任务DEFINELED_FLASH_PRIO60/数码管刷新任务/事件定义/OS_EVENTWORLDSEM/定义全局信号量OS_EVENTGAMERUN/定义游戏运行信号量DEFINEW_XSIZE32/游戏屏幕的宽度DEFINEW_YSIZE21/游戏屏幕的高度DEFINECAKELENGTH3/定义每次吃个食物蛇长增加3/DEFSSTRUCTPT/定义坐标变量INT8UXINT8UYENUMWN_TYPE/定义枚举变量的方块类型TP_SPACE,/空白类型TP_BLOCK,/块状类型TP_CAKE,/食物类型TP_SKBODY,/蛇的躯体TP_SKHEAD,/蛇的头TP_SKTAIL/蛇的尾ENUMDIRECTIONUP0,DOWN1,LEFT2,RIGHT3/定义方向的枚举型变量TYPEDEFSTRUCTWORLDNODE/定义节点类型结构变量BOOLEANISBLOCK/布尔型变量ENUMWN_TYPETYPE/方块类型的变量ENUMDIRECTIONDIR/方向类型的变量ENUMDIRECTIONPREDIR/方向类型的变量STRUCTPTPOS/坐标类型的变量STRUCTWORLDNODENEXT/定义节点类型的指针WORLDNODE/FUNCTIONS函数声明VOIDUPDATENEXTNODESTRUCTWORLDNODEXNODE,ENUMDIRECTIONDIR/更新下一节点函数VOIDDRAWPOINTSTRUCTWORLDNODEXNODE/画方块函数VOIDRANDCAKEVOID/随机产生食物函数/GLOBALVARS/WORLDNODEWORLDARRAYW_YSIZEW_XSIZE/定义节点类型的数组大小为游戏界面的长和款WORLDNODEHEADNODE,TAILNODE,CAKENODE/定义节点类型的蛇头指针,蛇尾指针,食物指针INT8ULENTOADD0/需要增加的蛇长计数器CONSTINT8UREVERSEDIR41,0,3,2/第一反方向的常量INT8UERRNO/定义时间常量PDCPDC/定义绘图上下文设备INT32SSCORE0/得分U16GAMELEVEL1/GAME为关数,目前为三关,每关只改变速度U16TIMEUSE/游戏用时BOOLEANISRUNNING1/定义游戏运行标志U8FLAG10/定义第二关游戏标志U8FLAG20/定义第三关游戏标志/AD定义和初始化/DEFINEADCCON_FLAG0X1POSXXXNODEPOSYYIFGAMELEVEL1/根据不同的关口初始化界面IFX0|Y0|XW_XSIZE1|YW_YSIZE1/如果是第一关,则没有障碍物XNODETYPETP_BLOCKXNODEISBLOCK1ELSEXNODETYPETP_SPACEXNODEISBLOCK0ELSEIFGAMELEVEL2IFXW_XSIZE/2XNODEISBLOCK1ELSEXNODETYPETP_SPACEXNODEISBLOCK0ELSEIFXW_XSIZE/3|XW_XSIZE2/3XNODEISBLOCK1ELSEXNODETYPETP_SPACEXNODEISBLOCK0/SNAKEHEADXNODEXNODETYPETP_SKHEADXNODEISBLOCK1HEADNODEXNODEUPDATENEXTNODEXNODE,LEFTXNODEPREDIRLEFT/SNAKEBODYXNODEXNODETYPETP_SKBODYXNODEISBLOCK1UPDATENEXTNODEXNODE,LEFTXNODEPREDIRLEFT/SNAKETAILXNODEXNODETYPETP_SKTAILXNODEISBLOCK1TAILNODEXNODEUPDATENEXTNODEXNODE,LEFTXNODEPREDIRLEFTRANDCAKE/产生食物OSSEMPOSTWORLDSEM/释放该全局信号量/游戏结束/VOIDGAMEOVERVOID/显示游戏结束界面U16TEXT2100STRCHAR2UNICODETEXT2,“GAMEOVER“/转换成UNICODE码CLEARSCREEN/清屏PDCCREATEDC/创建绘图上下文设备TEXTOUTPDC,230,230,TEXT2,TRUE,FONTSIZE_MIDDLE/显示游戏结束画面OSTIMEDLY500/延迟一定时间DESTORYDCPDC/删除绘图设备上下文/利用随机函数RANK产生随机方块/VOIDRANDCAKEVOID/GETANEWRANDCAKEPOSITIONINT32UX,YWHILE1/产生在游戏界面内的食物XRANDW_XSIZEYRANDW_YSIZEIFWORLDARRAYYXISBLOCK/不在界面内就重新生成BREAKCAKENODECAKENODETYPETP_CAKEDRAWPOINTCAKENODE/画出食物CHARPBUF2000/画图显示/VOIDSHOWWORLDVOIDINT8UX,YWORLDNODEXNODEFORY0YTYPECASETP_SKBODYFILLRECTPDC,XNODEPOSX20,XNODEPOSY20,XNODEPOSX1201,XNODEPOSY1201,GRAPH_MODE_NORMAL,RGB255,255,0BREAKCASETP_SKHEADFILLRECTPDC,XNODEPOSX20,XNODEPOSY20,XNODEPOSX1201,XNODEPOSY1201,GRAPH_MODE_NORMAL,RGB255,255,0BREAKCASETP_SKTAILFILLRECTPDC,XNODEPOSX20,XNODEPOSY20,XNODEPOSX1201,XNODEPOSY1201,GRAPH_MODE_NORMAL,RGB255,255,0BREAKCASETP_SPACEFILLRECTPDC,XNODEPOSX20,XNODEPOSY20,XNODEPOSX1201,XNODEPOSY1201,GRAPH_MODE_NORMAL,RGB255,255,255BREAKCASETP_BLOCKFILLRECTPDC,XNODEPOSX20,XNODEPOSY20,XNODEPOSX1201,XNODEPOSY1201,GRAPH_MODE_NORMAL,RGB0,0,255BREAKCASETP_CAKEFILLRECTPDC,XNODEPOSX20,XNODEPOSY20,XNODEPOSX1201,XNODEPOSY1201,GRAPH_MODE_NORMAL,RGB0,0,0BREAK/更新蛇的各个节点的方向/VOIDUPDATENEXTNODEWORLDNODEXNODE,ENUMDIRECTIONDIR/STRUCTPTPOSIFXNODETYPETP_SKHEADIFREVERSEDIRDIRHEADNODEPREDIRRETURNPOSXNODEPOSSWITCHDIRCASEUPPOSYBREAKCASEDOWNPOSYBREAKCASELEFTPOSXBREAKCASERIGHTPOSXBREAKXNODEDIRDIRXNODENEXT/下一关界面/VOIDNEXTLEVELVOID/上一关结束,准备进入下一关U16TEXT3100STRCHAR2UNICODETEXT3,“NEXTLEVEL“/转换成UNICODE码CLEARSCREEN/清屏TEXTOUTPDC,230,230,TEXT3,TRUE,FONTSIZE_MIDDLE显示下一关界面OSTIMEDLY500/延迟一定时间/蛇步进驱动函数/INT8USNAKESTEPVOID/DRIVETHESNAKETOGOASTEPINT8UNRET0OSSEMPENDWORLDSEM,0,/等待信号量/SOMETHINGFORTAILIFLENTOADD0/如果不为零则不更新擦除蛇尾LENTOADDELSETAILNODETYPETP_SPACETAILNODEISBLOCK0DRAWPOINTTAILNODE/OLDTAILTAILNODETAILNODENEXTTAILNODETYPETP_SKTAILDRAWPOINTTAILNODE/NEWTAIL/更新蛇头HEADNODETYPETP_SKBODY/OLDHEADDRAWPOINTHEADNODEHEADNODENEXTPREDIRHEADNODEDIR/SAVEPREDIRHEADNODEHEADNODENEXT/NEWHEADIFHEADNODEISBLOCK/判断是否妆到障碍物或者边界NRET1/HITABLOCKGOTOSNAKESTEP_ENDELSE/如果没有判断是否撞到食物HEADNODEISBLOCK1IFHEADNODETYPETP_CAKESCORE/撞到加分IFSCORE5/判断是否进入第二关FLAG11ELSEIFSCORE10/判断是否进入第三关FLAG21LENTOADDCAKELENGTH/蛇长增加计数器加上固定长度RANDCAKE/重新随机产生食物ELSEFLAG10FLAG20/THENHEADNODETYPETP_SPACEHEADNODETYPETP_SKHEADUPDATENEXTNODEHEADNODE,HEADNODEPREDIRDRAWPOINTHEADNODESNAKESTEP_ENDOSSEMPOSTWORLDSEM/释放信号量RETURNNRET/返回参数/方向键对应的响应函数/VOIDSK_KEY_UPVOIDUPDATENEXTNODEHEADNODE,UPVOIDSK_KEY_DOWNVOIDUPDATENEXTNODEHEADNODE,DOWNVOIDSK_KEY_LEFTVOIDUPDATENEXTNODEHEADNODE,LEFTVOIDSK_KEY_RIGHTVOIDUPDATENEXTNODEHEADNODE,RIGHT/键盘处理程序/定义符号常量DEFINEK_UP56|0X80000000DEFINEK_DOWN50|0X80000000DEFINEK_LEFT52|0X80000000DEFINEK_RIGHT54|0X80000000U8ONKEYINTNKEY,INTFNKEYOSSEMPENDWORLDSEM,0,/等待全局信号量SWITCHNKEY/判断按键类型CASER/ENTERIFISRUNNING/如果游戏正在进行OSSEMPENDGAMERUN,0,/占有信号量ISRUNNINGFALSEELSEOSSEMPOSTGAMERUN/否则释放信号量ISRUNNINGTRUEBREAKCASEK_UP/方向键的相应SK_KEY_UPBREAKCASEK_DOWNSK_KEY_DOWNBREAKCASEK_LEFTSK_KEY_LEFTBREAKCASEK_RIGHTSK_KEY_RIGHTBREAKOSSEMPOSTWORLDSEMRETURNTRUE/游戏关数显示/VOIDDSPGAMELEVELU16GAMELEVELU16S16BUF100STRCHAR2UNICODES16BUF,“LEVEL“TEXTOUTPDC,240,450,S16BUF,TRUE,FONTSIZE_MIDDLEINT2UNICODEGAMELEVEL,S16BUFTEXTOUTPDC,320,450,S16BUF,TRUE,FONTSIZE_MIDDLE/分数显示/VOIDDSPSCOREU16SCOREU16S16BUF100STRCHAR2UNICODES16BUF,“SCORE“TEXTOUTPDC,20,450,S16BUF,TRUE,FONTSIZE_MIDDLEINT2UNICODESCORE,S16BUFTEXTOUTPDC,100,450,S16BUF,TRUE,FONTSIZE_MIDDLE/用时显示/VOIDDSPTIMEUSEU16TIMEUSEU16S16BUF100U8SHI,FEN,MIAOSHITIMEUSE/3600/时间格式的转换FENTIMEUSE3600/60MIAOTIMEUSE60STRCHAR2UN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年智能制造技能模考试题及答案
- 2025中小学诗词大会题库100题题库(含答案)
- 医疗器械考试试题(含答案)
- 2025工业互联网技术考试及答案
- 2025年高中教师年度工作总结
- 2025年生产安全事故警示教育专题及答案
- 2025年机修钳工(三级)考试试卷含答案
- 品牌管理2026年价值传递
- 2026 年专用型离婚协议书官方模板
- 2026 年无财产离婚协议书官方模板
- 工业互联网标准体系(版本3.0)
- 培养小学生的实验操作能力
- 河南省洛阳市2023-2024学年九年级第一学期期末质量检测数学试卷(人教版 含答案)
- Unit-3-Reading-and-thinking课文详解课件-高中英语人教版必修第二册
- 气动回路图与气动元件课件
- 《念奴娇 赤壁怀古》《永遇乐 京口北固亭怀古》《声声慢》默写练习 统编版高中语文必修上册
- 妇产科病史采集临床思维
- 众辰变频器z2400t-15gy-1说明书
- DB63T 393-2002草地鼠虫害、毒草调查技术规程
- 船体振动的衡准及减振方法
- 复议诉讼证据清单通用版
评论
0/150
提交评论