久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于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.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲精品1区
|
免费视频一区二区
|
午夜久久久
|
久久国产电影
|
亚洲三级av
|
欧美极品少妇xxxxⅹ免费视频
|
毛片av免费看
|
av网站免费观看
|
99精品久久
|
日韩高清一区
|
色五月激情五月
|
亚洲成av人片在线观看无码
|
国产精品久久久久久吹潮
|
欧美日韩最新
|
成人毛片视频免费
|
免费色网址
|
国产视频中文字幕在线观看
|
国产精品久久欧美久久一区
|
精品一区二区三
|
国产视频一区二区
|
欧美日高清视频
|
日韩精品专区在线影院重磅
|
精品一二三区
|
caoporn视频在线
|
成人国产精品久久久
|
一区二区三区在线免费观看视频
|
国产免费av在线
|
国产精品视频一二三区
|
91精品免费
|
亚洲中午字幕
|
欧美日韩看片
|
亚洲一级黄色
|
久久国产综合
|
亚洲国产精品一区二区第一页
|
欧美性受
|
国产成人在线视频
|
色综合一区
|
国产精品久久久久一区二区三区
|
国产区第一页
|
一二三四在线视频观看社区
|
亚洲精品美女视频
|