C語言07 全域性變數的定義和使用 俄羅斯方塊

2021-10-02 03:54:27 字數 1937 閱讀 8433

#includeint g_nvalue = 100;

void fun1()

void fun2()

int main(int argc, char* ar**)

全域性變數被分配在記憶體中全域性區域,可以除錯看位址驗證。

int main(int argc, char* ar**)

基本問題:

extern int g_nvalue;
實現,是告訴編譯器,得在全域性區域分配一塊記憶體,儲存全域性變數

int g_nvalue=100;
工程中的使用慣例:

程式的模組化有利於**維護。

mvc是一種模組劃分的依據,其實就是:model、view 、control。

我們的俄羅斯方塊遊戲,將遵循mvc模式開發。也就是我們會建立多個cpp檔案,分為model和view。

由於俄羅斯方塊遊戲較簡單,所以不用單獨設立control。

建立model.cpp、view.cpp及其標頭檔案

【過程略】

記得在標頭檔案加入:

#pragram once
使用陣列來表示背景和方塊

char g_chbackground[game_rows][game_cols];

void initbackground()

else

}printf("\r\n");

}}

方塊的表示和方塊的初始化

我們使用乙個4*4的陣列,儲存方塊。

對於生成乙個方塊的演算法:

int g_nshape=0; //是長條還是方塊,係數為16

int g_nrotate=0; //朝向,係數為4

使用sizeof優化**

int nshapecount =sizeof(g_chbickpool)/sizeof(g_chbrickpool[0])/16;
合併方塊和背景後輸出

因為printf輸出後,游標會自動後移。所以,如果先輸出背景,再輸出磚,已經來不及了。

我們採取的演算法邏輯是:

讓遊戲動起來

因為遊戲要長期執行,程式內部一定需要乙個長期執行的迴圈結構。

下面將實現乙個迴圈結構,在迴圈結構中,接受使用者的輸入,並改變遊戲的行為。

while (1)

}

封裝上下左右的響應函式

因為需要做碰撞檢查等,所以我們封裝對應的函式。使得**結構更清晰。

怎麼進行碰撞檢測

我們可以先假設方塊移動,然後判斷方塊和背景是否有重合。

int _kbhit(void);
當鍵盤有按下時,這個函式會返回非0值,並且,按下的內容,可以通過_getch獲得。

這樣配合,省掉了回車。

int main(int argc, char* ar**)

switch (chinput)

chinput = 0;

} return 0;

}

自動下落

鋪墊知識:標準庫中,提供了clock函式,可以返回當前程式執行的時間(單位是毫秒)。

我們準備兩個時刻,乙個代表當前時間段的開始,乙個代表當前時刻。當兩個時刻的差值大於一定時間,則自動下落。

C語言中定義全域性變數

1 在c語言的標頭檔案中定義變數出現的問題 最好不要傻嘻嘻的在標頭檔案裡定義什麼東西。比如全域性變數 xx標頭檔案 ifndef xx 標頭檔案.h define xx 標頭檔案.h int a endif 那麼,很糟糕的是,這裡的int a 是個全域性變數的定義,所以如果這個標頭檔案被多次引用的話...

C定義全域性變數

程式工程中往往遇到這樣的問題 某個變數是貫穿始終的,主函式以及不同的子函式都要用到這個變數,並且要呼叫子函式改變變數的值。這時候全域性變數就起到乙個橋梁作用,在函式外定義,在主函式中呼叫定義,在子函式a中呼叫並賦值,在子函式b中呼叫該變數,此時的值已經是改變之後的值。用法 在主函式之前定義全域性變數...

C定義全域性變數

參考 程式工程中往往遇到這樣的問題 某個變數是貫穿始終的,主函式以及不同的子函式都要用到這個變數,並且要呼叫子函式改變變數的值。這時候全域性變數就起到乙個橋梁作用,在函式外定義,在主函式中呼叫定義,在子函式a中呼叫並賦值,在子函式b中呼叫該變數,此時的值已經是改變之後的值。用法 在主函式之前定義全域...