stm32贪吃蛇代码c语⾔,stm32贪吃蛇游戏程序编写(带触摸功
能)
/* ⽂件⽐较⼤,使⽤⾃带的下载软件不能完全烧写进去,因此请使⽤JLINK进⾏程序下载
下载后请按照LCD提⽰操作
1.可以使⽤按键操作贪吃蛇⽅向
2.可以使⽤触摸控制贪吃蛇⽅向及游戏开始和暂停
3.游戏结束后按复位按键开始*/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "button.h"
#include "lcd_driver.h"
#include "gui.h"
#include "tim.h"
#include "rtc.h"
#include "stdlib.h"
#include "flash.h"
#include "touch.h"
#include "snake.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;//蛇的长度
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)
{
static u8 start=0;
key=keyscan(0);
if(TOUCH_Scan() == 0)
{
start=1;
}
if(start==1)
{
if((key==K_UP_PRESS||
(TouchData.lcdx>88&&TouchData.lcdx<152&&TouchData.lcdy>192&&TouchData.lcdy<224))&&snake.Direction!=4) //上
{
TouchData.lcdx=0;
TouchData.lcdy=0;
snake.Direction=3;
}
if((key==K_DOWN_PRESS||
(TouchData.lcdx>88&&TouchData.lcdx<152&&TouchData.lcdy>266&&TouchData.lcdy<298))&&snake.Direction!=3)
//下
{
TouchData.lcdx=0;
TouchData.lcdy=0;
snake.Direction=4;
}
if((key==K_LEFT_PRESS||
(TouchData.lcdx>19&&TouchData.lcdx<83&&TouchData.lcdy>229&&TouchData.lcdy<261))&&snake.Direction!=1) //左
{
TouchData.lcdx=0;
TouchData.lcdy=0;
snake.Direction=2;
}
if((key==K_RIGHT_PRESS||
(TouchData.lcdx>157&&TouchData.lcdx<221&&TouchData.lcdy>229&&TouchData.lcdy<261))&&snake.Direction!=2) //右
{
TouchData.lcdx=0;
TouchData.lcdy=0;
snake.Direction=1;
}
if(((TouchData.lcdx>174&&TouchData.lcdx<238&&TouchData.lcdy>286&&TouchData.lcdy<318)))//暂停
{
TouchData.lcdx=0;
TouchData.lcdy=0;
pause=1; //暂停
}
if(((TouchData.lcdx>1&&TouchData.lcdx<65&&TouchData.lcdy>286&&TouchData.lcdy<318)))//开始
{
TouchData.lcdx=0;
TouchData.lcdy=0;
pause=0; //开始
}
}
贪吃蛇的编程代码}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!= RESET)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
touch();
}
}
//游戏结束
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);
GUI_Show12ASCII(224,165,"0",BLACK,GRAY);//显⽰⽣命值}
//玩游戏
void play()
{
u16 i,n;//i蛇的关节数 n⽤来判断⾷物和蛇的⾝体是否重合
u8 life_buf[2];
u8 socre_buf[4];
snake.Long=2;//定义蛇的长度
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
{
if(food.X==snake.X[n]&&food.Y==snake.Y[n]) break;
}
if(n==snake.Long)
food.Yes=0;
break;
}
}
if(food.Yes==0)//有⾷物就要显⽰
{
GUI_Box(food.X,food.Y,food.X+10,food.Y+10,RED); }
/
/取得需要重新画的蛇的节数
for(i=snake.Long-1;i>0;i--)
{
snake.X[i]=snake.X[i-1];
snake.Y[i]=snake.Y[i-1];
}
//通过触摸屏来设置蛇的运动⽅向
switch(snake.Direction)
{
case 1:snake.X[0]+=12;break;//向右运动
case 2:snake.X[0]-=12;break;//向左运动
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论