STM32實(shí)現(xiàn)貪吃蛇_(dá)第1頁
STM32實(shí)現(xiàn)貪吃蛇_(dá)第2頁
STM32實(shí)現(xiàn)貪吃蛇_(dá)第3頁
STM32實(shí)現(xiàn)貪吃蛇_(dá)第4頁
STM32實(shí)現(xiàn)貪吃蛇_(dá)第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、STM32實(shí)現(xiàn)貪吃蛇STM32學(xué)習(xí)筆記二 竹天笑題記:離寫第一篇學(xué)習(xí)筆記,已經(jīng)好久了,那時(shí)還在學(xué)校,而我已經(jīng)離開那個(gè)使我憂傷使我愁的地方。走的時(shí)候,荷花差不多謝了,西大的荷花花期是那么長,而總是要謝了?;戳巳?,只是離開的時(shí)候想再看看,卻沒有了。來公司快兩個(gè)星期了,上班下班辦手續(xù),洗被子洗衣服,訂門窗理柜子。哎,沒心沒肺的,匆匆忙忙的過完一天又一天,還沒來得及傷感,就趕上了忙碌。工作就黑壓壓的埋過來來了,好在晚上還不要加班。乘晚上還有點(diǎn)空,就把這個(gè)在學(xué)ucgui的時(shí)候想測試ucgui各函數(shù)功能的東西,花了一個(gè)晚上寫完,寫到12點(diǎn)多,只好做了簡單的測試,沒問題,算是半實(shí)驗(yàn)品吧,里面肯定存在很多

2、問題,純屬自娛自樂。呵呵,界面非常簡單要點(diǎn):1、觸摸屏校準(zhǔn)信息保存在SD卡,不必每次開機(jī)都校準(zhǔn)。(讀寫SD卡,請(qǐng)參閱野火SD的教程,觸摸屏校準(zhǔn)信息保存在SD卡,請(qǐng)參閱定點(diǎn)原子SD的教程。)2、隨機(jī)函數(shù)的實(shí)現(xiàn),一般都是用定時(shí)器實(shí)現(xiàn)隨機(jī)種子,我用的是時(shí)鐘實(shí)現(xiàn)隨機(jī)種子。(請(qǐng)百度隨機(jī)函數(shù)。)3、蛇的算法。(自己想的,可能有BUG,每次移動(dòng)時(shí)候,頭移動(dòng),尾消去,中間的不變。)4、觸摸按鍵的實(shí)現(xiàn)。(按鍵檢測本來想放在外部中斷中(觸摸中斷),但是發(fā)現(xiàn)怎么也搞不定,最后只好放在延時(shí)程序中,求大神指教。)5、測試用:截屏函數(shù)的實(shí)現(xiàn)。(請(qǐng)參照野火SD的教程,本人用的是紅牛三代的屏,如果屏要讀屏數(shù)據(jù)點(diǎn)的話,初始化的

3、讀數(shù)據(jù)時(shí)序要放長一些,不然會(huì)讀出花點(diǎn),如果只是顯示,那么寫時(shí)序可以短一點(diǎn)。)6、畫界面:界面的范圍是x:0-239,y:0-239。由于蛇點(diǎn)的大小是4*4個(gè)像素點(diǎn)組成,因此,將坐標(biāo)縮小到x/y:0-59。除去外框0和59,因此蛇可以出現(xiàn)的位置是x/y:1-58。同樣隨機(jī)點(diǎn)(是不是應(yīng)該稱為食物?)出現(xiàn)的位置是x/y:1-58。廢話少說,還是直接上程序。隨機(jī)函數(shù):uint8_t rand_dot(void) uint8_t r;srand(RTC_GetCounter(); /產(chǎn)生隨機(jī)種子,實(shí)現(xiàn)真正的隨機(jī)函數(shù),如果沒有此句就是偽隨機(jī)函數(shù)。r=rand()%58+1;/將隨機(jī)函數(shù)產(chǎn)生點(diǎn)的范圍放到1-

4、58 return r;RTC的初始化是固定格式,不在此處貼出。畫點(diǎn)函數(shù):(將一個(gè)點(diǎn)擴(kuò)展成4*4,另外除去四個(gè)角上的點(diǎn),就類似于圓形了。)void My_DrawPoint(uint8_t x,uint8_t y)uint8_t i;GUI_SetPenSize(1);for(i=0;i<2;i+)GUI_DrawPoint(x*4+i+1,y*4);for(i=0;i<4;i+)GUI_DrawPoint(x*4+i,y*4+1);for(i=0;i<4;i+)GUI_DrawPoint(x*4+i,y*4+2);for(i=0;i<2;i+)GUI_DrawPoin

5、t(x*4+i+1,y*4+3);全局參數(shù)#define snake_MaxLength 20/最大長度int8_t snake_xDiv=1;/0上,0下,-1左,1右int8_t snake_yDiv=0;/-1上,1下,0左,0右uint8_t snake_OK;/確定uint8_t snake_Length=1;/蛇的長度,初始化為1uint8_t xPossnake_MaxLength;/存蛇每個(gè)數(shù)據(jù)點(diǎn)的x軸坐標(biāo)uint8_t yPossnake_MaxLength;/存蛇每個(gè)數(shù)據(jù)點(diǎn)的y軸坐標(biāo)uint8_t i,flag;/標(biāo)志量uint8_t rand_x,rand_y;/隨機(jī)點(diǎn)的

6、坐標(biāo)uint16_t snake_Speed=1000;/蛇的速度,延時(shí)函數(shù)的參數(shù):1000最慢,100最快uint8_t snake_Score=0;/分?jǐn)?shù)/注意,防止數(shù)據(jù)截?cái)啵瑄8:0-255,有正有負(fù)時(shí)要用符號(hào)。一不小心就出錯(cuò)了。初始化界面的參數(shù):#define countof(Array) (sizeof(Array)/sizeof(Array0)/畫外框,從x:0-239,y:0-239,外框厚度4.const GUI_POINT aPoints=0,0,239,0,239,239,0,239;const GUI_POINT bPoints=1,1,238,1,238,238,1,2

