已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
此文档收集于网络,如有侵权,请联系网站删除嵌入式期末考之贪吃蛇游戏机的设计一、 项目总体说明1、用arm7系列型号为lpc2131的芯片设计一个贪吃蛇游戏机,其中还加入了UCOS II操作系统。2、用LCD12864来显示游戏的主界面,以及用LCD1602显示游戏开始的计时(Time)、游戏所得的分数(Score)和游戏通过的关数(Lv)。其中“蛇”每吃的一个果实分数加1分,吃到2个果实游戏的关数加1,随着分数和关数的增加,“蛇”跑动的速度越快,“蛇”的长度也越长,游戏的难度也越大。当“蛇”碰到游戏界面的边框时,游戏结束.3、用5个独立按键来控制“蛇”的上、下、左、右,以及游戏的重新开始。二、 项目硬件设计1、电源模块:用3.3V的直流电源。2、控制模块:采用独立式按键,独立式按键电路配置灵活,硬件结构简单,但每个按键必须占用一根I/O口线。在按键数量较多时,I/O口浪费较大。故只在按键数量不多时,采用这种按键。3、显示模块:采用LCD12864和LCD1602,它是一种专门用于显示字母、数字、符号、字符等点阵式LCD。其有显示质量高、数字接口、功耗低、体积小等优点。LPC2131LCD12864控制模块电源模块LCD1602图2.1 硬件模块划分三、 项目软件设计1、本设计包含了Configure.h、Includes.H、Os_cfg.h、LCD1602.h、LCD12864.h、Font.h、Graphic.h等头文件。以及包含了游戏显示信息GameInfo.c,按键处理KeyProcess.c,游戏处理GamePlay.c,游戏图形处理GameGraph.c,游戏动作处理GameActive.c等.c文件。2、主函数main.c里面包括了系统初始化函数OSInit(),界面初始化函数vGUIInit(),游戏初始化函数vGameInit(),以及系统开始函数OSStart()。3、UCOS II操作系统中,在游戏初始化函数vGameInit()中创建了一个游戏任务vTaskGame,优先级为6;然后在游戏任务vTaskGame中创建了按键任务TaskKey,优先级为10,以及显示游戏信息任务vTaskInfo,优先级为20.四、 系统运行截图1、 系统运行截图:2、 “蛇”吃了一个果实之后,Score加1:3、“蛇”吃了2个果实后,Lv加1:五、软件源程序/*main.c*/*/*UCOS+GUI(Greedy Snake) */*在LPC2131上使用的UCOS和12864的GUI,以及1602驱动。 */*#include Configure.h/* 名称:main* 功能:主函数*/int main (void)/ OSInit(); / vGUIInit(); / vGameInit(); / OSStart(); / return 0;/*/* */*显示游戏信息* */* */*#include Configure.h/OS_STK st_InfoStkTASK_STK_SIZE;/* 名称:vShowTime* 功能:显示游戏时间*/INT8U uca_TimeStr=Time ;void vShowTime(INT32U ulTime)INT8U ucMinute,ucSecond;ucSecond=ulTime%60;ucMinute=ulTime/60%60;vWriteCMD1(FIRST_LINE+1);vShowString1(uca_TimeStr);vShowChar1(ucMinute/10+0);vShowChar1(ucMinute%10+0);vShowChar1(:);vShowChar1(ucSecond/10+0);vShowChar1(ucSecond%10+0);/* 名称:uca_ScoreStr* 功能:显示游戏分数*/INT8U uca_ScoreStr=Score:;void vShowScore(INT32U ulScore)vWriteCMD1(SECOND_LINE);vShowString1(uca_ScoreStr); vShowChar1(ulScore/1000%10+0); vShowChar1(ulScore/100%10+0); vShowChar1(ulScore/10%10+0); vShowChar1(ulScore%10+0);/* 名称:uca_LevelStr* 功能:显示游戏等级*/INT8U uca_LevelStr=Lv:;void vShowLevel(INT8U ucLevel)vWriteCMD1(SECOND_LINE+11);vShowString1(uca_LevelStr);vShowChar1(ucLevel/10%10+0);vShowChar1(ucLevel%10+0);/* 名称:vTaskInfo* 功能:显示游戏信息*/void vTaskInfo(void *pdata)while(1)vShowTime(st_Snake.ulTime+);vShowScore(st_Snake.ulScore);vShowLevel(st_Snake.ucLevel);OSTimeDlyHMSM(0,0,0,80);/*/* */*按键处理* */* */*#include Configure.hOS_STK st_KeyStkTASK_STK_SIZE;/#define KEY_SEL PINSEL1#define KEY_DIR IODIR#define KEY_SET IOSET#define KEY_CLR IOCLR#define KEY_PIN IOPIN #define KEY_BEG 25/* 名称:vKeyInit* 功能:按键初始化*/void vKeyInit(void)KEY_SEL&=0xFC000000;/设置P0.16P0.28为GPIO口KEY_DIR|=0xFF00FFFF;/设置P0.25P0.28为输入KEY_SET|=0xFF00FFFF;/* 名称:vKeyProcess* 功能:按键处理*/void vKeyProcess(void)INT8U ucKeyCode,ucTemp;ucKeyCode=(INT8U)(KEY_PIN25)&0x0F;if(!ucKeyCode)return;switch(ucKeyCode)case 1:ucTemp=ASPECT_LEFT ;break; /leftcase 2:ucTemp=ASPECT_TOP ;break; /upcase 4:ucTemp=ASPECT_RIGHT ;break; /rightcase 8:ucTemp=ASPECT_BOTTOM;break; /downdefault:break; if(st_Snake.ucAspect+ucTemp)!=5) st_Snake.ucAspect=ucTemp;/* 名称:vTaskKey* 功能:按键处理*/void vTaskKey(void *pdata)while(1)vKeyProcess();OSTimeDlyHMSM(0,0,0,22);/*/* */*游戏处理* */* */*#include Configure.h/SNAKE st_Snake;/* 名称:ucMoveDecide()* 功能:判断是否可以移动*/INT8U ucMoveDecide(void)INT8U ucRow,ucColumn;ucRow=*(st_Snake.pucMap);ucColumn=*(st_Snake.pucMap+1);switch(st_Snake.ucAspect)case ASPECT_LEFT:ucColumn-;break;case ASPECT_TOP:ucRow -;break;case ASPECT_RIGHT:ucColumn+;break;case ASPECT_BOTTOM:ucRow +;break;default:break;if(ucRowROW_MAX|ucColumnCOL_MAX)return GAME_OVER;if(ucRow=st_Snake.ucBeanRow)&(ucColumn=st_Snake.ucBeanColumn)return GAME_BEAN;if(ucGetBean(ucRow,ucColumn)=TRUE)return GAME_OVER;return GAME_MOVE;/* 名称:vGameOver()* 功能:游戏结束*/void vGameOver(void)/vGameInit();/* 名称:vUpdateLevel()* 功能:更新分数*/void vUpdateLevel(void)st_Snake.ucLevel=st_Snake.ulScore/2;st_Snake.ucSpeed=80-st_Snake.ucLevel*10;/* 名称:vUpdateScore()* 功能:更新分数*/void vUpdateScore(void)st_Snake.ulScore+;vUpdateLevel();/* 名称:vGameBean()* 功能:得到豆子*/void vGameBean(void)vAddSnake();vCreateBean();vUpdateScore();/* 名称:vGamePlay()* 功能:游戏动作处理*/void vGamePlay(void)switch(ucMoveDecide()case GAME_OVER:vGameOver();break;case GAME_BEAN:vGameBean();case GAME_MOVE:vMoveSnake();break;default:break;/OS_STK st_GameStkTASK_STK_SIZE;/* 名称:vTaskGame()* 功能:游戏任务*/void vTaskGame(void *pdata)TargetInit();vWriteCMD1(FIRST_LINE); OSTaskCreate(vTaskKey ,(void *)0, &st_KeyStkTASK_STK_SIZE - 1 ,10); OSTaskCreate(vTaskInfo,(void *)0, &st_InfoStkTASK_STK_SIZE - 1, 20);while(1)vGamePlay();OSTimeDlyHMSM(0,0,0,st_Snake.ucSpeed);/*/* */*游戏图形* */* */*#include Configure.h/INT8U uca_BeanMapROW_MAXCOL_MAX;/* 名称:vDrawBean()* 功能:绘制一个点*/void vDrawBean(INT8U ucRow,INT8U ucColumn) /21123:026;459:014 /025;0154INT8U ucXPos,ucYPos;INT8U ucX,ucY;if(ucRowROW_MAX|ucColumnCOL_MAX)return;uca_BeanMapucRowucColumn=TRUE;ucXPos=FRAME_LEFT+ucColumn*4;ucYPos=FRAME_TOP +ucRow*4;for(ucX=0;ucX4;ucX+)for(ucY=0;ucYROW_MAX|ucColumnCOL_MAX)return;uca_BeanMapucRowucColumn=FALSE;vSetColour(COL_WHITE);ucXPos=FRAME_LEFT+ucColumn*4;ucYPos=FRAME_TOP +ucRow*4;for(ucX=0;ucX4;ucX+)for(ucY=0;ucY4;ucY+)vDrawPixel(ucXPos+ucX,ucYPos+ucY);vSetColour(COL_BLACK);/*/* 名称:ucGetBean()/* 功能:获取一个点/*INT8U ucGetBean(INT8U ucRow,INT8U ucColumn) /21123:026;459:014 /025;015return uca_BeanMapucRowucColumn;INT8U uca_TAN= /贪0x20,0x20,0x10,0x90,0xA8,0xA4,0xAA,0xB1,0xA2,0xE4,0xA8,0x88,0x10,0x30,0x10,0x00,0x00,0x00,0x80,0x9F,0x40,0x20,0x10,0x0E,0x10,0x20,0x60,0xDF,0x00,0x00,0x00,0x00;INT8U uca_CHI= /吃0x00,0xFC,0x04,0x04,0xFC,0x20,0x58,0x4F,0x4A,0x48,0x48,0xC8,0x08,0x08,0x08,0x00,0x00,0x0F,0x02,0x02,0x07,0x00,0x30,0x48,0x44,0x42,0x41,0x40,0x40,0x40,0x70,0x00;INT8U uca_SHE= /蛇0x00,0xF0,0x10,0xFF,0x10,0xF0,0x20,0x18,0xE8,0x09,0x0E,0x0A,0xA8,0x18,0x08,0x00,0x20,0x23,0x21,0x1F,0x11,0x3B,0x10,0x00,0x3F,0x42,0x41,0x41,0x40,0x38,0x00,0x00;/* 名称:vGameInit()* 功能:游戏初始化*/void vGameInit(void)INT8U ucRow,ucColumn;for(ucRow=0;ucRow=ROW_MAX;ucRow+)for(ucColumn=0;ucColumn=COL_MAX;ucColumn+);vClearBean(ucRow,ucColumn);/ vShowChin(1,2,uca_TAN); vShowChin(3,2,uca_CHI); vShowChin(5,2,uca_SHE); /vDrawRect(FRAME_LEFT-1,FRAME_TOP-1,FRAME_RIGHT+1,FRAME_BOTTOM+1);vDrawRect(FRAME_LEFT-2,FRAME_TOP-2,FRAME_RIGHT+2,FRAME_BOTTOM+2);/ vKeyInit(); / st_Snake.ulTime =0; st_Snake.ulScore =0; st_Snake.ucLevel =0; st_Snake.ucSpeed =80; st_Snake.ucAspect=ASPECT_RIGHT; /vCreateSnake();/vCreateBean(); / OSTaskCreate(vTaskGame, (void *)0, &st_GameStkTASK_STK_SIZE - 1, 6);/*/* */*游戏动作* */* */*#include Configure.h/INT8U uca_Bean100;/*/* 名称:vCreateSnake()/* 功能:创建一条蛇/*void vCreateSnake(void)INT8U ucCount;/ st_Snake.pucMap =uca_Bean; st_Snake.ucLength=3; *(st_Snake.pucMap)=5; *(st_Snake.pucMap+1)=10; *(st_Snake.pucMap+2)=5; *(st_Snake.pucMap+3)=9; *(st_Snake.pucMap+4)=5; *(st_Snake.pucMap+5)=8; *(st_Snake.pucMap+6)=5; *(st_Snake.pucMap+7)=7; *(st_Snake.pucMap+8)=5; *(st_Snake.pucMap+9)=6; *(st_Snake.pucMap+10)=5; *(st_Snake.pucMap+11)=5; *(st_Snake.pucMap+12)=5; *(st_Snake.pucMap+13)=4; *(st_Snake.pucMap+14)=5; *(st_Snake.pucMap+15)=3; *(st_Snake.pucMap+16)=5; *(st_Snake.pucMap+17)=2; *(st_Snake.pucMap+18)=5; *(st_Snake.pucMap+19)=1; for(ucCount=0;ucCount=1;ucCount-)*(st_Snake.pucMap+ucCount*2)=*(st_Snake.pucMap+(ucCount-1)*2);*(st_Snake.pucMap+ucCount*2+1)=*(st_Snake.pucMap+(ucCount-1)*2+1);switch(st_Snake.ucAspect)case ASPECT_LEFT:(*(st_Snake.pucMap+1)-;break;case ASPECT_TOP:(*(st_Snake.pucMap )-;break;case ASPECT_RIGHT:(*(st_Snake.pucMap+1)+;break;case ASPECT_BOTTOM:(*(st_Snake.pucMap )+;break;default:break;vDrawBean(*(st_Snake.pucMap),*(st_Snake.pucMap+1);/* 名称:vAddSnake()* 功能:增加蛇的长度*/void vAddSnake(void)INT8U ucCount;st_Snake.ucLength+;for(ucCount=(st_Snake.ucLength-1);ucCount=1;ucCount-)*(st_Snake.pucMap+ucCount*2)=*(st_Snake.pucMap+(ucCount-1)*2);*(st_Snake.pucMap+ucCount*2+1)=*(st_Snake.pucMap+(ucCount-1)*2+1); *st_Snake.pucMap=st_Snake.ucBeanRow;*(st_Snake.pucMap+1)=st_Snake.ucBeanColumn;/*/* */*GUI字体* */* */*#include Configure.htypedef struct fontINT8U *pucaCharLib;INT8U ucCharWidth;INT8U ucCharHigh;INT8U *pucaChinLib;INT8U ucChinWidth;INT8U ucChinHigh;FONT;FONT st_CurFont=NULL,8,16,NULL,16,16;/*/* 名称:vShowChar/* 功能:字符显示/*void vShowChar(INT8U ucPage,INT8U ucLine,const INT8U *ucaCharMap)vPutCusRow(ucPage,ucLine,st_CurFont.ucCharWidth,ucaCharMap);vPutCusRow(ucPage+1,ucLine,st_CurFont.ucCharWidth,ucaCharMap+st_CurFont.ucCharWidth);/*/* 名称:vShowChin/* 功能:汉字显示/*void vShowChin(INT8U ucPage,INT8U ucLine,const INT8U *ucaCharMap)vPutCusRow(ucPage,ucLine,st_CurFont.ucChinWidth,ucaCharMap);vPutCusRow(ucPage+1,ucLine,st_CurFont.ucChinWidth,ucaCharMap+st_CurFont.ucChinWidth); const INT8U uca_Number1016=0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州六盘水盘州市工商业联合会招聘城镇公益性岗位2人笔试考试参考题库及答案解析
- 2025福建厦门市湖里区招商服务有限公司招聘专业招商人才(现代服务业招商组-招商专才)岗位要求调整考试笔试备考题库及答案解析
- 2026中煤科工智能储装技术有限公司全球校园招聘考试笔试备考题库及答案解析
- 2025年铜陵招聘政府机关事业单位窗口外派人员2人考试笔试模拟试题及答案解析
- 2025中国南水北调集团东线有限公司秋季校园招聘4人考试笔试参考题库附答案解析
- 2026四川省西南医科大学附属中医医院招聘52人考试笔试模拟试题及答案解析
- 2025河南洛阳东方理工实验学校教师招聘3人考试笔试备考题库及答案解析
- 2026天津中医药大学第一附属医院第二批人事代理制招聘103人考试笔试备考试题及答案解析
- 2025四川成都香城投资集团招聘33人笔试考试备考题库及答案解析
- 首都医科大学附属北京朝阳医院面向应届毕业生(含社会人员)招聘155人考试笔试备考题库及答案解析
- 药剂证书考试题库及答案
- 前庭大腺囊肿课件
- 四川美术学院2025年设计考研《64中外设计史》真题与试题解析及答案
- 江苏省2026年普通高中学业水平合格性考试英语仿真模拟卷01(春季高考适用)(全解全析)
- 2025年中铁党建考试试题及答案
- 雨课堂学堂云在线《医患沟通与调适(广州医大 )》单元测试考核答案
- 专科会计职业生涯规划
- 2025届高三八省联考(四川)政治试题及答案
- 制药行业质量意识培训
- 第11章-量子力学基础
- GB/T 12467.1-2009金属材料熔焊质量要求第1部分:质量要求相应等级的选择准则
评论
0/150
提交评论