接上篇,我們進(jìn)行基本的游戲控制之后,接下來我們開始將必要的顯示信息,以及游戲的分?jǐn)?shù)信息實(shí)時(shí)更新顯示到屏幕上去。
這里介紹outtextxy函數(shù),outtextxy函數(shù)的作用是向屏幕指定位置打印文本信息。
如代碼:
outtextxy(100,200,"Welcome to www.sztianhecheng.cn");
意思就是向屏幕坐標(biāo)(100,200)處開始顯示"Welcome to www.sztianhecheng.cn" 這串字符串
對(duì)于固定信息這么寫沒問題,但對(duì)于分?jǐn)?shù)這樣需要實(shí)時(shí)更新的地方,則需要字符串的拼接則需要sprintf函數(shù)幫忙,如
sprintf(ScoreBuffer,"%s %d","當(dāng)前分?jǐn)?shù):",score);
我們將"當(dāng)前分?jǐn)?shù):"作為固定字符串,每次更新分?jǐn)?shù)score,然后每次覆蓋接到后面即可,利用循環(huán)的每次重繪,就可以實(shí)現(xiàn)分?jǐn)?shù)的更新。
相對(duì)應(yīng)的,分?jǐn)?shù)的更新時(shí)機(jī)也需要我們檢測(cè),很明顯就是擋板接住才算一次成功才應(yīng)該增加相應(yīng)的分?jǐn)?shù)。因此需要更改底部觸碰時(shí)候的代碼邏輯
完整代碼如下:
//彈球游戲 //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 control; TCHAR ScoreBuffer[100]={"當(dāng)前分?jǐn)?shù):"}; int Vx=3,Vy=3; int x=(WIDTH-200)-100,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-180, HIGH-250, _T("按P暫停 按C繼續(xù)")); outtextxy(WIDTH-180, HIGH-270, _T("按A向左 按D向右")); BeginBatchDraw(); while(1) { //繪制小球 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(); } x=x+Vx; y=y+Vy; 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; score+=10; //重新計(jì)算并顯示分?jǐn)?shù) clearrectangle(WIDTH-150, HIGH-350,WIDTH-50,HIGH-400); 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-120, HIGH-200, _T("游戲結(jié)束!")); Vy=-Vy; } } } EndBatchDraw(); getch(); // 按任意鍵繼續(xù) closegraph(); // 關(guān)閉繪圖窗口 return 0; }
請(qǐng)大家結(jié)合全局邏輯理解,期間不少坐標(biāo)位置,大家需要自己測(cè)試并確定具體大小。具體效果如下:
下一節(jié)我們進(jìn)行優(yōu)化~
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)課程