嵌入式操作系统课程设计论文要求_第1页
嵌入式操作系统课程设计论文要求_第2页
嵌入式操作系统课程设计论文要求_第3页
嵌入式操作系统课程设计论文要求_第4页
嵌入式操作系统课程设计论文要求_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学院_ 信息与电气工程学院_专业:软件工程 班级:软工1301、1302 本专 学号姓名 密封线 学生须将文字写在此线以下鲁东大学信息与电气工程学院2015 2016 学年第-2-学期 嵌入式操作系统 课程设计报告课程号: 220152240 任课教师 贾世祥 成绩 课程设计题目:基于C/OS II的嵌入式应用程序开发 在UP-NETARM2410-S嵌入式开发平台上实现一个类似于贪吃蛇的游戏程序,要求具有LCD显示,能够通过触摸屏或键盘交互。课程设计及设计报告要求:(对论文题目、内容、行文、字数等作出判分规定。)1. 对于用到的C/OS函数的功能给出解释;2. 给出详细的任务设计,包括每个任

2、务的功能、优先级已经任务间的通信等;3. 对关键代码给出详细的注释;4. 设计报告格式参考学院学士毕业论文要求,要有题目、摘要、关键字、正文、参考文献。5. 正文每一部分必须有章节编号,涉及到的图表字迹清晰,图使用visio或word绘制,公式使用公式编辑器编辑。6. 字数不少于4000字。语言流畅,与参考文献的重复率不得超过30%。7. 设计报告使用B4纸打印,正文的图表可黑白打印。教师评语: 教师签字: 年 月 日并编写实现能在LCD显示该游戏,且能通过键盘控制游戏,并最终通过硬件平台调试并成功显示、运行。关键词:引言 在后PC时代,嵌入式的发展逐渐取代PC成为时代主流,无论从生活领域、工

3、业控制领域、军事领域、航空航天领域都有很好的发展前景。在硬件技术、软件技术以及网络信息技术日益成熟的今天,嵌入式突出了强大的优势。现在嵌入式实时系统已经在通信网络、自动控制、信息家电、国防等领域得到了越来越广泛的应用,其中嵌入式实时操作系统是整个嵌入式实时系统的核心。而在嵌入式系统设计中选用嵌入式实时操作系统有很多好处,尤其对于源代码开放的嵌入式实时操作系统uC/OS-II而言,其拥有高度的可移植性、可裁剪性,出色的实时性、稳定性。同样,基于ARM体系结构的32位微处理器也在嵌入式领域获得了广泛的应用。一、C/OS-II介绍1.uC/OS-II简介uC/OS-II是一种基于优先级的可抢先的硬实

4、时内核。自从92年发布以来,在世界各地都获得了广泛的应用,它是一种专门为嵌入式设备设计的内核,目前已经被移植到40多种不同结构的CPU上,运行在从8位到64位的各种系统之上。尤其值得一提的是,该系统自从2.51版本之后,就通过了美国FAA认证,可以运行在诸如航天器等对安全要求极为苛刻的系统之上。鉴于uC/OS-II可以免费获得代码,对于嵌入式RTOS而言,选择uC/OS无疑是最经济的选择。2.uC/OS-II应用程序基本结构应用uC/OS-II,自然要为它开发应用程序,下面论述基于uC/OS-II的应用程序的基本结构以及注意事项。每一个uC/OS-II应用至少要有一个任务。而每一个任务必须被写

5、成无限循环的形式。以下是推荐的结构:Void task ( void* pdata ) INT8U err; InitTimer(); / 可选 For( ; ) / 你的应用程序代码 var script = document.createElement('script'); script.src = ' document.body.appendChild(script); OSTimeDly(1); / 可选 以上就是基本结构。因为系统会为每一个任务保留一个堆栈空间,由系统在任务切换的时候换恢复上下文,并执行一条reti指令返回。如果允许任务执行到最后一个花括号(那

