小游戏(附源码)"/>
基于正点原子STM32F103ZET6精英板(战舰板)的贪吃蛇小游戏(附源码)
基于正点原子STM32F103ZET6精英板(战舰板)的贪吃蛇小游戏
简介:这个贪吃蛇小游戏是我嵌入式实训自选的课题设计,本人也是初学,所以做出来的东西也不算复杂,话不多说,先看看成品(由于放不进去视频,所以放的截图)
所以,本设计大概实现了传统贪吃蛇游戏的功能:
1、用的显示屏是精英板自带的4.3寸(480800)LCD屏,所以为了维持正方形,分成8048等分;
2、预设小蛇初始长度、速度、方向,以及小蛇的长度上限值;
3、每吃到食物小蛇长度+1,每吃到两个食物小蛇速度+1;
4、当小蛇头部坐标与屏幕边界或自身重合则死亡,或者长度达到上限则游戏结束。
游戏规则可以根据个人喜好进行更改。
主函数部分代码
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "beep.h"
//内部驱动
#include "rand.h"
//外围电路
#include "led.h"
#include "key.h"
#include "lcd_4_3.h"
//用户算法
#include "my_task.h"#define GAME_WIDTH 480 //设置屏幕分辨率为800*480,为了维持正方形,分成80*48等分
#define GAME_HEIGHT 800
#define GAME_XPART 48
#define GAME_YPART 80enum sta //枚举状态
{ OFF,//0ON //1
} station;enum dir //枚举贪吃蛇方向
{UP, //上DOWN, //下LEFT, //左RIGHT //右
}direction;typedef struct //贪吃蛇重要参数集
{ u16 speed; //速度u16 length; //长度u16 energybuf; //能量缓存u16 width; //蛇宽 u16 life; //生命数 u16 firstx; //蛇头坐标xu16 firsty; //蛇头坐标yu16 lastx; //蛇尾坐标xu16 lasty; //蛇尾坐标yu16 color; //蛇颜色
}snakes;
snakes snake;//此时snake符合snakes结构体中得所有参数void Snake_Init(snakes * snake)//贪吃蛇参数初始化
{snake->speed=5;snake->length=10;snake->energybuf=0;snake->width=1;snake->life=3;snake->firstx=4;snake->firsty=5;snake->lastx=0;snake->lasty=0;snake->color=BLUE;
}typedef struct //食物重要参数集
{ u16 energy ;//食物能量u16 x ; //食物坐标xu16 y ; //食物坐标y
}apples;
apples apple;void Apple_Init(apples * apple)//食物参数初始化
{apple->energy=1;
// apple->x=24; //坐标由随机数计算出来
// apple->y=40;
}typedef struct //事件重要参数集
{ u16 Process ;//是否游戏暂停u16 GameSta ;//是否游戏结束u16 AppleSta;//食物状态 u16 Direction;//蛇前进方向
}events;
events event;void Event_Init(events * event)//事件参数初始化
{event->Process=ON;//没有暂停event->GameSta=ON;//没有结束event->AppleSta=ON;event->Direction=DOWN;//初始方向向下
}
typedef struct //贪吃蛇坐标参数
{u16 x;u16 y;
}axiss;
axiss snake_axis[100]; //设蛇身最大长度可以达到100void Display(u16 x,u16 y,u16 color)//按照80*48的坐标映射到800*480的屏幕上
{LCD_Fill(GAME_WIDTH/GAME_XPART*x,GAME_HEIGHT/GAME_YPART*y,GAME_WIDTH/GAME_XPART*(x+1),GAME_HEIGHT/GAME_YPART*(y+1),color);
}void DisplayInit(void) //蛇身初始化,默认在该位置,并蛇头向下
{u16 i;for(i=0;i<5;i++)//将初始坐标存入蛇身坐标内{snake_axis[i].x=i;snake_axis[i].y=0;}for(i=5;i<10;i++){snake_axis[i].x=4;snake_axis[i].y=i-4;}LCD_Clear(WHITE);for(i=0;i<10;i++){Display(snake_axis[i].x,snake_axis[i].y,BLUE);//按照初始坐标打印出蛇身}
}void GameOver(void)//游戏结束函数,打印"GAME OVER",蜂鸣器响,挂起核心数据处理函数
{LCD_ShowString(180,388,200,24,24,"GAME OVER !"); BEEP=1; delay_ms(500);BEEP=0;vTaskSuspend(EVENTTask_Handler);//挂起事件任务函数,核心数据处理函数event_task
}
源码:
更多推荐
基于正点原子STM32F103ZET6精英板(战舰板)的贪吃蛇小游戏(附源码)
发布评论