




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第C語言實現(xiàn)打磚塊小游戲本文實例為大家分享了C語言實現(xiàn)打磚塊游戲的具體代碼,供大家參考,具體內(nèi)容如下
本節(jié)我們將沿用上一節(jié)所提到的函數(shù)式游戲框架來寫一個彈球打磚塊的游戲。
基本量、邊框繪制
我們首先定義好可能需要的變量,比如小球坐標(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)
//移動光標(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)移動到原點便于重畫
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()
//與輸入無關(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;
//延時刷新
sleep(50);
voidupdateWithInput()
//與輸入有關(guān)更新
{}
//當(dāng)前沒有
intmain()
startup();
//最開始初始化一次
while(1)
//游戲循環(huán)體
{
show();//先展示畫面
//然后是數(shù)據(jù)更新
updateWithoutInput();
updateWithInput();
}
return0;
}
在判斷小球到達(dá)邊界的部分,我們在第二條件中執(zhí)行了減一操作,目的是為了避免出現(xiàn)小球和邊界重合的情況。
移動擋板
接下來我們要在游戲中顯示一個中心坐標(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)畫好了擋板,那么要能讓它移動才行。
很明顯,按照一般游戲思路來,我們不能在移動中改變x坐標(biāo),也就是說擋板只能左右移動,左移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;
}
}
}
反彈小球
反彈小球部分思路就比較清晰一些,簡單來說就是判斷當(dāng)小球x坐標(biāo)到達(dá)最底部時,其y坐標(biāo)是不是在擋板所規(guī)定的范圍內(nèi),如果是,則改變小球速度;如果不是,游戲結(jié)束。
我們還可以定義一個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é)束,因為你沒接住控制命運的小球\n");
system("pause");
exit(0);
}
}
//以后內(nèi)容同前
}
消除磚塊
我們使用字母O來表示小球了,那么用什么來表示磚塊呢?
這個時候就是看你的英語有沒有好好學(xué),我們知道Brick是指磚塊,所以我們使用字母B來表示磚塊,畢竟B本身就像個磚塊(并沒有)。
需要定義的量:
磚塊位置得分(擊中磚塊加一)
intbrick_x,brick_y;
intscore;
//初始化
brick_x=0;
brick_y=width/2+1;
score=0;
至于輸出和判定擊中,我就不再多贅述了,基本思路還是和之前一樣,輸出部分加一句elseif就可以了,而擊中判定在updateWithoutInput里。
小結(jié)
上代碼?。。。。。?/p>
#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)
//移動光標(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)移動到原點便于重畫
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()
//與輸入無關(guān)更新
if(ball_x==high-1)
{
if((ball_y=left)(ball_y=right))
//被擋住
{
ball_number++;
printf("\a");
//響鈴
}else{
//沒擋住
printf("游戲結(jié)束,因為你沒接住控制命運的小球\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;//磚塊刷新
}
//延時刷新
sleep(50);
voidupdateWithInput
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車輛租賃司機合同協(xié)議
- 車牌注銷協(xié)議書范本
- 旅行帶團協(xié)議書
- 2025年電商平臺內(nèi)容營銷與種草經(jīng)濟內(nèi)容創(chuàng)作者生態(tài)研究報告
- 跟油漆合作合同協(xié)議
- 工匠作坊面試題及答案
- 農(nóng)村金融服務(wù)創(chuàng)新與農(nóng)村金融風(fēng)險管理研究進(jìn)展2025年研究報告
- 電線面試題及答案
- 現(xiàn)代設(shè)計師的職業(yè)環(huán)境試題及答案
- 自愿放棄社保合同協(xié)議
- 福建省福州市2025年初中畢業(yè)班教學(xué)質(zhì)量檢測二生物學(xué)試卷(無答案)
- 2025-2030中國城市規(guī)劃行業(yè)深度分析及發(fā)展前景與發(fā)展戰(zhàn)略研究報告
- 2025年全國焊工作業(yè)人員職業(yè)技能理論考試練習(xí)題庫(900題)含答案
- 道岔區(qū)無砟軌道我國高速鐵路道岔區(qū)采用的無砟軌道主要有長枕埋
- 《行政法與行政訴訟法》課件各章節(jié)內(nèi)容-第二十六章 行政賠償及訴訟
- 2025年江蘇省高郵市中考一模物理試題(原卷版+解析版)
- 【9物一?!?025年安徽省合肥市45中(橡樹灣)中考一模物理試卷
- 2.1+新民主主義革命的勝利+課件高中政治統(tǒng)編版必修一中國特色社會主義
- 計算機系統(tǒng)規(guī)劃與管理考試內(nèi)容試題及答案
- 關(guān)務(wù)培訓(xùn)課件
- 北京市豐臺區(qū)2025屆高三下學(xué)期3月一模試題 地理 含答案
評論
0/150
提交評論