STM32掌機教程5,程式框架,隨機,加命與公升級

2021-09-10 02:07:06 字數 2979 閱讀 7817

void

tim4_seed_init

(void

)//定時器4中斷服務程式

void

tim4_irqhandler

(void

)//timx中斷

}

然後在主函式中呼叫初始化函式,並把地鼠編號遞增的**改為1~8之間隨機。

u32 time_us =0;

//隨機生成地鼠,用到的隨機數種子

tim4_seed_init()

;

if(life)

if(next_***)

//需要生成下乙個地鼠

主函式中這個if條件語句太長了,不適合閱讀,因此把隨機生成地鼠與點亮地鼠燈的功能提取函式。

if(life)

if(next_***)

//需要生成下乙個地鼠

//按照引數,點亮某個led

void

creatmouse

(u8 mouse)

}//使用定時器的計數值生成隨機數

u8 random_num

(void

)

編譯並執行,可以發現地鼠是隨機生成的。考慮到有可能兩個地鼠生成到同乙個位置,所以打中每次生成地鼠之前先關掉led燈是很有必要的。

一般在遊戲裡,得到一定的分數以後都會加命,我們也來定義乙個功能:得分每次超過整百,都加一條命。

在打中地鼠的時候會加分,所以我們把加命的邏輯寫在加分之後。需要注意這麼個情況:假如現在得分是102,加命,再打中乙個地鼠後,假如分數是108,不應該加命,應該等到分數大於200後,再加命。因此需要定義乙個變數,幫助判斷是否需要加命。

u8 add_life_cnt =1;

//用於增加生命計數,每到100的整數倍以後加命

//while(1) if(life)

key =

key_scan(0

);if(key)

//如果按下按鍵

}else

//打錯 減命

}

在測試的時候,可以把加命的分數設定的小一點,比如20:if(score/20 == add_life_cnt) //一定積分以後加命

為了讓**更方便閱讀與維護,我把加命的操作提取出函式來。

//加命並顯示

void

add_life

(void

)

然後加命的判斷分支裡就只需要一行**了:

if

(score/

100== add_life_cnt)

//一定積分以後加命

難度公升級以後,每個地鼠出生停留的時間都會變短,我設定乙個陣列,用於存放地鼠停留的時間,從2s到100ms——我還真不信有人反應能這麼快。博爾特反應速度133ms。

我的思路是,每擊中10個地鼠難度增加,難度增加其實也就是陣列的索引+1,然後更新定時器2的溢位時間。

首先要定義陣列,變數,並修改定時器2初始化。

#define level_up_cnt  10    

//擊中x個地鼠難度增加

//不同難度對應的時間,(數值+1)/10 = 時間ms

u16 level1_time_arr[15]

=;u8 level_cnt =0;

//擊中的地鼠數量,用於公升級計數

tim2_int_init

(level1_time_arr[level_cnt]

,7199

);

編寫乙個函式用於提公升難度。

//難度提公升並顯示

void

level_up

(void

)

然後在打中地鼠的邏輯裡來判斷是否需要公升級。注意,有時候公升級與加命的條件會同時滿足,這當然沒什麼弊端,知識考慮到後續會增加bgm,bgm最好持續一段時間,所以這兩種情況先不同時處理。

if(key == mouse)

elseif(

++level_cnt > level_up_cnt)

//公升級與加命不同時處理

為了讓主函式看起來盡可能簡潔,我把螢幕顯示,加分,減命的操作也提取出了函式。主函式最好能只體現業務邏輯。

int

main

(void)if

(timeout_***)

//超時,減命,生成下乙個地鼠

key =

key_scan(0

);if(key)

//如果按下按鍵

elseif(

++level_cnt > level_up_cnt)

//公升級與加命不同時處理

}else

//打錯 減命}}

else

//沒命了

}}

以下是提取出來的函式。

//按照level加分並顯示

void

add_score

(void

)//減命並顯示

void

sub_life

(void

)//設定固定顯示的內容

void

firstscreen

(void

)//設定螢幕上的引數

void

show_opt

(void

)

到此,打地鼠程式的基本框架就列好了,也可以來玩打地鼠了。接下來增加背景**。

STM32 程式入口

stm32的啟動需要依賴啟動檔案,不同編譯器的啟動檔案不同,這裡以startup stm32f407xx.s為例,它主要進行了以下工作 復位子程式是系統上電後第乙個執行的程式 reset handler reset handler proc export reset handler weak imp...

STM32學習筆記 5

不可以用extern的外部呼叫,而且u8 u16等巨集定義也不可以隨便用,會造成其他檔案中此類巨集定義的出現錯誤。所以寫三個.h檔案就可以解決的這個問題 要在main.c中新增這個檔案 define eu32 u32 define eu16 u16 define eu8 u8 define euc3...

STM32鍵盤掃瞄程式

stm32鍵盤掃瞄程式 帶中斷觸發輸入 可注釋忽略 include key.h include delay.h 按鍵初始化函式 void key init void while gpiob idr 0x0f00 0x0000 等待鬆開 gpio setbits gpiob,gpio pin 12 g...