802| 1
|
贪吃蛇游戏STM32F103ZET6 |
[/free][hide=2,money]
#include "snake.h" #include "tftlcd.h" #include "picture.h" #include "ascii.h" u8 key; void LCD_ShowPictureEx(u16 x, u16 y, u16 wide, u16 high) { u16 temp = 0; long tmp=0,num=0; LCD_Set_Window(x, y, x+wide-1, y+high-1); num = wide * high*2 ; do { temp = pic[tmp + 1]; temp = temp << 8; temp = temp | pic[tmp]; LCD_WriteData_Color(temp);//ÖðµãÏÔʾ tmp += 2; } while(tmp < num); } //ÔÚÖ¸¶¨Î»Öà ÏÔʾ1¸ö16*16µÄºº×Ö //(x,y):ºº×ÖÏÔʾµÄλÖà //index:tfontÊý×éÀïÃæµÄµÚ¼¸¸öºº×Ö //color:Õâ¸öºº×ÖµÄÑÕÉ« void Test_Show_CH_Font16(u16 x,u16 y,u8 index,u16 color) { u8 temp,t,t1; u16 y0=y; for(t=0;t<32;t++)//ÿ¸ö16*16µÄºº×ÖµãÕó ÓÐ32¸ö×Ö½Ú { if(t<16)temp=tfont16[index*2][t]; //Ç°16¸ö×Ö½Ú else temp=tfont16[index*2+1][t-16]; //ºó16¸ö×Ö½Ú for(t1=0;t1<8;t1++) { if(temp&0x80)LCD_DrawFRONT_COLOR(x,y,color);//»ÊµÐĵã else LCD_DrawFRONT_COLOR(x,y,GBLUE); //»¿Õ°×µã£¨Ê¹Óñ³¾°É«£© temp<<=1; y++; if((y-y0)==16) { y=y0; x++; break; } } } } //ÔÚÖ¸¶¨Î»Öà ÏÔʾ1¸ö24*24µÄºº×Ö //(x,y):ºº×ÖÏÔʾµÄλÖà //index:tfontÊý×éÀïÃæµÄµÚ¼¸¸öºº×Ö //color:Õâ¸öºº×ÖµÄÑÕÉ« void Test_Show_CH_Font24(u16 x,u16 y,u8 index,u16 color) { u8 temp,t,t1; u16 y0=y; for(t=0;t<72;t++)//ÿ¸ö24*24µÄºº×ÖµãÕó ÓÐ72¸ö×Ö½Ú { if(t<24)temp=tfont24[index*3][t]; //Ç°24¸ö×Ö½Ú else if(t<48)temp=tfont24[index*3+1][t-24]; //ÖÐ24¸ö×Ö½Ú else temp=tfont24[index*3+2][t-48]; //ºó24¸ö×Ö½Ú for(t1=0;t1<8;t1++) { if(temp&0x80)LCD_DrawFRONT_COLOR(x,y,color);//»ÊµÐĵã else LCD_DrawFRONT_COLOR(x,y,GRAY); //»¿Õ°×µã£¨Ê¹Óñ³¾°É«£© temp<<=1; y++; if((y-y0)==24) { y=y0; x++; break; } } } } //ÓÎÏ·½çÃæ //Ò»¹²12¸öºº×Ö£¬³É¼¨£¬¹Ø¿¨£¬ÉÏ£¬Ï£¬×ó£¬ÓÒ£¬¿ªÊ¼£¬ÔÝÍ£ void show(void) { //»Î§Ç½ ºñ¶ÈΪ5 //¹¹½¨Ò»¸ö((150/5)*(230/5))=(30*46)µÄÓÎÏ·ÇøÓò ǽ±ÚºñΪ5 ÉßÌåΪ5 LCD_DrawLine_Color(0, 161, 240, 161,BLACK); LCD_DrawLine_Color(240, 0, 240, 161,BLACK); //³É¼¨ Test_Show_CH_Font16(0,165,0,RED); Test_Show_CH_Font16(16,165,1,RED); FRONT_COLOR=RED; BACK_COLOR=GRAY; LCD_ShowString(32,165,tftlcd_data.width,tftlcd_data.height,16,":"); LCD_ShowString(40,165,tftlcd_data.width,tftlcd_data.height,16," 0"); //ÉúÃü Test_Show_CH_Font16(184,165,2,RED); Test_Show_CH_Font16(200,165,3,RED); LCD_ShowString(216,165,tftlcd_data.width,tftlcd_data.height,16,":"); LCD_ShowString(224,165,tftlcd_data.width,tftlcd_data.height,16," "); //ÓÎÏ·Ãû×Ö LCD_ShowString(98,237,tftlcd_data.width,tftlcd_data.height,16,"Snaker"); LCD_ShowString(10,320,tftlcd_data.width,tftlcd_data.height,16,"K_UP: UP"); LCD_ShowString(10,340,tftlcd_data.width,tftlcd_data.height,16,"K_DOWN: DOWN"); LCD_ShowString(10,360,tftlcd_data.width,tftlcd_data.height,16,"K_LEFT: LEFT"); LCD_ShowString(10,380,tftlcd_data.width,tftlcd_data.height,16,"K_RIGHT: RIGHT"); } #ifndef __SANKE_H #define __SANKE_H #include "system.h" #include "SysTick.h" //Ì°³ÔÉßÖ÷º¯Êý void show(void);//ÓÎÏ·»Ãæ extern u8 key; #endif #include "system.h" #include "SysTick.h" #include "led.h" #include "usart.h" #include "tftlcd.h" #include "time.h" #include "key.h" #include "touch.h" #include "snake.h" #include "rtc.h" #include "stdlib.h" #define SNAKE_Max_Long 50//ÉßµÄ×î´ó³¤¶È u8 pause=0; u8 start=0; //É߽ṹÌå struct Snake { s16 X[SNAKE_Max_Long]; s16 Y[SNAKE_Max_Long]; u8 Long;//Éߵij¤¶È u8 Life;//ÉßµÄÉúÃü 0»î×Å 1ËÀÍö u8 Direction;//ÉßÒƶ¯µÄ·½Ïò }snake; //ʳÎï½á¹¹Ìå struct Food { u8 X;//ʳÎïºá×ø±ê u8 Y;//ʳÎï×Ý×ø±ê u8 Yes;//ÅжÏÊÇ·ñÒª³öÏÖʳÎïµÄ±äÁ¿ 0ÓÐʳÎï 1ÐèÒª³öÏÖʳÎï }food; //ÓÎÏ·µÈ¼¶·ÖÊý struct Game { u16 Score;//·ÖÊý u8 Life;//ÓÎÏ·µÈ¼¶ }game; void touch(void) { key=KEY_Scan(0); if(key==KEY_UP&&snake.Direction!=4) //ÉÏ { snake.Direction=3; } if(key==KEY_DOWN&&snake.Direction!=3) //Ï { snake.Direction=4; } if(key==KEY_LEFT&&snake.Direction!=1) //×ó { snake.Direction=2; } if(key==KEY_RIGHT&&snake.Direction!=2) //ÓÒ { snake.Direction=1; } } void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3,TIM_IT_Update)!= RESET) { touch(); TIM_ClearITPendingBit(TIM3,TIM_IT_Update); } } //ÓÎÏ·½áÊø void gameover() { start=0;//Í£Ö¹ÓÎÏ· Test_Show_CH_Font24(80,65,0,RED); Test_Show_CH_Font24(104,65,1,RED); Test_Show_CH_Font24(128,65,2,RED); Test_Show_CH_Font24(152,65,3,RED); Test_Show_CH_Font24(176,65,4,RED); FRONT_COLOR=BLACK; BACK_COLOR=GRAY; LCD_ShowString(224,165,tftlcd_data.width,tftlcd_data.height,16,"0");//ÏÔʾÉúÃüÖµ } //ÍæÓÎÏ· void play() { u16 i,n;//iÉߵĹؽÚÊý nÓÃÀ´ÅжÏʳÎïºÍÉßµÄÉíÌåÊÇ·ñÖØºÏ u8 life_buf[2]; u8 socre_buf[4]; snake.Long=2;//¶¨ÒåÉߵij¤¶È snake.Life=0;//Éß»¹»î×Å snake.Direction=1;//ÉßµÄÆðʼ·½Ïò¶¨ÒåΪÓÒ game.Score=0;//·ÖÊýΪ0 game.Life=4;//ÉßµÄÉúÃüÖµ food.Yes=1;//³öÏÖÐÂʳÎï snake.X[0]=12;snake.Y[0]=24; snake.X[1]=12;snake.Y[1]=24; while(1) { if(food.Yes==1)//³öÏÖеÄʳÎï { while(1) { //ÔÚÉ趨µÄÇøÓòÄÚÏÔʾʳÎï //food.X=12+rand()%(240/12)*12; //food.Y=12+rand()%(160/12)*12; srand(calendar.sec);//Ìí¼ÓËæ»úÖÖ×Ó ²ÉÓõÄRTCʱÖÓ food.X=12+rand()%(228/12)*12; food.Y=12+rand()%(148/12)*12; for(n=0;n<snake.Long;n++) { if(food.X==snake.X[n]&&food.Y==snake.Y[n]) break; } if(n==snake.Long) food.Yes=0; break; } } if(food.Yes==0)//ÓÐʳÎï¾ÍÒªÏÔʾ { LCD_Fill(food.X,food.Y,food.X+10,food.Y+10,RED); } //È¡µÃÐèÒªÖØлµÄÉߵĽÚÊý for(i=snake.Long-1;i>0;i--) { snake.X=snake.X[i-1]; snake.Y=snake.Y[i-1]; } //ͨ¹ý°´¼üÀ´ÉèÖÃÉßµÄÔ˶¯·½Ïò switch(snake.Direction) { case 1:snake.X[0]+=12;break;//ÏòÓÒÔ˶¯ case 2:snake.X[0]-=12;break;//Ïò×óÔ˶¯ case 3:snake.Y[0]-=12;break;//ÏòÉÏÔ˶¯ case 4:snake.Y[0]+=12;break;//ÏòÏÂÔ˶¯ } for(i=0;i<snake.Long;i++)//»³öÉß LCD_Fill(snake.X,snake.Y,snake.X+10,snake.Y+10,BLUE);//»ÉßÉíÌå while(pause==1){}; delay_ms(500);//ÑÓʱ LCD_Fill(snake.X[snake.Long-1],snake.Y[snake.Long-1],snake.X[snake.Long-1]+10,snake.Y[snake.Long-1]+10,GRAY);//Ïû³ýÉßÉí //ÅжÏÊÇ·ñײǽ if(snake.X[0]<0||snake.X[0]>240||snake.Y[0]<0||snake.Y[0]>150) snake.Life=1;//ÉßËÀµôÁË //µ±ÉßµÄÉíÌ峬¹ý3½ÚºóÅжÏÉß×ÔÉíµÄÅöײ for(i=3;i<snake.Long;i++) { if(snake.X==snake.X[0]&&snake.Y==snake.Y[0])//×ÔÉíµÄÈÎÒ»×ø±êÖµÓëÉßÍ·×ø±êÏàµÈ¾ÍÈÏΪÊÇ×ÔÉíÅöײ game.Life-=1; } if(snake.Life==1||game.Life==0)//ÒÔÉÏÁ½ÖÖÅжÏÒÔºóÈç¹ûÉßËÀµôÁËÌø³öÄÚÑ»·£¬ÖØпªÊ¼ { gameover(); break; } //ÅжÏÉßÊÇ·ñ³Ôµ½ÁËʳÎï if(snake.X[0]==food.X&&snake.Y[0]==food.Y) { LCD_Fill(food.X,food.Y,food.X+10,food.Y+10,GRAY);//°Ñ³Ôµ½µÄʳÎïÏû³ý if(!((snake.Long==SNAKE_Max_Long)&&(snake.Long==SNAKE_Max_Long))) snake.Long++;//ÉßµÄÉíÌ峤һ½Ú game.Score+=10; socre_buf[0]=game.Score/100+0x30; socre_buf[1]=game.Score%100/10+0x30; socre_buf[2]=game.Score%100%10+0x30; socre_buf[3]='\0'; FRONT_COLOR=BLACK; BACK_COLOR=GRAY; LCD_ShowString(40,165,tftlcd_data.width,tftlcd_data.height,16,socre_buf);//ÏÔʾ³É¼¨ food.Yes=1;//ÐèÒªÖØÐÂÏÔʾʳÎï } life_buf[0]=game.Life%10+0x30; life_buf[1]='\0'; LCD_ShowString(224,165,tftlcd_data.width,tftlcd_data.height,16,life_buf);//ÏÔʾÉúÃüÖµ } } int main() { u8 i; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÖжÏÓÅÏȼ¶·Ö×é ·Ö2×é LED_Init(); USART1_Init(9600); TFTLCD_Init(); //LCD³õʼ»¯ KEY_Init(); TOUCH_Init(); LCD_ShowPictureEx(0, 0, 240, 320); while(TOUCH_Scan() == 0xff); //µÈ´ý°´Ï´¥Ãþ TIM3_Init(50,7199);//Æô¶¯¶¨Ê±Æ÷ RTC_Init(); LCD_Clear(GRAY); show();//»ÓÎÏ·½çÃæ play();//ÍæÓÎÏ· } [/hide][free]
购买主题
本主题需向作者支付 2 枚金币 才能浏览
《《《 点击这里展开全文 》》》 | |
| |