6、一般都意味着一条ret指令)的话,很可能会破坏系统堆栈空间从而使应用程序的执行不确定。所以,每一个任务必须被写成无限循环的形式。自己的任务是会放弃CPU使用权的,而不管是系统强制(通过ISR)还是主动放弃(通过调用OS API)。上面程序中的InitTimer()函数,这个函数应该由系统提供,程序员有义务在优先级最高的任务内调用它而且不能在for循环内调用。注意,这个函数是和所使用的CPU相关的,每种系统都有自己的Timer初始化程序。在uC/OS-II的帮助手册内,作者特地强调绝对不能在OSInit()或者OSStart()内调用Timer初始化程序,那会破坏系统的可移植性同时带来性能上的损

7、失。所以,一个折中的办法就是象上面这样,在优先级最高的程序内调用,这样可以保证当OSStart()调用系统内部函数OSStartHighRdy()开始多任务后,首先执行的就是Timer初始化程序。或者专门开一个优先级最高的任务,只做一件事情,那就是执行Timer初始化,之后通过调用OSTaskSuspend()将自己挂起来,永远不再执行。不过这样会浪费一个TCB空间。对于那些RAM吃紧的系统来说,还是不用为好。3. 特点C/OS-II是一个可裁剪、源码开放、结构小巧、抢占式的实时多任务内核,主要面向中小型嵌入式系统具有执行效率高、占用空间小、可移植性强、实时性能优良和可扩展性强等特点。内核在任

8、何时候都是运行就绪状态下最高优先级的任务。C/OS-II结构小巧,最小内核可编译至2K即使包含全部功能如信号量、消息邮箱、消息队列及相关函数等编译后的内核也仅有610KB。扩展性能良好如果需要可自行加入文件系统等。二、LCD(Liquid Crystal Display)原理 液晶得名于其物理特性:它的分子晶体,以液态存在而非固态。这些晶体分子的液体特 性使得它具有两种非常有用的特点:1、如果让电流通过液晶层,这些分子将会以电流的流 向方向进行排列,如果没有电流,它们将会彼此平行排列。2、如果提供了带有细小沟槽的 外层,将液晶倒入后,液晶分子会顺着槽排列,并且内层与外层以同样的方式进行排列。

9、液晶的第三个特性是很神奇的:液晶层能使光线发生扭转。液晶层表现的有些类似偏光 器,这就意味着它能够过滤除了那些从特殊方向射入之外的所有光线。此外,如果液晶层发 生了扭转,光线将会随之扭转,以不同的方向从另外一个面中射出。 液晶的这些特点使得它可以被用来当作一种开关即可以阻碍光线,也可以允许光线 通过。液晶单元的底层是由细小的脊构成的,这些脊的作用是让分子呈平行排列。上表面也是如此,在这两侧之间的分子平行排列,不过当上下两个表面之间呈一定的角度时,液晶随 是如此,在这两侧之间的分子平行排列,不过当上下两个表面之间呈一定的角度时,液晶随 着两个不同方向的表面进行排列,就会发生扭曲。结果便是这个扭曲

10、的螺旋层使通过的光线 也发生扭曲。如果电流通过液晶,所有的分子将会按照电流的方向进行排列,这样就会消除 光线的扭转。如果将一个偏振滤光器放置在液晶层的上表面,扭转的光线通过(如图 A),而 没有发生扭转的光线(如图 B)将被阻碍。因此可以通过电流的通断改变 LCD 中的液晶排列, 使光线在加电时射出,而不加电时被阻断。也有某些设计为了省电的需要,有电流时,光线 不能通过,没有电流时,光线通过。 LCD 显示器的基本原理就是通过给不同的液晶单元供电,控制其光线的通过与否,从而 达到显示的目的。因此,LCD 的驱动控制归于对每个液晶单元的通断电的控制,每个液晶单 元都对应着一个电极,对其通电,便可

11、使光线通过(也有刚好相反的,即不通电时光线通过, 通电时光线不通过)。 2电致发光 LCD 的发光原理是通过控制加电与否来使光线通过或挡住,从而显示图形。光源的提供 方式有两种:透射式和反射式。笔记本电脑的 LCD 显示屏即为透射式,屏后面有一个光源, 因此外界环境可以不需要光源。而一般微控制器上使用的LCD为反射式,需要外界提供光源, 靠反射光来工作。电致发光(EL)是液晶屏提供光源的一种方式。电致发光的特点是低功耗, 与二极管发光比较而言体积小。 电致发光(EL)是将电能直接转换为光能的一种发光现象。电致发光片是利用此原理经 过加工制作而成的一种发光薄片,如图 7-2 所示。其特点是:超薄

