1、嵌入式系统设计报告学院:电气与自动化工程学院班级:自动化 2 班年级:2010 级学号:3010203109姓名:叶林奇一、 作品名称:贪吃蛇游戏二、 设计思路贪吃蛇由一节一节的方块组成,初始长度为 3,按下启动按钮(1键) ,贪吃蛇前进。玩家通过方向键(2 上4左5下6右)控制贪吃蛇的转弯。按下暂停键(1 ) ,游戏暂停,再次按下暂停键继续游戏。游戏过程中若贪吃蛇撞到边界或自己,则游戏失败。贪吃蛇每吃一个食物,节数加 1。玩家如果成功将节数增加到 20,则获得胜利。胜利后播放音乐,按下重启键(3 )重新开始。流程图:游戏开始启动键按下?屏幕中央显示三节贪吃蛇和食物YES贪吃蛇前进方向键按下?
2、YES转弯NONO撞墙或自己?贪吃蛇节数加 1,生成新食物YESYES节数达到20?NO获胜,播放音乐吃到食物?NO游戏失败重启键按下?YESNO三、 主要代码:char stop=0,restart=0,win1=0;/* 标志位,stop:暂停键按下置 1;restart:重启键按下 1;win1: 获胜置 1 */char length; /* 贪吃蛇长度 */char snake202=0;/* 贪吃蛇各节位置坐标;snake0为头部;snakei0:x 坐标(039);snakei1:y 坐标(029) */void Refresh_Snake() /* 刷新贪吃蛇所有节 */uns
3、igned char i;for(i=0;isnake11)i=0;else i=1;elseif(snake00snake10)i=3;else i=2;return i;void Refresh(char p2) /* 显示一个节(8*8 的方块) */MX1_LCDC_DrawSquare(p0*8 , p1*8, 8, 29, 50, LS_SOLID, FS_SOLID );void Clear(char p2) /* 清除一个节(8*8 的方块) */MX1_LCDC_DrawSquare(p0*8 , p1*8, 8, 15, 15, LS_SOLID, FS_SOLID );v
4、oid Move(char n)/* 贪吃蛇移动子函数,n 为 01234 分别代表前进、左转、右转、上转、下转 */char k,i,v=Get_direction();Clear(snakelength-1); /* 清除尾巴 */for(i=length-1;i=1;i-)snakei0=snakei-10;snakei1=snakei-11; /* 从最后一节开始,每一节(除头部)移到前一节的位置 */if(n=0) /* 前进 */ switch(v) /* 根据前进方向确定头部应处位置 */case 0:if(snake01=29)Restart();else snake01+;b
5、reak; /* 向下时头部向下移一格 */case 1:if(snake01=0)Restart();else snake01-;break; /* 向上时头部向上移一格 */case 2:if(snake00=0)Restart();else snake00-;break; /* 向左时头部向左移一格 */ case 3:if(snake00=39)Restart();else snake00+;break; /* 向右时头部向右移一格 */default:break;if(n=1) /* 左转 */if(snake00=0)snake00+;else snake00-;if(n=2) /
6、* 右转 */if(snake00=39)snake00-;else snake00+;if(n=3) /* 下转 */if(snake01=29)snake01-;else snake01+;if(n=4) /* 上转 */if(snake01=0)snake01+;else snake01-;if(snake00=food0 /* 吃到食物长度加 1 */if(length=20)win(); /* 长度为 20 时获胜 */else Generate_food(); /* 长度没到 20 则生成新的食物 */for(k=1;klength;k+) /* 判断是否撞到自己,是则失败,游戏重
7、启 */if(snake00=snakek0 Refresh(snake0); /* 刷新头部位置 */void Go_ahead() /* 前进子程序 */Move(0);void Turn_left() /* 左转子程序 */Move(1);void Turn_right() /* 右转子程序 */Move(2);void Turn_up() /* 上转子程序 */Move(4);void Turn_down() /* 下转子程序 */Move(3);void YourTask( void *pdata ) /* 此函数定义了一个任务 */Init();IRQ_Register( OSTi
8、ckISR, TIMER1_INT );/* 开启 uC/OS-II 的时钟中断( 必须在第一个运行的任务里进行) */OSStartTimeTick();KEY_Init();WAVE_Init( WAVE_BASE_DEFAULT ); /* 音乐初始化*/* 在下面添加任务内容 */while( 1 )if(stop=0/* 主程序:前进*/OSTimeDlyHMSM( 0, 0,0 , 100 );/* 初始化后,从这里开始执行 C 代码 */int _main( void )unsigned int paletteLCDC_CMRAM_SIZE;int i;MX1_AITC_Init
9、(); /* 初始化中断控制器 */IRQ_Init(); /* 初始化中断管理 */MX1_GPIO_Init( MX1_GPIO_PC );MX1_SSI_Init( MX1_SSI1 );OSInit(); /* 初始化 uC/OS-II 内核数据结构 */初始化 LCDMX1_LCDC_Init(LCDC_PANEL_WIDTH, LCDC_PANEL_HEIGHT, LCDC_INIT_STARTX, LCDC_INIT_STARTY, LCDC_VPW, LCDC_PANEL_CONF, LCDC_BPP );/ 初始化调色板for( i=0; i16; i+ )palettei
10、= RGB( i, 0, 0 );palettei+16 = RGB( 0, i, 0 );palettei+32 = RGB( 0, 0, i );palettei+48 = RGB( i, i, i );MX1_LCDC_CMRAM_Set( palette );/* 建立一个任务 */OSTaskCreate( YourTask, 0, OSStart(); /* 开始调度 */return 0;/* 键盘控制程序 */void KEY_Scan_PC()/*此处省略键盘扫描程序段*/scan_done:switch(key_val) /* 判断按键值 */case 2:if(stop=
11、0 /* 2键上转 */break;case 5:if(stop=0 /* 5键下转 */break;case 4:if(stop=0 /* 4键左转 */break;case 6:if(stop=0 /* 6键右转 */break;case 1:if(stop=0)stop=1;else stop=0; /* 1键暂停 */break;case 3:if(win1=1)restart=1; /* 获胜后3键重启 */break;ret:delay( 60000 ); /* 按键延时 */IMR_UMASK( KEY_COL1_PORT, KEY_COL1_PIN );IMR_UMASK( KEY_COL2_PORT, KEY_COL2_PIN );IMR_UMASK( KEY_COL3_PORT, KEY_COL3_PIN );IMR_UMASK( KEY_COL4_PORT, KEY_COL4_PIN );四、 心得体会:编程要从模仿开始,先看别人写好的程序,熟悉软件操作,掌握基本的编程流程。有了以上基础再开始构思自己要实现的功能,在现成的程序上进行增删改,一步一步调试,最终能使自己的想法得以实现,也就完成了一次再创造的过程。