7、38;const GUI_POINT cPoints=2,2,237,2,237,237,2,237;const GUI_POINT dPoints=3,3,236,3,236,236,3,236;/畫按鍵,按鍵大小長20,寬20.const GUI_POINT aButtons=0,0,20,0,20,20,0,20;初始化界面:void snake_Init(void)GUI_SetBkColor(GUI_RED);GUI_SetColor(GUI_YELLOW); GUI_Clear();GUI_SetPenSize(1);/畫外框GUI_DrawPolygon(aPoints,coun

8、tof(aPoints),0,0);GUI_DrawPolygon(bPoints,countof(bPoints),0,0);GUI_DrawPolygon(cPoints,countof(cPoints),0,0);GUI_DrawPolygon(dPoints,countof(dPoints),0,0);GUI_SetColor(GUI_BLUE); /畫分?jǐn)?shù)GUI_SetFont(&GUI_FontHZ_SimSun_16); GUI_DispStringAt("分?jǐn)?shù):",250,20);GUI_DispDec(snake_Score,3);/畫速度GUI_

9、DispStringAt("速度:",250,40);switch(snake_Speed)/將速度參數(shù)轉(zhuǎn)化成習(xí)慣顯示形式case 1000:GUI_DispString("1");break;case 900:GUI_DispString("2");break;case 800:GUI_DispString("3");break;case 700:GUI_DispString("4");break;case 600:GUI_DispString("5");break;cas

10、e 500:GUI_DispString("6");break;case 400:GUI_DispString("7");break;case 300:GUI_DispString("8");break;case 200:GUI_DispString("9");break;case 100:GUI_DispString("10");break;/畫按鍵GUI_FillPolygon(aButtons,countof(aButtons),270,155);/上GUI_FillPolygon(aBu

11、ttons,countof(aButtons),245,180);/左GUI_FillPolygon(aButtons,countof(aButtons),295,180);/右GUI_FillPolygon(aButtons,countof(aButtons),270,205);/下GUI_FillPolygon(aButtons,countof(aButtons),270,180);/確認(rèn)/初始化蛇出現(xiàn)的點(diǎn)xPos0=29;yPos0=29;GUI_SetColor(GUI_YELLOW);My_DrawPoint(xPossnake_Length-1,yPossnake_Length-1

12、);/開始按鈕while(1)delay_ms(10);if(snake_OK=1)snake_OK=0;break;/隨機(jī)食物的點(diǎn),不能出現(xiàn)在蛇身上rand_x=rand_dot();rand_y=rand_dot();i=0;while(i<1)if(rand_x=xPos0&&rand_y=xPos0)flag=1;/如果出現(xiàn)在蛇身上,重新取點(diǎn)i+;if(flag=1)rand_x=rand_dot();/重新取點(diǎn)rand_y=rand_dot();/重新取點(diǎn)flag=0;/標(biāo)志量清零i=0;GUI_SetColor(GUI_BLUE);My_DrawPoint(r

13、and_x,rand_y);/延時(shí)函數(shù):請(qǐng)參照定點(diǎn)原子的systick的例程。void delay_ms(uint16_t nms) uint32_t temp = delay_fac_ms * nms; if (temp > 0x00ffffff) temp = 0x00ffffff; SysTick_SetReload(temp); /* 時(shí)間加載 */ SysTick_CounterCmd(SysTick_Counter_Clear); /* 清空計(jì)數(shù)器 */ SysTick_CounterCmd(SysTick_Counter_Enable); /* 開始倒數(shù) */ do/將按鍵

