記錄一下自己寫得小遊戲練習心得
- 飛機大戰
最簡單的數字遊戲,費事一個小時左右寫完,卡在了scanf(“ %c”,&x);忘記寫定址符號。
新學:
清屏函式:system(“cls”);
隨機數生成:srand(time(NULL));x=rand ()%10;
- 改進版本的飛機大戰
增加移動靶子,和物理子彈,積分系統,用函式封裝,卡死在static 用法上。
新學:
被清屏閃瞎狗眼:void gotoxy(int x,int y) //游標移動到(x,y)位置重畫以清屏
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle,pos);}
用於隱藏游標防止游標閃爍:void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0}; // 第二個值為0表示隱藏游標
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}srand(time(NULL));x=rand ()%10;
需要改進:BUG調不掉,依然有時報錯,除錯了一整天,不知道為什麼。雖然已經調到了十二點,但是就是出不來,之後注意:規避陣列可能溢位的情況
如:列印時用for迴圈列印二維陣列,而不要直接用未知數如a[x][y]列印(下標經常越界),統一列印不容易出錯,雖然我死活不明白我到底錯在哪兒,血的教訓。
- 彈球遊戲
由網課上給的飛機大戰程式碼改過來,所以十分順利。
新學:
暫停函式:Sleep(100);(替代count一點也不好使哈哈哈還是count吧)
巨集常量:#define PI 3.1415
音效:printf("\a"); // 響鈴
Const常量:const是一個C語言的關鍵字,它限定一個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性。另外,在觀看別人程式碼的時候,清晰理解const所起的作用,對理解對方的程式也有一些幫助。另外CONST在其他程式語言中也有出現,如C++、PHP5、C#.net、HC08 C。
(1)可以定義const常量,具有不可變性。
例如:const int Max=100; Max++會產生錯誤;
(2)便於進行型別檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。
例如: void f(const int i) { .........} 編譯器就會知道i是一個常量,不允許修改;
(3)可以避免意義模糊的數字出現,同樣可以很方便地進行引數的調整和修改。 同巨集定義一樣,可以做到不變則已,一變都變!
(4)可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。 還是上面的例子,如果在函式體內修改了i,編譯器就會報錯;
例如: void f(const int i) { i=10;//error! }
靜態區域性變數有以下特點:
該變數在全域性資料區分配記憶體;
靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化;
靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為0;
它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束;
int Myclass::Sum = 0; //在類外定義並初始化靜態資料成員
注意的地方:1.出現在類外的函式定義不能指定關鍵字 static。2.靜態成員可以相互訪問,包括靜態成員函式訪問靜態資料成員和訪問靜態成員函式。3.非靜態成員函式可以任意訪問靜態資料成員和靜態成員函式。靜態成員函式沒有額外的this指標。
全域性變數和全域性靜態變數的區別:
1)全域性變數是不顯式用static修飾的全域性變數,全域性變數預設是有外部連結性的,作用域是整個工程,在一個檔案內定義的全域性變數,在另一個檔案中,通過extern 全域性變數名的宣告,就可以使用全域性變數。
2)全域性靜態變數是顯式用static修飾的全域性變數,作用域是宣告此變數所在的檔案,其他的檔案即使用extern宣告也不能使用。
需要改進:板子移動太慢了。
- 堅持100秒
新學:
可以加入一點隨機擾動,防止所有的飛機聚在一起:用隨機數解決
記錄時間:初始化時startTime = clock();結束時endTime = clock();
printf("你堅持了:%.3f秒!\n", (endTime - startTime) / 1000.0);
- 消磚塊的彈球遊戲
需要改進:彈球打在磚塊上無法反彈,只有經過磚塊下面一格才會反彈,比較鬼畜哈哈。
- 空戰遊戲
失去耐心了【捂臉。
新學:
二維陣列儲存遊戲畫布中對應的元素:0為空格,1為飛機*,2為子彈|,3為敵機@
每次都要記著:只有得分之後才用判斷升不升級啊加不加快啊啥的。
- Easyx!
終於到這裡啦,首先畫了圍棋與國際象棋棋盤。
新學:
解決刷屏問題:BeginBatchDraw();//開始批量繪製。執行後,任何繪圖操作都將暫時不輸出到螢幕上,直到執行以下兩個函式才將之前的繪圖輸出。
FlushBatchDraw();//輸出繪圖
EndBatchDraw();//結束繪圖
- 實時鐘表
新學:
獲取當前時間:SYSTEMTIME ti; // 定義變數儲存當前時間GetLocalTime(&ti);
滑鼠互動:MOUSEMSG m;
If(MouseHit())
m=GetMouseMsg();
m.uMsg==WM_MOUSEMOVE
m.uMsg==WM_LBUTTONDOWN//左鍵按下
m.uMsg==WM_RBUTTONDOWN//右鍵擡起
- Flappy bird
由素材更改過來,還算容易。非常開心,這是我做的第一個有介面的遊戲。
新學:
寫路徑的格式:"open \"C:\\Users\\Administrator\\Desktop\\程式設計師表白程式\\白 白,我表白.wav\" alias aa"血的教訓,多寫兩個槓就可以規避資料夾有空格的問題。