




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C語(yǔ)言實(shí)現(xiàn)打磚塊小游戲本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)打磚塊游戲的具體代碼,供大家參考,具體內(nèi)容如下
本節(jié)我們將沿用上一節(jié)所提到的函數(shù)式游戲框架來寫一個(gè)彈球打磚塊的游戲。
基本量、邊框繪制
我們首先定義好可能需要的變量,比如小球坐標(biāo)以及速度、游戲界面高度和寬度等等,然后再根據(jù)之前提到的彈跳小球重構(gòu)代碼,剩下的內(nèi)容再分步添置即可。
#includestdio.h
#includestdlib.h
#includeconio.h
#includecwindow.h
//全局變量
intwidth,high;
//游戲界面尺寸
intball_x,ball_y;
//小球坐標(biāo)
intball_vx,ball_vy;
//小球速度
voidgotoxy(intx,inty)
//移動(dòng)光標(biāo)便于清屏重畫
HANDLEhandle=GetStdHandle(STD_UOTPUT_HANDLE);
CROODpos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
voidstartup()
//數(shù)據(jù)初始化
high=15;
width=20;
ball_x=0;
ball_y=width/2;
ball_vx=1;
ball_vy=1;
voidshow()
//顯示界面
gotoxy(0,0);
//光標(biāo)移動(dòng)到原點(diǎn)便于重畫
inti,j;
for(i=0;ihigh;i++)
{
for(j=0;jwidth;j++)
{
if((i==ball_x)(j==ball_y))
printf("O");//輸出小球
elseif(j==width)
//到達(dá)右邊界
printf("|");//輸出邊界
elseif(i==high)
//到達(dá)下邊界
printf("-");//輸出邊界
else
printf("");//非小球坐標(biāo)輸出空格
}
printf("\n");
}
voidupdateWithoutInput()
//與輸入無(wú)關(guān)更新
ball_x=ball_x+ball_vx;
ball_y=ball_y+ball_vy;
//判斷是否到達(dá)邊界
if((ball_x==0)||(ball_x==high-1))
ball_vx=-ball_vx;
if((ball_y==0)||(ball_y==width-1))
ball_vy=-ball_vy;
//延時(shí)刷新
sleep(50);
voidupdateWithInput()
//與輸入有關(guān)更新
{}
//當(dāng)前沒有
intmain()
startup();
//最開始初始化一次
while(1)
//游戲循環(huán)體
{
show();//先展示畫面
//然后是數(shù)據(jù)更新
updateWithoutInput();
updateWithInput();
}
return0;
}
在判斷小球到達(dá)邊界的部分,我們?cè)诘诙l件中執(zhí)行了減一操作,目的是為了避免出現(xiàn)小球和邊界重合的情況。
移動(dòng)擋板
接下來我們要在游戲中顯示一個(gè)中心坐標(biāo)為(position_x,position_y)且半徑為ridus的擋板。用left和right表示其左邊和右邊位置。
首先定義相關(guān)變量:
intposition_x,position_y;
intridus;
intleft,right;
然后數(shù)據(jù)初始化:
position_x=high;//擋板在最底下
position_y=width/2;
ridus=5;
left=position_y-ridus;
right=position_y+ridus;
最后在輸出中添加輸出擋板的部分:
if...
elseif((i==high)(j=left)(j=right))
printf("*");
else...
既然已經(jīng)畫好了擋板,那么要能讓它移動(dòng)才行。
很明顯,按照一般游戲思路來,我們不能在移動(dòng)中改變x坐標(biāo),也就是說擋板只能左右移動(dòng),左移y坐標(biāo)減一,右移則加一。
所以到此我們就要寫updateWithInput函數(shù)部分了。
voidupdateWithInput()
charinput;
if(kbhit())
{
input=getch();
if(input=='a')
{
position_y--;
left=position_y-ridus;
right=position_y+ridus;
}
if(input=='d')
{
position_y++;
left=position_y-ridus;
right=position_y+ridus;
}
}
}
反彈小球
反彈小球部分思路就比較清晰一些,簡(jiǎn)單來說就是判斷當(dāng)小球x坐標(biāo)到達(dá)最底部時(shí),其y坐標(biāo)是不是在擋板所規(guī)定的范圍內(nèi),如果是,則改變小球速度;如果不是,游戲結(jié)束。
我們還可以定義一個(gè)ball_number來記錄小球反彈的次數(shù)。
intball_number;
//初始化
ball_number=0;
隨后來寫我們的updateWithoutInput部分:
voidupdateWithoutInput()
if(ball_x==high-1)
{
if((ball_y=left)(ball_y=right))
//被擋住
{
ball_number++;
printf("\a");
//響鈴
}else{
printf("游戲結(jié)束,因?yàn)槟銢]接住控制命運(yùn)的小球\n");
system("pause");
exit(0);
}
}
//以后內(nèi)容同前
}
消除磚塊
我們使用字母O來表示小球了,那么用什么來表示磚塊呢?
這個(gè)時(shí)候就是看你的英語(yǔ)有沒有好好學(xué),我們知道Brick是指磚塊,所以我們使用字母B來表示磚塊,畢竟B本身就像個(gè)磚塊(并沒有)。
需要定義的量:
磚塊位置得分(擊中磚塊加一)
intbrick_x,brick_y;
intscore;
//初始化
brick_x=0;
brick_y=width/2+1;
score=0;
至于輸出和判定擊中,我就不再多贅述了,基本思路還是和之前一樣,輸出部分加一句elseif就可以了,而擊中判定在updateWithoutInput里。
小結(jié)
上代碼?。。。。?!
#includestdio.h
#includestdlib.h
#includeconio.h
#includecwindow.h
//全局變量
intwidth,high;
//游戲界面尺寸
intball_x,ball_y;
//小球坐標(biāo)
intball_vx,ball_vy;
//小球速度
intposition_x,position_y;
intridus;
intleft,right;
intball_number;
intbrick_x,brick_y;
intscore;
voidgotoxy(intx,inty)
//移動(dòng)光標(biāo)便于清屏重畫
HANDLEhandle=GetStdHandle(STD_UOTPUT_HANDLE);
CROODpos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
voidstartup()
//數(shù)據(jù)初始化
high=15;
width=20;
ball_x=0;
ball_y=width/2;
ball_vx=1;
ball_vy=1;
position_x=high;//擋板在最底下
position_y=width/2;
ridus=5;
left=position_y-ridus;
right=position_y+ridus;
ball_number=0;
brick_x=0;
brick_y=width/2+1;
score=0;
voidshow()
//顯示界面
gotoxy(0,0);
//光標(biāo)移動(dòng)到原點(diǎn)便于重畫
inti,j;
for(i=0;ihigh;i++)
{
for(j=0;jwidth;j++)
{
if((i==ball_x)(j==ball_y))
printf("O");//輸出小球
elseif((i==brick_x)(j==brick_y))
printf("B");//輸出磚塊
elseif(j==width)
//到達(dá)右邊界
printf("|");//輸出邊界
elseif((i==high)(j=left)(j=right))
printf("*");//輸出擋板
elseif(i==high)
//到達(dá)下邊界
printf("-");//輸出邊界
else
printf("");//非小球坐標(biāo)輸出空格
}
printf("\n");
}
printf("反彈小球:%d\n",ball_number);
printf("得分:%d\n",score);
voidupdateWithoutInput()
//與輸入無(wú)關(guān)更新
if(ball_x==high-1)
{
if((ball_y=left)(ball_y=right))
//被擋住
{
ball_number++;
printf("\a");
//響鈴
}else{
//沒擋住
printf("游戲結(jié)束,因?yàn)槟銢]接住控制命運(yùn)的小球\n");
system("pause");
exit(0);
}
}
ball_x=ball_x+ball_vx;
ball_y=ball_y+ball_vy;
//判斷是否到達(dá)邊界
if((ball_x==0)||(ball_x==high-1))
ball_vx=-ball_vx;
if((ball_y==0)||(ball_y==width-1))
ball_vy=-ball_vy;
//判定擊中
if((ball_x==brick_x)(ball_y==brick_y))
{
score++;
brick_y=rand()%width;//磚塊刷新
}
//延時(shí)刷新
sleep(50);
voidupdateWithInput
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 美術(shù)設(shè)計(jì)師考試提前準(zhǔn)備計(jì)劃試題及答案
- 《下肢淋巴引流》課件
- 委托購(gòu)買理財(cái)協(xié)議
- 《高級(jí)醫(yī)古文:詞義》課件
- 創(chuàng)新驅(qū)動(dòng)下的研究生培養(yǎng)新策略與實(shí)施路徑
- 產(chǎn)教融合推動(dòng)財(cái)經(jīng)人才培養(yǎng)的創(chuàng)新路徑
- 紡織工程師資格考試備戰(zhàn)攻略試題及答案
- 工程合同掛靠協(xié)議書
- 采購(gòu)合同合同協(xié)議書范本
- 續(xù)簽家政合同協(xié)議書
- 業(yè)務(wù)拓展經(jīng)理招聘筆試題及解答(某大型央企)
- 2024年全國(guó)職業(yè)院校技能大賽中職(移動(dòng)應(yīng)用與開發(fā)賽項(xiàng))考試題庫(kù)(含答案)
- 湖北宜昌高新區(qū)招商局公開招聘3人(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- 勞務(wù)擴(kuò)大框架合同范本
- DL∕T 703-2015 絕緣油中含氣量的氣相色譜測(cè)定法
- 田忌賽馬課件省公開課一等獎(jiǎng)新名師課比賽一等獎(jiǎng)?wù)n件
- JGJ52-2006 普通混凝土用砂、石質(zhì)量及檢驗(yàn)方法標(biāo)準(zhǔn)
- TD/T 1068-2022 國(guó)土空間生態(tài)保護(hù)修復(fù)工程實(shí)施方案編制規(guī)程(正式版)
- 《研學(xué)旅行課程設(shè)計(jì)》課件-研學(xué)課程方案設(shè)計(jì)
- 小兒補(bǔ)液的基礎(chǔ)與臨床課件
- Whose-dog-is-itPartB-省公開課一等獎(jiǎng)新名師課比賽一等獎(jiǎng)?wù)n件
評(píng)論
0/150
提交評(píng)論