14、檢測放在延時(shí)循環(huán)中if(touch_flag = 1)/*如果觸筆按下了*/ if(getDisplayPoint(&display, Read_Ads7846(), &matrix )!=DISABLE) Move_Div(display.x,display.y);/按鍵檢測程序 / Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT); while (Status != SET); /* 等待時(shí)間到達(dá) */ SysTick_CounterCmd(SysTick_Counter_Disable); /* 關(guān)閉計(jì)數(shù)器 */SysT

15、ick_CounterCmd(SysTick_Counter_Clear); /* 清空計(jì)數(shù)器 */按鍵檢測程序void Move_Div(uint16_t Xpos,uint16_t Ypos) if(Xpos>=270&&Xpos<=290&&Ypos>=155&&Ypos<=175)/上 snake_xDiv=0;snake_yDiv=-1; else if(Xpos>=245&&Xpos<=265&&Ypos>=180&&Ypos<=200)/

16、左 snake_xDiv=-1;snake_yDiv=0; else if(Xpos>=295&&Xpos<=315&&Ypos>=180&&Ypos<=200)/右 snake_xDiv=1;snake_yDiv=0; else if(Xpos>=270&&Xpos<=290&&Ypos>=205&&Ypos<=225)/下 snake_xDiv=0;snake_yDiv=1; else if(Xpos>=270&&Xpos&l

17、t;=290&&Ypos>=180&&Ypos<=200)/確定 snake_OK=1; 主程序:int main(void) TP_Init(); /觸摸屏初始化 delay_init();/延時(shí)初始化GUI_Init();/UCGUI初始化FSMC_Configuration();/讀觸摸屏初始化RTC_Init();/時(shí)鐘初始化while(TouchPanel_Calibrate()!=0);/觸摸屏校準(zhǔn),只需一次校準(zhǔn)即可。參數(shù)存在SD卡中。snake_Init();/界面初始化while(1) /如果蛇吃到了食物if(xPossnake_Le

18、ngth-1+snake_xDiv)=rand_x)&&(yPossnake_Length-1+snake_yDiv)=rand_y)snake_Length+;/長度增加xPossnake_Length-1=xPossnake_Length-2+snake_xDiv;/新增加的蛇點(diǎn)yPossnake_Length-1=yPossnake_Length-2+snake_yDiv;GUI_SetColor(GUI_YELLOW);My_DrawPoint(xPossnake_Length-1,yPossnake_Length-1);rand_x=rand_dot();/產(chǎn)生新的食

19、物rand_y=rand_dot();i=0;while(i<snake_Length)/產(chǎn)生的食物不能出現(xiàn)在蛇身上if(rand_x=xPosi&&rand_y=xPosi)flag=1;i+;if(flag=1)rand_x=rand_dot();rand_y=rand_dot();flag=0;i=0;GUI_SetColor(GUI_BLUE);My_DrawPoint(rand_x,rand_y);snake_Score+;/分?jǐn)?shù)增加GUI_SetColor(GUI_WHITE);GUI_SetFont(&GUI_FontHZ_SimSun_16); G

20、UI_DispStringAt("分?jǐn)?shù):",250,20);/顯示分?jǐn)?shù)GUI_DispDec(snake_Score,3);if(snake_Length=snake_MaxLength)/過關(guān)長度GUI_SetColor(GUI_WHITE);GUI_SetFont(&GUI_Font6x8);GUI_DispStringAt("Passed",100,110);delay_ms(5000);switch(snake_Speed)/速度增加case 1000:snake_Speed=900;break;case 900:snake_Speed=

21、800;break;case 800:snake_Speed=700;break;case 700:snake_Speed=600;break;case 600:snake_Speed=500;break;case 500:snake_Speed=400;break;case 400:snake_Speed=300;break;case 300:snake_Speed=200;break;case 200:snake_Speed=100;break;case 100:snake_Speed=1000;break;snake_Length=1;/重置蛇長度snake_Init();/界面初始化elseflag=0;/置蛇沒撞物體標(biāo)志量if(xPossnake_Length-1+snake_xDiv>58)|(xPossnake_Length-1+snake_xDiv<1)|(yPossnake_Length-1+snake_yDiv>58)|(yPossnake_Length-1+snake_yDiv<1)/判斷蛇有沒有撞墻flag=1;for(i=0;i<snake_Length-2;i+)/判斷蛇有沒有撞蛇,但是不知道為什么不管用if(xPossnake_Length-1+snake_xDiv=xP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論