上一節(jié),其實(shí)我們的彈球游戲基本就已經(jīng)完成了,但有些不夠好,比如程序一開始,小球從中間開始運(yùn)動(dòng),速度過快反應(yīng)慢的話馬上就game over了,因此我們可以加一個(gè)開始的提示,比如確認(rèn)開始;以及在結(jié)束時(shí)提示是否繼續(xù)開始或結(jié)束,來提高游戲的友好度。
對(duì)于第一部分,我們直接用outtextxy在游戲界面中間輸出就可以,然后寫個(gè)循環(huán)接受,代碼如下:
outtextxy(WIDTH-500, HIGH-350, "歡迎體驗(yàn),請(qǐng)按C鍵開始..."); while(1) { Sleep(50); if(GetAsyncKeyState(67) & 0x8000 ) { break; } }
對(duì)于游戲結(jié)束后,我們可以給與用戶提示,讓用戶自行選擇是繼續(xù)玩還是退出,可以在游戲結(jié)束的時(shí)候詢問用戶,如筆者這里讓用戶選擇按C是繼續(xù)玩,按Q是退出。效果如下:
判定小球觸碰到底部游戲結(jié)束后,則給與用戶提示,若選擇重新開始,則清空成績、清空提示,重新開始即可,效果如下:
核心實(shí)現(xiàn)并不難,主要在于邏輯分支,筆者這里使用了goto完成,完整參考代碼如下:
//彈球游戲 //www.sztianhecheng.cn #include <graphics.h> // 引用圖形庫頭文件 #include <conio.h> #include <stdio.h> #define WIDTH 640 #define HIGH 480 #define R 10 #define STEP 10 int Board_x1=150,Board_y1=HIGH-5,Board_x2=250,Board_y2=HIGH; int pause() //暫停 { while(1) { Sleep(100); if(GetAsyncKeyState(67) & 0x8000 ) { break; } } return 0; } int main() { int i; char ch; int score=0; char ScoreBuffer[100]={"當(dāng)前分?jǐn)?shù): 0"}; int Vx=3,Vy=3; int x=(WIDTH-200)-200,y=HIGH/2; //表示小球初始圓心坐標(biāo) initgraph(WIDTH, HIGH); // 創(chuàng)建繪圖窗口 640x480 像素 fillrectangle(WIDTH-200,0,WIDTH-195,HIGH);//繪制右墻 outtextxy(WIDTH-150, HIGH-350, ScoreBuffer); outtextxy(WIDTH-160, HIGH-250, ("按P暫停 按C繼續(xù)")); outtextxy(WIDTH-160, HIGH-270, ("按A向左 按D向右")); Start: //初始化分?jǐn)?shù)、小球位置信息 x=(WIDTH-200)-200,y=HIGH/2; score=0; outtextxy(WIDTH-500, HIGH-350, "歡迎體驗(yàn),請(qǐng)按C鍵開始..."); while(1) { Sleep(50); if(GetAsyncKeyState(67) & 0x8000 ) { break; } } //用背景色清空提示語 setcolor(BLACK); outtextxy(WIDTH-500, HIGH-350, "歡迎光臨,請(qǐng)按C鍵開始..."); BeginBatchDraw(); while(1) { x=x+Vx; y=y+Vy; //繪制小球 setfillcolor(GREEN); fillcircle(x,y,R); //繪制擋板 setfillcolor(YELLOW); fillrectangle(Board_x1,Board_y1,Board_x2,Board_y2); //顯示分?jǐn)?shù) settextcolor(WHITE); sprintf(ScoreBuffer,"%s%d","當(dāng)前分?jǐn)?shù): ",score); outtextxy(WIDTH-150, HIGH-350, ScoreBuffer); FlushBatchDraw(); Sleep(5); //原位置擦除小球圖案 setcolor(BLACK); setfillcolor(BLACK); fillcircle(x,y,R); //原位置擦除擋板 setfillcolor(BLACK); fillrectangle(Board_x1,Board_y1,Board_x2,Board_y2); if(GetAsyncKeyState(65) & 0x8000) //向左 { if(Board_x1-STEP<=0) { Board_x1=0; Board_x2=100; } else { Board_x1=Board_x1-STEP; Board_x2=Board_x2-STEP; } } if(GetAsyncKeyState(68) & 0x8000) //向右 { if(Board_x2+STEP>=WIDTH-205) { Board_x1=WIDTH-305; Board_x2=WIDTH-205; } else { Board_x1=Board_x1+STEP; Board_x2=Board_x2+STEP; } } if(GetAsyncKeyState(80) & 0x8000)//暫停 { pause(); } if(x<=R || x>=WIDTH-203-R) { Vx=-Vx; } if(y<=R) { Vy=-Vy; } //觸底 if(y>=HIGH-R-5) { if(x>=Board_x1-R && x<=Board_x2+R) //是否在板子上 { Vy=-Vy; //重新計(jì)算并顯示分?jǐn)?shù) //clearrectangle(WIDTH-150, HIGH-350,WIDTH-50,HIGH-400); settextcolor(BLACK); outtextxy(WIDTH-150, HIGH-350, ScoreBuffer); score=score+10; sprintf(ScoreBuffer,"%s%d","當(dāng)前分?jǐn)?shù): ",score); settextcolor(WHITE); outtextxy(WIDTH-150, HIGH-350, ScoreBuffer); } else//游戲結(jié)束 { settextcolor(WHITE); //setbkmode(TRANSPARENT); outtextxy(WIDTH-500, HIGH-350, ("游戲結(jié)束!Game Over!")); outtextxy(WIDTH-500, HIGH-330, ("按C繼續(xù),按Q退出")); fflush(stdin); FlushBatchDraw(); while(1) { Sleep(50); if(GetAsyncKeyState(67) & 0x8000 ) //C { //清空提示信息,重新開始 setcolor(BLACK); outtextxy(WIDTH-500, HIGH-350, ("游戲結(jié)束!Game Over!")); outtextxy(WIDTH-500, HIGH-330, ("按C繼續(xù),按Q退出")); settextcolor(BLACK); outtextxy(WIDTH-150, HIGH-350, ScoreBuffer); goto Start; } if(GetAsyncKeyState(81) & 0x8000 )//Q { exit(0); } } } } } EndBatchDraw(); getch(); // 按任意鍵繼續(xù) closegraph(); // 關(guān)閉繪圖窗口 return 0; }
每一版對(duì)于前面版本而言除了正文講述的功能之外,都有一些小修改,如為了后面的升級(jí)做的修改,都是基于當(dāng)下的思考而來的。總體而言,基本功能已經(jīng)實(shí)現(xiàn),大家可以繼續(xù)完善,如增加難度選擇、晉級(jí)功能、成績保存等等。
歡迎交流~
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程