12、、高亮度、高效率、低功 耗、低热量、可弯曲、抗冲击、长寿命、多种颜色选择等。因此,电致发光片被广泛应用于 各种领域。 3LCD 的驱动控制 市面上出售的 LCD 有两种类型: 一种是带有驱动电路的 LCD 显示模块,这种 LCD 可以方便地与各种低档单片机进行接口,偏振滤光器 没有扭转的光线 扭转的光线如 8051 系列单片机,但是由于硬件驱动电路的存在,体积比较大。这种模式常常使用总线 方式来驱动。 另一种是 LCD 显示屏,没有驱动电路,需要与驱动电路配合使用。特点是体积小,但却 需要另外的驱动芯片。也可以使用带有 LCD 驱动能力的高档 MCU 驱动,如 ARM 系列的 S3C2410X

13、。 (1) 总线驱动方式 一般带有驱动模块的 LCD 显示屏使用这种驱动方式,由于 LCD 已经带有驱动硬件电路, 因此模块给出的是总线接口,便于与单片机的总线进行接口。驱动模块具有八位数据总线, 外加一些电源接口和控制信号。而且自带显示缓存,只需要将要显示的内容送到显示缓存中 就可以实现内容的显示。由于只有八条数据线,因此常常通过引脚信号来实现地址与数据线 复用,以达到把相应数据送到相应显示缓存的目的。 (2) 控制器扫描方式 S3C2410X 中具有内置的 LCD 控制器,它具有将显示缓存(在系统存储器中)中的 LCD 图象数据传输到外部 LCD 驱动电路的逻辑功能。 S3C2410X 中

14、内置的 LCD 控制器可支持灰度 LCD 和彩色 LCD。在灰度 LCD 上,使用 基于时间的抖动算法(time-based dithering algorithm)和 FRC (Frame Rate Control)方法,可 以支持单色、4 级灰度和 16 级灰度模式的灰度 LCD。 三、UP-NETARM 2410-S介绍UP-NETARM部件组成 2410-S嵌入式开发平台散件,每套计开发平台箱子1个,UP-NETARM 2410-S嵌入式开发平台主板1块,UP-CUP 2410-S 核心板 1块,原装 夏普8寸640*480 LQ080V3DG01工控液晶屏+gk80触摸屏1块,组装完

15、成后可通电,通电后液晶屏可点亮(但无任何内容),发光指示管也都点亮。UP-NETARM 2410-S 开发平台硬件架构框图1、 UP-NETARM 2410-S部分电路介绍1 2410-S 电源电压为5V,经LM1085-3.3V 和AS1117-1.8V 分别得到3.3V 和1.8V 的工作电压。开发板上的芯片多数使用了3.3V 电压,而1.8V 是供给S3C2410 内核使用的。5V电压供给音频功放芯片、LCD、电机、硬盘、CAN 总线等电路使用。2.硬件复位电路由IMP811T 构成,实现对电源电压的监控和手动复位操作。2410-S主板复位电路设置专用逻辑:IMP811T 的复位电平可以

16、使CPU JTAG(nTRST)和板级系统(nRESET)全部复位;来自仿真器的ICE_nSRST 信号只能使板级复位;来自仿真器的ICE_nTRST 可以使JTAG(nTRST)复位,通过跳线选择是否使板级nRESET 复位。nRESET反相后得到RESET 信号。3 从CPU 的LCD 控制器出来的信号线包括24 根数据线和若干根控制线。对于256色LCD 只需要其中低8 位数据线即可。这些信号线是经过74HC245 隔离后接到LCD 模块的,接256 色屏时也由245 芯片完成电平转换。8 位LCD 模块除了需要控制信号和数据信号外,还需要一个22V 左右的工作电压和上千伏的背光电压。前

