标题:
基于stm32以及ucosii操作系统的贪吃蛇游戏源程序
[打印本页]
作者:
哈哈哈哈阿瑟
时间:
2019-9-9 23:07
标题:
基于stm32以及ucosii操作系统的贪吃蛇游戏源程序
程序大致思路:
N次转弯的解决:采用转折点法,即记录转折点坐标,蛇尾坐标,蛇头坐标,将 蛇尾点->转折点0->转折点1->….->转折点n->蛇头点 依次相连,即可达到多次转弯的效果。
延时函数和按键扫描冲突的解决:为采用时标的多任务控制。即每毫秒mscnt++, 记录mscnt的大小,以此实现延时。
冲突点的解决:读取点的颜色坐标,若和蛇身颜色一致,则为重合点。
以上为我编程时,感觉比较能困住人的地方,如果还有什么疑惑,请在论坛上回帖,谢谢~~~
单片机源程序如下:
#include<stm32f10x_lib.h>
#include"delay.h"
#include"sys.h"
#include"tft.h"
#include"timer.h"
#include"tackle.h"
#define key1 PAin(0) //按键1
#define key2 PAin(15) //按键2
#define WinBoot 34 //上下界限
#define WinBorder 29 //左右界限
#define level1 400 //9种等级的延时时间
#define level2 300
#define level3 200
#define level4 100
#define level5 90
#define level6 80
#define level7 70
#define level8 60
#define level9 50
extern const unsigned char picture[];
u16 num = 0;
u8 level = 1;
u16 mscnt = 0, mscnt0 = 0; //时标
u8 PressFlag = 0; //按键按下标志
u16 delay_time = 0;
u8 Goalx, Goaly;
u8 HeadPoint_x, HeadPoint_y, TailPoint_x, TailPoint_y;
u8 TurnPoint_x[100];
u8 TurnPoint_y[100];
u8 PointNum = 0;
u8 dir = 0; //0:向右 1:向左 2:向上 3:向下
u8 GetGoal = 0;
void JudgeDir(void);
void JudgeGameOver(void);
void JudgeGoal(void);
void DisSnake(void);
void CleanSnake(void);
void Init(void);
u16 SelectWin(void);
void window(u16 xsta, u16 ysta, u16 xend, u16 yend);
void desk1(u16, u16, u16);
u16 desk0(u16);
void Task0_MovePoint(void);
void Task1_KeyScan1(void);
void Task1_KeyScan2(void);
int main(void)
{
Init();
while(1)
{
if (mscnt == mscnt0)
{
//此处无定义任何语句 只是为了好看~
}
else
{
mscnt0 = mscnt;
Task0_MovePoint();
Task1_KeyScan1();
Task1_KeyScan2();
}
}
}
void Task1_KeyScan2(void)
{
static u8 delay_2 = 0;
static u8 stss = 0;
delay_2++;
switch (stss)
{
case 0:
if (!key2)
stss = 1;
delay_2 = 0;
break;
case 1:
if (delay_2 > 5)
{
if (!key2)
{
stss = 2;
PressFlag = 2;
}
else
stss = 0;
}
break;
case 2:
if (key2)
stss = 0;
delay_2 = 0;
break;
}
}
void Task1_KeyScan1(void)
{
static u8 delay_1 = 0;
static u8 sts = 0;
delay_1++;
switch (sts)
{
case 0:
if (key1)
sts = 1;
delay_1 = 0;
break;
case 1:
if (delay_1 > 5)
{
if (key1)
{
sts = 2;
PressFlag = 1;
}
else
sts = 0;
}
break;
case 2:
if (!key1)
sts = 0;
delay_1 = 0;
break;
}
}
void Task0_MovePoint(void)
{
static u16 delay_0 = 0;
delay_0++;
if(delay_0 > delay_time)
{
delay_0 = 0;
CleanSnake();
JudgeDir();
JudgeGoal();
if (GetGoal == 1)
{
Goalx = mscnt % (WinBorder);
Goaly = mscnt % (WinBoot);
DrawPoint2(Goalx*8, Goaly*8, OnePoint, 0xf801);
GetGoal = 0;
}
DisSnake();
JudgeGameOver();
}
}
void CleanSnake(void)
{
u8 i;
if (PointNum == 0)
CleanLinePoint(HeadPoint_x, HeadPoint_y, TailPoint_x, TailPoint_y);
else
{
for (i = 0; i <= PointNum; i++)
{
if (i == 0)
CleanLinePoint(TurnPoint_x[0], TurnPoint_y[0], TailPoint_x, TailPoint_y);
else if (i == PointNum)
CleanLinePoint(HeadPoint_x, HeadPoint_y, TurnPoint_x[i - 1], TurnPoint_y[i - 1]);
else
CleanLinePoint(TurnPoint_x[i], TurnPoint_y[i], TurnPoint_x[i - 1], TurnPoint_y[i - 1]);
}
}
}
void JudgeGoal(void)
{
if(Goalx == HeadPoint_x && Goaly == HeadPoint_y)
{
GetGoal = 1;
if (dir == 0)
HeadPoint_x++;
else if(dir == 1)
HeadPoint_x--;
else if(dir == 2)
HeadPoint_y--;
else
HeadPoint_y++;
num++;
dis_num(42, 290, 0xf00f, 0xffff, num / 100);
dis_num(50, 290, 0xf00f, 0xffff, num % 100 / 10);
dis_num(58, 290, 0xf00f, 0xffff, num % 10);
if (num%10 == 0)
{
level++;
if (level == 1)
delay_time = level2;
else if (level == 2)
delay_time = level3;
else if (level == 3)
delay_time = level4;
else if (level == 4)
delay_time = level5;
else if(level == 5)
delay_time = level6;
else if (level == 6)
delay_time = level7;
else if (level == 7)
delay_time = level8;
else if (level == 8)
delay_time = level9;
dis_num(178, 290, 0xf00f, 0xffff, level);
}
}
}
void JudgeGameOver(void)
{
u16 color;
if (HeadPoint_x == WinBorder + 1 || HeadPoint_y == WinBoot + 1 || HeadPoint_x == 0xff || HeadPoint_y == 0xff)
{
LCD_Clear(0xffff);
dis_str(80, 140, 0xf0ff, 0xffff, "Game Over");
}
if (dir == 0)
{
color = read_point((HeadPoint_x + 1)* 8, HeadPoint_y * 8);
if (color == 0xf800)
{
LCD_Clear(0xffff);
dis_str(80, 140, 0xf0ff, 0xffff, "Game Over");
}
}
else if (dir == 1)
{
color = read_point((HeadPoint_x - 1)* 8, HeadPoint_y * 8);
if (color == 0xf800)
{
LCD_Clear(0xffff);
dis_str(80, 140, 0xf0ff, 0xffff, "Game Over");
}
}
else if (dir == 2)
{
color = read_point(HeadPoint_x*8, (HeadPoint_y - 1)*8);
if (color == 0xf800)
{
LCD_Clear(0xffff);
dis_str(80, 140, 0xf0ff, 0xffff, "Game Over");
}
}
else if (dir == 3)
{
color = read_point(HeadPoint_x*8, (HeadPoint_y + 1)* 8);
if (color == 0xf800)
{
LCD_Clear(0xffff);
dis_str(80, 140, 0xf0ff, 0xffff, "Game Over");
}
}
}
void DisSnake(void)
{
u8 i = 0;
if (PointNum == 0)
LinePoint(HeadPoint_x, HeadPoint_y, TailPoint_x, TailPoint_y);
else
{
for (i = 0; i <= PointNum; i++)
{
if (i == 0)
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
贪吃蛇.7z
(61.95 KB, 下载次数: 30)
2019-9-10 01:59 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
扑扑
时间:
2019-9-11 19:35
赞一下
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1