|
程序大致思路:
N次轉(zhuǎn)彎的解決:采用轉(zhuǎn)折點(diǎn)法,即記錄轉(zhuǎn)折點(diǎn)坐標(biāo),蛇尾坐標(biāo),蛇頭坐標(biāo),將 蛇尾點(diǎn)->轉(zhuǎn)折點(diǎn)0->轉(zhuǎn)折點(diǎn)1->….->轉(zhuǎn)折點(diǎn)n->蛇頭點(diǎn) 依次相連,即可達(dá)到多次轉(zhuǎn)彎的效果。
延時(shí)函數(shù)和按鍵掃描沖突的解決:為采用時(shí)標(biāo)的多任務(wù)控制。即每毫秒mscnt++, 記錄mscnt的大小,以此實(shí)現(xiàn)延時(shí)。
沖突點(diǎn)的解決:讀取點(diǎn)的顏色坐標(biāo),若和蛇身顏色一致,則為重合點(diǎn)。
以上為我編程時(shí),感覺(jué)比較能困住人的地方,如果還有什么疑惑,請(qǐng)?jiān)谡搲匣靥x謝~~~
單片機(jī)源程序如下:
- #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種等級(jí)的延時(shí)時(shí)間
- #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; //時(shí)標(biāo)
- u8 PressFlag = 0; //按鍵按下標(biāo)志
- 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)
- {
- //此處無(wú)定義任何語(yǔ)句 只是為了好看~
- }
- 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)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
貪吃蛇.7z
(61.95 KB, 下載次數(shù): 30)
2019-9-10 01:59 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|