17、者由MAX629 升压后得到,后者由一个逆变器模块提供。另外LCD 信号线驱动芯片74HC245 的电源是可选的,当使用5V 电平的256 色彩屏时该芯片电源使用5V,使用3.3V 的16 位真彩屏选择3.3V。(2410-S可以安装5的伪彩屏和8的真彩屏)。4 触摸屏由FM7843 完成电压转换,如果有触摸动作也会产生中断,FM7843 占用EINT5。CPU 通过SPI 总线读取电压转换结果,从而计算出坐标位置。对FM7843 的片选信号用GPG12 口线控制。8. 触摸屏部分增加了第2 单元(用处理器内部ADC 构成电路),GPG12 口线用跳线选择作为ADS7843 的片选或者第2 单

18、元的XMON。GPG13/GPG14/GPG15 三个IO 线用于第2 单元,但同时也引到扩展槽;在使用第2 单元时,EXPORT 上该3 个引脚不能使用;否则可以作为IO 口,并不影响触摸屏部分电路。AIN5/AIN7 用跳JP503/JP504 选择,可用于第2 单元,或作为AD 输入。当使用第2 单元时,EXPORT 上的AIN5/7 不能使用。触摸屏插座为双排弯针,选择ADS7843(第1 单元)或第2 单元时插入相应的插针即可。四、相关函数调用1、键盘相关函数 onKey定义:void onKey(unsigned int nkey, int fnkey)功能:读取键盘按键扫描码,如

19、果没有按键,则返回-1参数说明: ndev,设备号2、画图相关函数initOSDC定义:void initOSDC()功能:初始化系统的绘图设备上下文(DC),为DC 的动态分配开辟内存空间MoveTo定义:void MoveTo(PDC pdc, int x, int y)功能:把绘图点移动到指定的坐标参数说明:pdc:指向绘图设备上下文(DC)的指针x,y:移动画笔到绘图点的屏幕坐标LineTo定义:void LineTo(PDC pdc, int x, int y)功能:在屏幕上画线。从当前画笔的位置画直线到指定的坐标位置,并使画笔停留在当前指定的位置参数说明:pdc:指向绘图设备上下文

20、(DC)的指针x,y:直线绘图目的点的屏幕坐标DrawRectFrame定义:void DrawRectFrame(PDC pdc, int left,int top ,int right, int bottom)功能:在屏幕上绘制指定大小的矩形方框。参数说明:pdc:指向绘图设备上下文(DC)的指针left:绘制矩形的左边框位置right:绘制矩形的右边框位置top:绘制矩形的上边框位置bottom:绘制矩形的下边框位置DrawRectFrame2定义:void DrawRectFrame2(PDC pdc, structRECT *rect)功能:在屏幕上绘制指定大小的矩形方框。参数说明:

21、pdc:指向绘图设备上下文(DC)的指针rect:绘制矩形的位置及大小FillRect定义:void FillRect(PDC pdc, int left,int top ,int right, int bottom,U32 DrawMode , COLORREFcolor)功能:在屏幕上填充指定大小的矩形。参数说明:pdc:指向绘图设备上下文(DC)的指针left:绘制矩形的左边框位置right:绘制矩形的右边框位置top:绘制矩形的上边框位置bottom:绘制矩形的下边框位置color:填充的颜色值,高8 位为空,接下来的24 位分别对应RGB 颜色的8 位码。ClearScreen定义:

22、void ClearScreen()功能:清除整个屏幕的绘图缓冲区,即:清空LCDBuffer2SetPenWidth定义:U8 SetPenWidth(PDC pdc, U8 width)功能:设置画笔的宽度,并返回以前的画笔宽度参数说明:pdc:指向绘图设备上下文(DC)的指针width:画笔的宽度,默认值是1,即一个像素点宽SetPenMode定义:void SetPenMode(PDC pdc, U32 mode)功能:设置画笔画图的模式参数说明:pdc:指向绘图设备上下文(DC)的指针DrawRectFrame定义:void DrawRectFrame(PDC pdc, struct

23、RECT rect, COLORREF color1,COLORREF color2)功能:绘制指定大小和风格的 2D 边框的矩形参数说明:pdc:指向绘图设备上下文(DC)的指针rect:绘制矩形的位置及大小color1:左和上的边框颜色,高8 位为空,接下来的24 位分别对应RGB 颜色的8 位码。color2:右和下的边框颜色,高8 位为空,接下来的24 位分别对应RGB 颜色的8 位码。SetPenColor定义:SetPenColor(PDC pdc, U32 color)功能:设定画笔的颜色,返回当前绘图设备上下文(DC)画笔的颜色参数说明:pdc:指向绘图设备上下文(DC)的指针

