程序大致思路:
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
|