#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中呼叫該變數,此時的值已經是改變之後的值。用法 在主函式之前定義全域...