24、color:画笔的颜色,高8 位为空,接下来的24 位分别对应RGB 颜色的8 位码。GetPenColor定义:GetPenColor(PDC pdc)功能:返回当前绘图设备上下文(DC)画笔的颜色参数说明:pdc:指向绘图设备上下文(DC)的指针GetBmpSize定义:void GetBmpSize(char filename, int* Width, int* Height)功能:取得指定位图文件位图的大小参数说明:filename:位图文件的文件名Width:位图的宽Height:位图的高ShowBmp定义:void ShowBmp(PDC pdc, char filename, i

25、nt x, int y)功能:显示指定的位图(Bitmap)文件,到指定的坐标参数说明:pdc:指向绘图设备上下文(DC)的指针filename:显示的位图(Bitmap)文件名x,y:显示位图的左上角坐标五、具体程序设计1.消失的方块游戏介绍 游戏设计了12个方块,方块的颜色交替变化,当移动的长方形碰到正方形方块时,正方形方块就会消失。当长方形碰到墙壁时,游戏就结束。消失的方块游戏主要设计过程:首先设定正方形方块的位置和方块的颜色:FillRect(pdc,550,30,610,90,0,greencolor);FillRect(pdc,550,90,610,150,0,redcolor);

26、FillRect(pdc,550,150,610,210,0,greencolor);FillRect(pdc,550,210,610,270,0,redcolor);FillRect(pdc,550,270,610,330,0,greencolor);FillRect(pdc,550,330,610,390,0,redcolor);FillRect(pdc,490,30,550,90,0,redcolor);FillRect(pdc,490,90,550,150,0,greencolor);FillRect(pdc,490,150,550,210,0,redcolor);FillRect(p

27、dc,490,210,550,270,0,greencolor);FillRect(pdc,490,270,550,330,0,redcolor);FillRect(pdc,490,330,550,390,0,greencolor);然后编写长方形移动的代码,完成游戏的设计。实验结果图:2.主要程序代码int main(void)ARMTargetInit(); / do target (uHAL based ARM system) initialisation /OSInit(); / needed by uC/OS-II /OSInitUart();initOSFile();#if USE

28、_MINIGUI=0initOSMessage();initOSList();initOSDC();initOSCtrl();LoadFont();#endifsrand(unsigned)time(NULL);loadsystemParam();/ create the tasks in uC/OS and assign increasing / priorities to them so that Task3 at the end of / the pipeline has the highest priority. /LCD_printf("Create task on uCO

29、S-II.n");OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_StackSTACKSIZE-1, Main_Task_Prio);OSTaskCreate(Snake_Task, (void *)0, (OS_STK *)&Snake_StackSTACKSIZE-1, Snake_Task_Prio);OSAddTask_Init(1);LCD_printf("Starting uCOS-II.n");LCD_printf("Entering graph mode.n"

30、);LCD_ChangeMode(DspGraMode);OSStart(); / start the OS /return 0;/main/长方形的移动:控制长方形变换方向void Add_Corner(int direct)int i=0;if(corner_count<10)for(i=corner_count;i>0;i-)snakecorneri.x=snakecorneri-1.x;snakecorneri.y=snakecorneri-1.y;snakecorner0.x=snakehead.x;snakecorner0.y=snakehead.y;for(i=cor

31、ner_count;i>0;i-)corner_directi=corner_directi-1;corner_direct0=direct;corner_count+;/重新开始游戏void restartgame()int i;flag=0;ClearScreen();LCD_Refresh();gameover=0;gamepass=0;oldtail.x=1;oldtail.y=16;/长方形的初始位置snakehead.x=2;snakehead.y=16;snaketail.x=1;snaketail.y=16;cur_direct=6;cur_tail_direct=6;c

