STM32贪吃蛇游戏.docx
- 文档编号:24524897
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:16
- 大小:17.74KB
STM32贪吃蛇游戏.docx
《STM32贪吃蛇游戏.docx》由会员分享,可在线阅读,更多相关《STM32贪吃蛇游戏.docx(16页珍藏版)》请在冰豆网上搜索。
STM32贪吃蛇游戏
本人移植的STM32贪吃蛇游戏,亲测可行,以下为贪吃蛇驱动snake.c与snake.h,还有main.c,希望能对大家有点帮助。
/*snake.c*******************************************/
#include"SNAKE.h"
#include"lcd.h"
#include"key.h"
//#include"stdlib.h"
#include"delay.h"
u8Key_V_temp=0;//取出上次按键值
u8Key_Value=0;//取出上次按键值
//=================================================================
//使用结构体定义变量使程序的名称更加的清楚
//=================================================================
struct
{
u8X;
u8Y;
u8Yes;
}Food;//食物结构体
#defineSNAKE_Max_Long10//最大长度
struct
{
u8X[SNAKE_Max_Long];
u8Y[SNAKE_Max_Long];
u8Long;
u8Life;
u8Score;//蛇的分数
u8Level;//蛇的等级
}Snake;//蛇结构体
//=================================================================
//函数名称:
Trun_On_PointTrun_Off_Point(u8x,u8y)
//函数功能:
点亮或者熄灭一个点。
用于显示蛇身体
//入口参数:
无
//出口参数:
无
//特别说明:
此Trun_On,函数换成其他的就可以兼容其他的液晶
//入8*8点阵12864等
//=================================================================
voidTrun_On_Point(u8x,u8y)
{
LCD_Fill((u16)(x*8),(u16)(y*8),(u16)(x*8+8),(u16)(y*8+8),RED);
}
voidTrun_Off_Point(u8x,u8y)
{
LCD_Fill((u16)(x*8),(u16)(y*8),(u16)(x*8+8),(u16)(y*8+8),BLACK);
}
//=================================================================
//函数名称:
voidInit_SNAKE(void)
//函数功能:
绘制游戏界面,初始化游戏等级等参数
//入口参数:
无
//出口参数:
无
//=================================================================
voidInit_SNAKE(void)
{
u8i;
POINT_COLOR=WHITE;//画笔颜色
BACK_COLOR=BLACK;//背景色
//***********绘制游戏界面********************//
LCD_Fill(0,0,8,280,DARKBLUE);//Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框,0-127
LCD_Fill(232,0,240,280,DARKBLUE);//
LCD_Fill(0,0,240,8,DARKBLUE);//
LCD_Fill(0,272,240,280,DARKBLUE);//
LCD_ShowString(0,280,200,16,16,"Score");//ShowScore
LCD_ShowString(0,300,200,16,16,"LEVEL");//ShowLevel
LCD_ShowNum(50,280,(u32)Snake.Score,4,16);
LCD_ShowNum(50,300,(u32)Snake.Level,4,16);//LCDShow_u8Number(96,97,Snake.Level,0x00ff,0xBE5F);
//***********初始化蛇参数********************//
Snake.Long=2;//定义初始化蛇的长度
Snake.Life=0;//初始化蛇还活着
Snake.Score=0;
Food.Yes=1;
Key_Value=0;
Key_V_temp=0;
for(i=0;i { Snake.X[i]=i+14; Snake.Y[i]=17; } for(i=0;i { Trun_On_Point(Snake.X[i],Snake.Y[i]); } } //================================================================= //函数名称: voidDisplay_dead(u8i) //函数功能: 显示死亡界面 //入口参数: 无 //出口参数: 无 //================================================================= voidDisplay_dead(void) { LCD_Clear(BLACK); LCD_Fill(0,0,8,280,DARKBLUE);//Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框,0-127 LCD_Fill(232,0,240,280,DARKBLUE);// LCD_Fill(0,0,240,8,DARKBLUE);// LCD_Fill(0,272,240,280,DARKBLUE);// LCD_ShowString(0,280,200,16,16,"GAMEOVER! "); LCD_ShowString(0,300,200,16,16,"PRESSENTERTORESTART"); while(Key_Value! =KEY_DOWN) { Key_Value=KEY_Scan(0);; } LCD_Clear(BLACK); Init_SNAKE(); } //================================================================= //函数名称: voidDisplay_Pass(u8i) //函数功能: 显示过关界面 //入口参数: 无 //出口参数: 无 //================================================================= voidDisplay_Pass(void) { Snake.Level++; LCD_Clear(BLACK); LCD_Fill(0,0,8,280,DARKBLUE);//Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框,0-127 LCD_Fill(232,0,240,280,DARKBLUE);// LCD_Fill(0,0,240,8,DARKBLUE);// LCD_Fill(0,272,240,280,DARKBLUE);// LCD_ShowString(0,280,200,16,16,"YOUAREWIN! "); LCD_ShowString(0,300,200,16,16,"PRESSENTERTOCONTINUE"); while(Key_Value! =KEY_DOWN) { Key_Value=KEY_Scan(0);; } LCD_Clear(BLACK); Init_SNAKE(); } //================================================================= //函数名称: voidRun_SNAKE(void) //函数功能: 蛇运动函数(游戏精华) //入口参数: 无 //出口参数: 无 //================================================================= voidRun_SNAKE(void) { u8i=0; /*********************根据按键选择蛇的运动方向*******************/ if((Key_Value==KEY_RIGHT&&Key_V_temp! =KEY_LEFT)||(Key_Value==KEY_LEFT&&Key_V_temp==KEY_RIGHT)) { Trun_Off_Point(Snake.X[0],Snake.Y[0]);//先把蛇尾给熄灭掉 for(i=0;i { Snake.X[i]=Snake.X[i+1]; Snake.Y[i]=Snake.Y[i+1]; } Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1; Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0;//蛇头向你要求的方向移动 for(i=0;i { Trun_On_Point(Snake.X[i],Snake.Y[i]); } Key_V_temp=KEY_RIGHT; } if((Key_Value==KEY_LEFT&&Key_V_temp! =KEY_RIGHT)||(Key_Value==KEY_RIGHT&&Key_V_temp==KEY_LEFT)) { Trun_Off_Point(Snake.X[0],Snake.Y[0]);//先把蛇尾给熄灭掉 for(i=0;i { Snake.X[i]=Snake.X[i+1]; Snake.Y[i]=Snake.Y[i+1]; } Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1; Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0;//蛇头向你要求的方向移动 for(i=0;i { Trun_On_Point(Snake.X[i],Snake.Y[i]); } Key_V_temp=KEY_LEFT; } if((Key_Value==KEY_UP&&Key_V_temp! =KEY_DOWN)||(Key_Value==KEY_DOWN&&Key_V_temp==KEY_UP)) { Trun_Off_Point(Snake.X[0],Snake.Y[0]);//先把蛇尾给熄灭掉 for(i=0;i { Snake.X[i]=Snake.X[i+1]; Snake.Y[i]=Snake.Y[i+1]; } Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0; Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1;//蛇头向你要求的方向移动 for(i=0;i { Trun_On_Point(Snake.X[i],Snake.Y[i]); } Key_V_temp=KEY_UP; } if((Key_Value==KEY_DOWN&&Key_V_temp! =KEY_UP)||(Key_Value==KEY_UP&&Key_V_temp==KEY_DOWN)) { Trun_Off_Point(Snake.X[0],Snake.Y[0]);//先把蛇尾给熄灭掉 for(i=0;i { Snake.X[i]=Snake.X[i+1]; Snake.Y[i]=Snake.Y[i+1]; } Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0; Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1;//蛇头向你要求的方向移动 for(i=0;i { Trun_On_Point(Snake.X[i],Snake.Y[i]); } Key_V_temp=KEY_DOWN; } /****************根据按键选择蛇的运动程序结束*******************/ ///////////////////////////////////////////////////////////////// /************************判断蛇是否死亡***********************/ if(Snake.X[Snake.Long-1]<=0||Snake.X[Snake.Long-1]>=30||Snake.Y[Snake.Long-1]<=0||Snake.Y[Snake.Long-1]>=33)//判蛇头是否撞到墙壁 { Snake.Life=1; } for(i=3;i { if(Snake.X[i]==Snake.X[0]&&Snake.Y[i]==Snake.Y[0]) { Snake.Life=1; } } if(Snake.Life==1)//ifthesnakeover { Display_dead(); } /******************判断蛇是否死亡程序结束***********************/ ///////////////////////////////////////////////////////////////// /************************判断蛇是否最长了**********************/ if(Snake.Long==SNAKE_Max_Long) { Display_Pass(); } ///////////////////////////////////////////////////////////////// /*************************判蛇是否吃到食物**********************/ if(Snake.X[Snake.Long-1]==Food.X&&Snake.Y[Snake.Long-1]==Food.Y)// { //Trun_Off_Point(Food.X,Food.Y);//消隐食物 Snake.Long++;//蛇节数加1 Snake.X[Snake.Long-1]=Food.X; Snake.Y[Snake.Long-1]=Food.Y; Snake.Score+=10; LCD_ShowNum(50,280,(u32)Snake.Score,4,16); Food.Yes=1;//食物标志置1 } ///////////////////////////////////////////////////////////////// /***************************放果子程序*************************/ if(Food.Yes==0) { Trun_On_Point(Food.X,Food.Y); } if(Food.Yes==1) { while (1) { Food.X=rand()%28+1;//获得随机数 Food.Y=rand()%28+1; for(i=0;i { if((Food.X==Snake.X[i])&&(Food.X==Snake.Y[i])) break; } if(i==Snake.Long) { Food.Yes=0; break;//产生有效的食物坐标 } } } ///////////////////////////////////////////////////////////////// /**************************延时用于调整游戏速度************************/ delay_ms(100-Snake.Level*10); ///////////////////////////////////////////////////////////////// } /*snake.h*******************************************/ #include"stm32f10x.h" #ifndef__SNAKE_H__ #define__SNAKE_H__ #ifndefuchar #defineucharunsignedchar #endif #ifndefuint #defineuintunsignedint #endif voidInit_SNAKE(void); voidRun_SNAKE(void); voidDisplay_Pass(void); voidDisplay_dead(void); voidTrun_On_Point(u8x,u8y); voidTrun_Off_Point(u8x,u8y); externu8Key_V_temp;//取出上次按键值 externu8Key_Value;//取出上次按键值 //externvoidTrun_On_Point(ucharx,uchary,ucharcolor); #endif /*main.h*******************************************/ #include"led.h" #include"delay.h" #include"key.h" #include"sys.h" #include"lcd.h" #include"usart.h" #include"snake.h" //ALIENTEK战舰STM32开发板实验13 //TFTLCD显示实验 //技术支持: //广州市星翼电子科技有限公司 voidKey() { u8t; t=KEY_Scan(0);//得到键值 if(t) { switch(t) { caseKEY_UP: //控制蜂鸣器 LED0=! LED0; Display_Pass(); break; caseKEY_LEFT: //控制LED0翻转 LED1=! LED1; Display_dead(); break; caseKEY_DOWN: //控制LED1翻转 LED2=! LED2; break; caseKEY_RIGHT: //同时控制LED0,LED1翻转 LED3=! LED3; break; } }elsedelay_ms(10); } intmain(void) { u8x=Mode_Set; u8mode=1; u8lcd_id[12];//存放LCDID字符串 delay_init();//延时函数初始化 NVIC_Configuration();//设置NVIC中断分组2: 2位抢占优先级,2位响应优先级 uart_init(9600);//串口初始化为9600 LED_Init();//LED端口初始化 KEY_Init();//初始化与按键连接的硬件接口 LCD_Init(); POINT_COLOR=RED; sprintf((char*)lcd_id,"LCDID: %04X",lcddev.id);//将LCDID打印到lcd_id数组。 LCD_Clear(BLACK); Init_SNAKE(); while (1) { while(Mode_Set==0) { Key_Value=KEY_Scan(0); Lcd_Mode(); } Run_SNAKE(); Key_Value=KEY_Scan (1); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 贪吃 游戏