版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-.z./**********************************************************************************************************;*-----------------------------------------------------------------------------------------------------------;*-----------------------------------------------------------------------------------------------------------;*文件作者:ARM开发小组;*创立日期:2004/06/25;*版本声明;*-----------------------------------------------------------------------------------------------------------;*-----------------------------------------------------------------------------------------------------------;************************************************************************************************************;*/#include"..\inc\config.h"#include<stdlib.h>#include<time.h>#include<stdio.h>#define STACKSIZE 256OS_STK_DATAstk;e*ternGUI_FONTCHINESE_FONT12;e*ternGUI_FONTCHINESE_FONT16;e*ternGUI_FONTGUI_Font8*16;OS_EVENT*Key_Mbo*;/**************************************************************************************************************** 分配各任务的堆栈容量 ****************************************************************************************************************/OS_STKStack_Task_1[STACKSIZE];OS_STKStack_Task_2[STACKSIZE];OS_STKStack_Task_3[STACKSIZE];OS_STKStack_Task_4[STACKSIZE*3];/************************************************************************************************************/#defineMA*_*200//蛇的最大长度#defineMA*_Y200#defineUP1//蛇的方向#defineDOWN2#defineLEFT3#defineRIGHT4#defineROW22//表格行数#defineCOLUMN22//表格列数//定义蛇的各项信息structSnake{S32*[MA*_*];S32y[MA*_Y];S32length;S32direction;S32life;}snake;structFood{int*;/*食物的横坐标*/inty;/*食物的纵坐标*/intyes;/*判断是否要出现食物的变量*/}food;/*食物的构造体*/S16map_1[22][22]={//{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21} {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//0 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//1 {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0},//2 {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},//3 {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},//4 {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},//5 {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},//6 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//7 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//8 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//9 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//10 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//11 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//12 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//13 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//14 {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},//15 {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},//16 {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},//17 {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},//18 {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},//19 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//20 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}//21 };S16map_2[22][22]={//{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21} {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//0 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//1 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//2 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//3 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//4 {1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1},//5 {1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1},//6 {1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1},//7 {1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1},//8 {1,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,1},//9 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//10 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//11 {1,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,1},//12 {1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1},//13 {1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1},//14 {1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1},//15 {1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1},//16 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//17 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//18 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//19 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//20 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}//21 };intoldDire=4;//记录前一个方向intscore=0;//分数intgametime=99;//时间intmapSelect=0;//关卡intgamespeed=0;//难度,速度intkey_F=0;//标记F键intsetUnit=0;//设置游戏项,0表示关卡,1表示难度intfoodInde*=0;//第几个食物intmySrand=0;voidDraw_GUI();//绘制游戏界面voidRandom_Food();//产生食物voidGameOver();//完毕游戏voidNewGame();//新游戏voidPrScore();//输出新得分voidDspTime(INT32U);//显示倒计时voidDrawMap();//画障碍物voidCheckMap();//判断蛇是否撞到障碍物voidSet_SelectFace();//游戏设置voidDrawSetForm();//游戏设置键voidTask_2();/**************************************************************************************************************-函数名称:Task_4(void*pdata)-函数说明:GUI任务,优先级为56-输入参数:pdata-输出参数:无**************************************************************************************************************/voidTask_4(void*pdata){ I32k=0; inti=0; intj=0; int*=0; inty=0; snake.life=0;//活着 snake.*[0]=100;snake.y[0]=40;//蛇头 snake.*[1]=80;snake.y[1]=40;//第一节蛇 snake.*[2]=60;snake.y[2]=40; snake.length=3;//节数 snake.direction=RIGHT; food.yes=0; while(1) { if(score>=100) { score=0; mapSelect++; Set_Color(GUI_GREEN); Set_Font(&CHINESE_FONT16); Disp_String(CN_start"恭喜你,进入下一关!"CN_end,240,240); OSTimeDly(200); NewGame(); } if(key_F==1)//是否进入游戏设置 { //OSTimeDly(100); OSTimeDly(50000); } if(snake.*[0]==(food.**20)+20&&snake.y[0]==(food.y*20)+20)/*吃到食物以后*/ { Set_Color(GUI_WHITE);//用白色去除蛇的的最后一节Fill_Rect((food.**20)+20,(food.y*20)+20,(food.**20)+40,(food.y*20)+40); snake.length++;//蛇的身体长一节food.yes=0;//画面上需要出现新的食物score+=10; PrScore();//输出新得分} *=snake.*[snake.length-1]; y=snake.y[snake.length-1]; for(i=snake.length-1;i>0;i--)//蛇的每个环节往前!!! { snake.*[i]=snake.*[i-1]; snake.y[i]=snake.y[i-1]; } Set_Color(GUI_GREEN);//画出蛇for(j=0;j<snake.length;j++) { Fill_Rect(snake.*[j],snake.y[j],snake.*[j]+20,snake.y[j]+20); } if(food.yes==0)//画食物 { Random_Food(); Uart_Printf("random*=%*\n",food.*); Uart_Printf("randomy=%*\n",food.y); Set_Color(GUI_RED);//设置食物颜色红色 Fill_Circle((food.**20)+30,(food.y*20)+30,10);//画食物,为红色的圆 } switch(snake.direction)//蛇的方向 { caseUP: if(oldDire!=DOWN) { snake.y[0]-=20; oldDire=snake.direction; } else { snake.y[0]+=20; } break; caseDOWN: if(oldDire!=UP) { snake.y[0]+=20; oldDire=snake.direction; } else { snake.y[0]-=20; } break; caseLEFT: if(oldDire!=RIGHT) { snake.*[0]-=20; oldDire=snake.direction; } else { snake.*[0]+=20; } break; caseRIGHT: if(oldDire!=LEFT) { snake.*[0]+=20; oldDire=snake.direction; } else { snake.*[0]-=20; } break; default: break; } Uart_Printf("snake.*[0]=%d**************snake.y[0]=%d\n",snake.*[0],snake.y[0]); for(i=3;i<snake.length;i++)//是否撞到自己了,因为蛇头为两节,第三节不可能拐过来 {if(snake.*[i]==snake.*[0]&&snake.y[i]==snake.y[0]) { snake.life=1; break; } } CheckMap();//判断蛇死亡条件 if(snake.*[0]<20) { snake.*[0]=440; } elseif(snake.*[0]>440){ snake.*[0]=20; } elseif(snake.y[0]>440){ snake.y[0]=20; } elseif(snake.y[0]<20){ snake.y[0]=440; } if(gametime<=0)//时间到了{ snake.life=1;//蛇死} Uart_Printf(">>>>>>>>>>>>>>>>>>>>>>snake.life=%d\n",snake.life); Uart_Printf(">>>>>>>>>>>>>>>>>>>>>>snake.direction=%d\n",snake.direction); if(snake.life==1)//蛇是否死了 { GameOver();//本次游戏完毕 OSTimeDly(50000); } if(gamespeed==0)//易 { for(k=0;k<10000000;k++); } elseif(gamespeed==1)//中 { for(k=0;k<1000000;k++); } elseif(gamespeed==2)//难 { for(k=0;k<100000;k++); } else { for(k=0;k<10000000;k++); } Set_Color(GUI_WHITE);//用灰色去除蛇的的最后一节Fill_Rect(*,y,*+20,y+20); OSTimeDly(10); }}/**************************************************************************************************************-函数名称:Task_3-函数说明:任务3,向串口发送数据-输入参数:pdata-输出参数:无**************************************************************************************************************/voidTask_3(void*pdata){for(;;){ if(key_number!=0*ff) { Uart_Printf("key_number=%*\n",key_number);//任务的干得活儿就是向超级终端发送内容 key_number=0*ff; OSTimeDly(30);//延时100个节拍 } //OSTimeDly(100);}}voidTask_1(void*pdata){ INT8Uerr;INT8U*Key_P;INT8UKey_Val;intys=0;charcmapSelect[2];Timer1_Init(); //翻开时钟节拍,让操作系统跑起来//OSTaskCreate(Task_2,(void*)0,(OS_STK*)&Stack_Task_2[(STACKSIZE)-1],9);//在任务里创立另一个任务//OSTaskCreate(Task_3,(void*)0,(OS_STK*)&Stack_Task_3[(STACKSIZE)-1],8);//在任务里创立另一个任务//在任务里创立另一个任务for(;;){ Key_P=OSMbo*Pend(Key_Mbo*,0,&err);//等待任务间的通信邮箱内的键值指针Key_Val=*Key_P; switch(Key_Val) { //inttemp_mapSelect=0;//设置时,选择的关卡//inttemp_gamespeed=0;//设置时,选择的难度case0*05: //GUI_StoreKey(GUI_KEY_UP); if(key_F==1) { if(setUnit==0)//选择关卡 { mapSelect=1; //mapSelect++; //if(mapSelect==3) //{ mapSelect=2;} } elseif(setUnit==1)//选择难易程度 { gamespeed=1; //gamespeed++; //if(gamespeed==3) //{ gamespeed=2;} } DrawSetForm(); } break; case0*06://上 //GUI_StoreKey(GUI_KEY_UP); if(key_F==1) { setUnit=0; DrawSetForm(); } snake.direction=UP; break; case0*04://下 //GUI_StoreKey(GUI_KEY_DOWN); if(key_F==1) { setUnit=1; DrawSetForm(); } snake.direction=DOWN; break; case0*01://右 //GUI_StoreKey(GUI_KEY_RIGHT); if(key_F==1) { if(setUnit==0) { mapSelect=2; //mapSelect++; //if(mapSelect==3) //{ mapSelect=2;} } elseif(setUnit==1) { gamespeed=2; //gamespeed++; //if(gamespeed==3) //{ gamespeed=2;} } DrawSetForm(); } snake.direction=RIGHT; break; case0*09://左 //GUI_StoreKey(GUI_KEY_LEFT); if(key_F==1) { if(setUnit==0) { mapSelect=0; //mapSelect--; //if(mapSelect==-1) //{ mapSelect=0;} } elseif(setUnit==1) { gamespeed=0; //gamespeed--; //if(gamespeed==-1) //{ gamespeed=0;} } DrawSetForm(); } snake.direction=LEFT; break; case0*0F://进入菜单 if(key_F==0) { key_F=1; Set_SelectFace(); DrawSetForm(); } Uart_Printf("key_F=%d\n",key_F); break; case0*0B://进入游戏界面 if(key_F==1) { key_F=0; score=0; gametime=99; NewGame(); OSTimeDlyResume(8); } else { Draw_GUI();//游戏界面初始化 PrScore();//初始化分数 DspTime(99); //初始化倒计时 DrawMap(); OSTaskCreate(Task_2,(void*)0,(OS_STK*)&Stack_Task_2[(STACKSIZE)-1],4); OSTaskCreate(Task_4,(void*)0,(OS_STK*)&Stack_Task_4[(STACKSIZE*3)-1],8);//创立任务4 } break; /* case0*0E://重新开场游戏 score=0; gametime=99; NewGame(); break;*/ case0*00: GUI_StoreKey(GUI_KEY_ENTER); break; default: break; }OSTimeDly(1);}}voidTask_2(void*pdata)//记时{INT8Uhours=0; INT8Uminutes=0; INT8Useconds=1; INT16Umilli=0; while(1) { OSTimeDly(300); if(snake.life==0) { gametime--; } DspTime(gametime); PrScore(); }}voidDraw_GUI()//绘制游戏界面{inti=0;intj=0; Set_Color(GUI_WHITE);//游戏背景白 Fill_Rect(20,20,640,480); Set_Color(GUI_BLACK);//设置墙黑色 Set_Font(&CHINESE_FONT16); Fill_Rect(0,0,20,640);//左墙Fill_Rect(0,0,640,20);//上墙Fill_Rect(0,460,640,480);//下墙Fill_Rect(460,0,480,480);//右墙Set_Color(GUI_BLUE);//右边显示栏蓝色Fill_Rect(480,20,620,460);Set_Color(GUI_BLACK);//设置墙黑色Fill_Rect(620,0,640,480);//右边框Set_BkColor(GUI_BLUE);Set_Color(GUI_WHITE);Disp_String(CN_start"关卡:"CN_end,500,60);Disp_String(CN_start"难易程度:"CN_end,500,110);Disp_String(CN_start"分数:"CN_end,500,250);Disp_String(CN_start"倒计时:"CN_end,500,360);}voidRandom_Food(){srand(mySrand++);food.*=rand()%22;srand(mySrand+3);food.y=rand()%22;food.yes=1;switch(mapSelect) { case0: Uart_Printf("************case0****************foodInde*=%d\n",foodInde*); break; case1: Uart_Printf("************case1****************map_1[food.*][food.y]=%d\n",map_1[food.*][food.y]); if(map_1[food.y][food.*]==1) { Uart_Printf("************1111****************foodInde*=%d\n",foodInde*); Random_Food(); Uart_Printf("************2222****************foodInde*=%d\n",foodInde*); } break; case2: if(map_2[food.y][food.*]==1) { Random_Food(); Uart_Printf("************case2****************foodInde*=%d\n",foodInde*); } break; default: break; } Uart_Printf("***********FOOD*****************food.*=%d\n",food.*);Uart_Printf("***********FOOD*****************food.y=%d\n",food.y); }voidGameOver()//游戏完毕{Set_Font(&CHINESE_FONT16); Disp_String(CN_start"游戏完毕!"CN_end,240,240);}voidPrScore()//显示分数{INT8Ubw; INT8Usw; INT8Ugw; charcscore[4]; intb; ints; intg; Set_Color(GUI_BLUE);//蓝色Fill_Rect(520,280,540,320); Uart_Printf("*************************************************score=%d\n",score); bw=score/100; sw=score%100/10; gw=score%10; b=score/100; s=score%100/10; g=score%10; cscore[0]=b+48; cscore[1]=s+48; cscore[2]=g+48; cscore[3]=0; Set_Color(GUI_RED);//红色 Set_Font(&GUI_Font8*16); Disp_String(cscore,520,280); write7279(decode1+2,bw&0*0f);//左边数码管write7279(decode1+1,sw&0*0f); write7279(decode1,gw&0*0f);}voidDspTime(INT32Utime)//显示倒计时{INT8Ua; INT8Ub; intatime; intbtime; charctime[3]; a=gametime/10; b=gametime%10; atime=gametime/10; btime=gametime%10; ctime[0]=atime+48; ctime[1]=btime+48; ctime[2]=0; Set_Color(GUI_BLUE);//蓝色Fill_Rect(520,270,550,320); Set_Color(GUI_RED);//红色 Set_Font(&GUI_Font8*16); Disp_String(ctime,520,390); write7279(decode1+5,a&0*0f);//最右边数码管write7279(decode1+4,b&0*0f);}voidNewGame()//新游戏{intj=0; Set_Color(GUI_WHITE);//消去蛇原来的记录for(j=0;j<snake.length;j++) { Fill_Rect(snake.*[j],snake.y[j],snake.*[j]+20,snake.y[j]+20); } snake.life=0;//活着 snake.*[0]=100;snake.y[0]=40;//蛇头 snake.*[1]=80;snake.y[1]=40;//第一节蛇 snake.*[2]=60;snake.y[2]=40; snake.length=3;//节数 snake.direction=RIGHT; Draw_GUI();//游戏界面初始化 gametime=99;PrScore();//初始化分数DspTime(99); //初始化倒计时DrawMap();food.yes=0;}voidDrawMap()//画障碍物{inti=0; intj=0; switch(mapSelect) { case0: break; case1: for(i=0;i<22;i++) { for(j=0;j<22;j++) { if(map_1[i][j]==1) { Set_Color(GUI_GRAY);//障碍物颜色灰色 Fill_Rect((j*20)+20,(i*20)+20,(j*20)+40,(i*20)+40); } } } break; case2: for(i=0;i<22;i++) { for(j=0;j<22;j++) { if(map_2[i][j]==1) { Set_Color(GUI_GRAY);//障碍物颜色灰色 Fill_Rect((j*20)+20,(i*20)+20,(j*20)+40,(i*20)+40); } } } break; default: break; }}voidCheckMap()//是否撞到障碍物{inti=0; intj=0; intsnake_*=0; intsnake_y=0; snake_*=(snake.*[0]-20)/20; snake_y=(snake.y[0]-20)/20; mapSelect=mapSelect%3; switch(mapSelect) { case0: break; case1: for(i=0;i<22;i++) { for(j=0;j<22;j++) { if(map_1[i][j]==1&&j==snake_*&&i==snake_y) { snake.life=1;//蛇死了i=22; break; } } } break; case2: for(i=0;i<22;i++) { for(j=0;j<22;j++) { if(map_2[i][j]==1&&j==snake_*&&i==snake_y) { snake.life=1;//蛇死了i=22; break; } } } break; default: break; }}voidSet_SelectFace()//显示栏{ Set_Color(GUI_WHITE); Fill_Rect(0,0,639,479); /*Set_Color(GUI_GREEN); Fill_Rect(160,20,460,410);*/ Set_Color(GUI_RED);//设置色 Set_Font(&CHINESE_FONT16);Disp_String(CN_start"贪吃蛇"CN_end,310,80);Set_Color(GUI_YELLOW);Set_Font(&CHINESE_FONT16);Disp_String(CN_start"关卡:"CN_end,310,140);//Fill_Rect(200,120,240,160);Disp_String(CN_start"一"CN_end,250,200);//Fill_Rect(260,120,300,160);Disp_String(CN_start"二"CN_end,310,200);//Fill_Rect(320,120,360,160);Disp_String(CN_start"三"CN_end,370,200); Disp_String(CN_start"难度:"CN_end,310,260);//Fill_Rect(200,200,240,240);Disp_String(CN_start"易"CN_end,250,320);//Fill_Rect(2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年事业单位岗位竞聘考核试题(含答案)
- 红楼梦知识测验题目与答案
- 2026年海南省一级建造师执业资格考试(建设工程经济)试题及答案
- 语言筛查考卷及答案分享
- 2025年网络安全意识教育试题及答案
- 2025年水利三类人员b证考试题库附答案
- 2.2单一制和复合制 教案-2022-2023学年高中政治统编版选择性必修1当代国际政治与经济
- 临床微生物标本采集转运操作规程
- 厚朴酚动态提取配方颗粒规模化加工项目可行性研究报告
- 光伏玻璃(超白压延)年产 30 万吨生产线建设项目可行性研究报告
- 屋面渗漏处理专项施工方案
- 中国人寿社招笔试题组成
- 2026贵州省农业发展集团有限责任公司招录(第一批)岗位65人备考题库及完整答案详解
- IPC-A-610F-标准培训教材
- 传媒行业内容审核标准(标准版)
- 提高住院患者大小便标本留取合格率
- 2025-2026学年医学生教学设计教案
- 安检金属探测器调试工程师岗位招聘考试试卷及答案
- 吊具管理制度规范
- 上门维修培训课件模板
- 节能减排DCS系统改造技术投标书
评论
0/150
提交评论