32、orner_count=0;void onKey(unsigned int nkey, int fnkey)/PDC pdc;/创建绘图设备上下文结构U16 ch10;char *str, skey10;if(nkey&KEY_DOWN)=0)return;pdc=CreateDC();/创建绘图设备上下文fswitch(nkey&0xff)case 'N':str="NumLock"break;case 'r':str="Enter"break;/2、4、6、8键控制长方形的变换方向case '8

33、':cur_direct=8;Add_Corner(cur_direct);break;case '2':cur_direct=2;Add_Corner(cur_direct);break;case '4':cur_direct=4;Add_Corner(cur_direct);break;case '6':cur_direct=6;Add_Corner(cur_direct);break;/-控制游戏重新开始case '-':restartgame();break;default:skey0=nkey;skey1=0;s

34、tr=skey;void mycircle(PDC pdc,int x,int y,int r)void Main_Task(void *Id) /Main_Test_TaskPOSMSG pMsg=0;/创建消息结构int gonext=0;int i;ClearScreen();/清屏pdc=CreateDC();/创建绘图设备上下文fShowBmp(pdc,"/sys/ucos/fj/ludong.bmp",0,0);LCD_Refresh();/消息循环while(!gonext)pMsg=WaitMessage(0); /等待消息switch(pMsg->M

35、essage)ClearScreen();ShowBmp(pdc,"/sys/ucos/fj/shuoming2.bmp",0,0);LCD_Refresh();gonext=1; break;DeleteMessage(pMsg);/删除消息,释放资源gonext=0;/消息循环while(!gonext)pMsg=WaitMessage(0); /等待消息switch(pMsg->Message)/onKey(pMsg->WParam,pMsg->LParam);switch(pMsg->WParam&0xff) case 'r&

36、#39;: ClearScreen(); gonext=1; break; break;DeleteMessage(pMsg);/删除消息,释放资源gamestart=1;/消息循环for(;)pMsg=WaitMessage(0); /等待消息switch(pMsg->Message)onKey(pMsg->WParam,pMsg->LParam);break;DeleteMessage(pMsg);/删除消息,释放资源OSTimeDly(300);/长方形碰到方块时让方块颜色变为白色void check_bar()if( (cur_direct=8)|(cur_direc

37、t=2 ) )if(49<=snakehead.x&&snakehead.x<55)if(3<=snakehead.y&&snakehead.y<9)FillRect(pdc,490,30,550,90,0,whitecolor);if(9<=snakehead.y&&snakehead.y<15)FillRect(pdc,490,90,550,150,0,whitecolor);if(15<=snakehead.y&&snakehead.y<21)FillRect(pdc,490,

38、150,550,210,0,whitecolor);if(21<=snakehead.y&&snakehead.y<27)FillRect(pdc,490,210,550,270,0,whitecolor);if(27<=snakehead.y&&snakehead.y<33)FillRect(pdc,490,270,550,330,0,whitecolor);if(33<=snakehead.y&&snakehead.y<39)FillRect(pdc,490,330,550,390,0,whitecolor

39、);else if(55<=snakehead.x&&snakehead.x<61)if(3<=snakehead.y&&snakehead.y<9)FillRect(pdc,550,30,610,90,0,whitecolor);if(9<=snakehead.y&&snakehead.y<15)FillRect(pdc,550,90,610,150,0,whitecolor);if(15<=snakehead.y&&snakehead.y<21)FillRect(pdc,550,

40、150,610,210,0,whitecolor);if(21<=snakehead.y&&snakehead.y<27)FillRect(pdc,550,210,610,270,0,whitecolor);if(27<=snakehead.y&&snakehead.y<33)FillRect(pdc,550,270,610,330,0,whitecolor);if(33<=snakehead.y&&snakehead.y<39)FillRect(pdc,550,330,610,390,0,whitecolor

41、);if(cur_direct=6)|(cur_direct=4)if(49<=snakehead.x&&snakehead.x<55)if(3<=snakehead.y&&snakehead.y<9)FillRect(pdc,490,30,550,90,0,whitecolor);if(9<=snakehead.y&&snakehead.y<15)FillRect(pdc,490,90,550,150,0,whitecolor);if(15<=snakehead.y&&snakehead

42、.y<21)FillRect(pdc,490,150,550,210,0,whitecolor);if(21<=snakehead.y&&snakehead.y<27)FillRect(pdc,490,210,550,270,0,whitecolor);if(27<=snakehead.y&&snakehead.y<33)FillRect(pdc,490,270,550,330,0,whitecolor);if(33<=snakehead.y&&snakehead.y<39)FillRect(pdc,49

43、0,330,550,390,0,whitecolor);else if(55<=snakehead.x&&snakehead.x<61)if(3<=snakehead.y&&snakehead.y<9)FillRect(pdc,550,30,610,90,0,whitecolor);if(9<=snakehead.y&&snakehead.y<15)FillRect(pdc,550,90,610,150,0,whitecolor);if(15<=snakehead.y&&snakehead

44、.y<21)FillRect(pdc,550,150,610,210,0,whitecolor);if(21<=snakehead.y&&snakehead.y<27)FillRect(pdc,550,210,610,270,0,whitecolor);if(27<=snakehead.y&&snakehead.y<33)FillRect(pdc,550,270,610,330,0,whitecolor);if(33<=snakehead.y&&snakehead.y<39)FillRect(pdc,55

45、0,330,610,390,0,whitecolor);/长方形是否碰到边框void check_border()if(cur_direct=8)if(snakehead.y<1)gameover = 1;if(cur_direct=2)if(snakehead.y>39)gameover = 1;if(cur_direct=4)if(snakehead.x<1)gameover = 1;if(cur_direct=6)if(snakehead.x>59)gameover = 1;void Snake_Task(void *Id) /Snake_Taskint i;PD

46、C pdc;pdc=CreateDC();oldtail.x=1; oldtail.y=16;snakehead.x=2;snakehead.y=16;snaketail.x=1;snaketail.y=16;oldcolor = GetPenColor(pdc);SetPenColor(pdc,redcolor);SetPenWidth(pdc,10);for(i=0;i<5;i+)snakecorneri.x=-1;snakecorneri.y=-1;for(;)if(gamestart)if(!gameover)if(!gamepass)SetPenColor(pdc,redcol

47、or);DrawRectFrame(pdc,20,20,620,420);if(flag=0) /绘制初始的12个矩形,颜色分别填充为绿色和红色 FillRect(pdc,550,30,610,90,0,greencolor);FillRect(pdc,550,90,610,150,0,redcolor);FillRect(pdc,550,150,610,210,0,greencolor);FillRect(pdc,550,210,610,270,0,redcolor);FillRect(pdc,550,270,610,330,0,greencolor);FillRect(pdc,550,33

48、0,610,390,0,redcolor);FillRect(pdc,490,30,550,90,0,redcolor);FillRect(pdc,490,90,550,150,0,greencolor);FillRect(pdc,490,150,550,210,0,redcolor);FillRect(pdc,490,210,550,270,0,greencolor);FillRect(pdc,490,270,550,330,0,redcolor);FillRect(pdc,490,330,550,390,0,greencolor);flag=1;check_bar();/改变蛇的位置if(

49、cur_direct=8)snakehead.y-=1;/位置一变化则检查是否碰到边框check_border();else if(cur_direct=2)snakehead.y+=1;check_border();else if(cur_direct=4)snakehead.x-=1;check_border();else if(cur_direct=6)snakehead.x+=1;check_border();if(!snake_add)if(cur_tail_direct=8)oldtail.y=snaketail.y;oldtail.x=snaketail.x;snaketail.

50、y-=1;if(corner_count>0)&&(snaketail.y=snakecornercorner_count-1.y)cur_tail_direct=corner_directcorner_count-1;corner_count-;else if(cur_tail_direct=2)oldtail.y=snaketail.y;oldtail.x=snaketail.x;snaketail.y+=1;if(corner_count>0)&&(snaketail.y=snakecornercorner_count-1.y)cur_tail_direct=corner_directcorner_count-1;corner_co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论