版權(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)容如下
1.利用整型二維數(shù)組保存顯示數(shù)據(jù),小蛇每移動(dòng)一次清屏并便利數(shù)組做到動(dòng)態(tài)效果。每次移動(dòng)(清屏)的間隔時(shí)間控制了游戲難度,這個(gè)時(shí)間應(yīng)不斷縮減,直到游戲結(jié)束。
2.需要保存小蛇移動(dòng)的方向,然后寫一個(gè)函數(shù)通過小蛇的移動(dòng)方向去處理二維數(shù)組中的數(shù)據(jù),達(dá)到移動(dòng)小蛇的目的。
3.小蛇的移動(dòng)可分解為兩個(gè)過程:頭部像前方生長(zhǎng)一格然后尾部消去一格。如果蛇頭吃到食物,尾部無(wú)需消去,此時(shí)應(yīng)立即隨機(jī)生成一個(gè)新的食物。
4.游戲開始時(shí)小蛇應(yīng)隨機(jī)生成在地圖某一位置,此時(shí)小蛇的默認(rèn)移動(dòng)方向也應(yīng)該是隨機(jī)的。
5每次移動(dòng)前應(yīng)接收玩家由鍵盤輸入的移動(dòng)方向,如果接收到后,判斷合法后將其設(shè)為小蛇的默認(rèn)移動(dòng)方向,如果玩家未進(jìn)行任何輸入,小蛇應(yīng)按照默認(rèn)方向移動(dòng)。
個(gè)人難點(diǎn):
1.小蛇移動(dòng)
該函數(shù)需要拿到蛇頭當(dāng)時(shí)所在的位置坐標(biāo)和小蛇的移動(dòng)方向。隨后可由蛇頭位置往移動(dòng)方向往前生長(zhǎng)一格,即將二維數(shù)組中目標(biāo)移動(dòng)位置的數(shù)據(jù)設(shè)置為小蛇的數(shù)據(jù)。消去蛇尾另寫一個(gè)函數(shù),調(diào)用前需先判斷是否吃到食物,是否撞到墻壁或者是自身,然后決定是否削去尾部。消去蛇尾需獲得蛇尾的位置,所以我們?cè)谠摵瘮?shù)內(nèi)加入遞歸搜索蛇尾的算法:進(jìn)入函數(shù)后先判斷此時(shí)的位置是否為蛇尾,若不是就將自身位置往后移動(dòng)一格(將蛇身往后一格的坐標(biāo)輸入給DeleteTail函數(shù),然后繼續(xù)此過程),直到遇到蛇尾,然后將其消去(置零)。
具體代碼實(shí)現(xiàn)如下:
intMoveSnake(inttrend,int*px,int*py,intdata[ROW][COL],int*t)
intret=1;//默認(rèn)前進(jìn)成功
//printf("trend=%d\n",trend);
switch(trend){
case1:*py-=1;break;//向上
case2:*px-=1;break;//向左
case3:*py+=1;break;//向下
case4:*px+=1;break;//向右
}//找到即將前進(jìn)的坐標(biāo)
if(data[*py][*px]==6){
data[*py][*px]=trend;
CreatFood(data);
*t*=0.9;
}//如果蛇頭要前進(jìn)的格子是食物,向前長(zhǎng)一格,尾部不變;
elseif(data[*py][*px]==0){
data[*py][*px]=trend;//向前長(zhǎng)一格
DeleteTail(*px,*py,data);//消去最后的尾巴
}
else{
ret=0;
printf("前進(jìn)失敗\n");
}//前進(jìn)失敗
returnret;
intDeleteTail(intx,inty,intdata[ROW][COL])
//PrintTest(data);
if(data[y][x]=4data[y][x]=1){
switch(data[y][x]){
case1:
if(DeleteTail(x,y+1,data)==0){
data[y][x]=0;
}
break;
case2:
if(DeleteTail(x+1,y,data)==0){
data[y][x]=0;
}
break;
case3:
if(DeleteTail(x,y-1,data)==0){
data[y][x]=0;
}
break;
case4:
if(DeleteTail(x-1,y,data)==0){
data[y][x]=0;
}
break;
}
return1;
}
else{
return0;
}
}
2.輸入
在實(shí)際代碼實(shí)現(xiàn)的過程中,我發(fā)現(xiàn)scanf函數(shù)無(wú)法實(shí)現(xiàn)需求,理由是程序執(zhí)行到scanf語(yǔ)句時(shí),會(huì)停留在該位置,直到scanf函數(shù)掃描到輸入后,程序才會(huì)繼續(xù)進(jìn)行。經(jīng)學(xué)習(xí)查閱,決定使用kbhit函數(shù)掃描此時(shí)鍵盤緩沖區(qū)中是否有數(shù)據(jù):如果有就讀取第一個(gè)數(shù)據(jù),并將后面的數(shù)據(jù)清空,避免后面使用該數(shù)據(jù),若沒有數(shù)據(jù),緩沖區(qū)不做任何處理,程序也應(yīng)當(dāng)繼續(xù)執(zhí)行。
使用kbhit函數(shù)前應(yīng)#includeconio.h。清理緩沖區(qū)運(yùn)用的是getch()循環(huán)。代碼如下:
intInput(){
inttrend=0;
if(kbhit()){
chartrend_=getch();
while(kbhit()){
getch();
}//清空緩沖區(qū)
//printf("已接收到%c",trend_);
switch(trend_){
case'w':trend=1;break;
case'a':trend=2;break;
case's':trend=3;break;
case'd':trend=4;break;
default:printf("請(qǐng)輸入w,a,s,d以控制前進(jìn)方向!!\n");
break;
}
}
else{
printf("請(qǐng)輸入w,a,s,d以控制前進(jìn)方向!!\n");
}
returntrend;
}
完整源代碼:
#pragmaonce
#pragmawarning(disable:4996)
#includestdio.h
#includetime.h
#includestdlib.h
#includeWindows.h
#includeconio.h
#defineROW30
#defineCOL30
#defineTIME300
intGame();
intMenu();
intInput();
intCreatHead(int*px,int*py,intdata[ROW][COL]);
voidCreatFood(intdata[ROW][COL]);
intMoveSnake(inttrend,int*px,int*py,intdata[ROW][COL],int*t);
intDeleteTail(intx,inty,intdata[ROW][COL]);
voidPrintShow(intdata[ROW][COL]);
intGameOver(intscore);
voidPrintTest(intdata[ROW][COL]);
#include"main.h"
intmain()
intret=1;
while(ret){
intchoose=Menu();
intscore=0;
switch(choose){
case1:
score=Game();
ret=GameOver(score);
break;
case2:
system("cls");
printf("==========================================================\n");
printf("
游戲說明
\n");
printf("
1.輸入‘w'‘a(chǎn)'‘s'‘d'以控制小蛇的移動(dòng)。\n");
printf("
2.小蛇在固定時(shí)間內(nèi)只移動(dòng)一次,如一個(gè)時(shí)間段內(nèi)輸入多個(gè)方向\n則以第一次輸入為準(zhǔn)。\n");
printf("
3.不能撞到墻壁或者是自身。\n");
printf("
4.小蛇移動(dòng)速度會(huì)在吃到食物后加快,直到游戲結(jié)束。\n");
printf("
輸入“1”繼續(xù)...........\n");
printf("==========================================================\n");
intok=0;
scanf("%d",ok);
if(ok){
system("cls");
break;
}
case3:
ret=0;
break;
}
}
}
#include"main.h"
intGame()
intdata[ROW][COL]={0};
inttime_=TIME;
for(inti=0;iCOL;i++){
for(intj=0;jROW;j++){
if(i==0||i==COL-1){
data[i][j]=5;//邊界墻
}
if(j==0||j==ROW-1){
data[i][j]=5;//邊界墻
}
}
}//初始化數(shù)據(jù)存儲(chǔ)數(shù)組
//PrintShow(data);
intx=0,y=0;
inttrend=CreatHead(x,y,data);
//生成蛇頭
CreatFood(data);//生成食物
intret=1;
while(ret){
system("cls");
PrintShow(data);
Sleep(time_);
inttrend_=Input();
if(trend_!=0){
trend=trend_;
}
ret=MoveSnake(trend,x,y,data,time_);
}
intscore=0;
for(inti=0;iROW;i++){
for(intj=0;jCOL;j++){
if(data[i][j]=4data[i][j]=1){
score++;
}
}
}
returnscore;
intMenu()
intchoose=0;
while(1){
printf("==========================\n");
printf("===歡迎進(jìn)入貪吃蛇游戲!===\n");
printf("===
1、經(jīng)典模式
===\n");
printf("===
2、游戲說明
===\n");
printf("===
3、退出游戲
===\n");
printf("===請(qǐng)輸入您的選項(xiàng)...
===\n");
printf("==========================\n");
scanf("%d",choose);
if(choose==1||choose==2||choose==3){
break;
}
}
returnchoose;
intMoveSnake(inttrend,int*px,int*py,intdata[ROW][COL],int*t)
intret=1;//默認(rèn)前進(jìn)成功
//printf("trend=%d\n",trend);
switch(trend){
case1:*py-=1;break;//向上
case2:*px-=1;break;//向左
case3:*py+=1;break;//向下
case4:*px+=1;break;//向右
}//找到即將前進(jìn)的坐標(biāo)
if(data[*py][*px]==6){
data[*py][*px]=trend;
CreatFood(data);
*t*=0.9;
}//如果蛇頭要前進(jìn)的格子是食物,向前長(zhǎng)一格,尾部不變;
elseif(data[*py][*px]==0){
data[*py][*px]=trend;//向前長(zhǎng)一格
DeleteTail(*px,*py,data);//消去最后的尾巴
}
else{
ret=0;
printf("前進(jìn)失敗\n");
}//前進(jìn)失敗
returnret;
voidCreatFood(intdata[ROW][COL])
srand(time(NULL));
while(1){
intx=rand()%(COL-2)+1;
inty=rand()%(ROW-2)+1;
if(data[y][x]==0){
data[y][x]=6;
break;
}
}
intDeleteTail(intx,inty,intdata[ROW][COL])
//PrintTest(data);
if(data[y][x]=4data[y][x]=1){
switch(data[y][x]){
case1:
if(DeleteTail(x,y+1,data)==0){
data[y][x]=0;
}
break;
case2:
if(DeleteTail(x+1,y,data)==0){
data[y][x]=0;
}
break;
case3:
if(DeleteTail(x,y-1,data)==0){
data[y][x]=0;
}
break;
case4:
if(DeleteTail(x-1,y,data)==0){
data[y][x]=0;
}
break;
}
return1;
}
else{
return0;
}
intInput(){
inttrend=0;
if(kbhit()){
chartrend_=getch();
while(kbhit()){
getch();
}//清空緩沖區(qū)
//printf("已接收到%c",trend_);
switch(trend_){
case'w':trend=1;break;
case'a':trend=2;break;
case's':trend=3;break;
case'd':trend=4;break;
default:printf("請(qǐng)輸入w,a,s,d以控制前進(jìn)方向!!\n");
break;
}
}
else{
printf("請(qǐng)輸入w,a,s,d以控制前進(jìn)方向!!\n");
}
returntrend;
voidPrintShow(intdata[ROW][COL])
for(inti=0;iROW;i++){
for(intj=0;jCOL;j++){
if(data[i][j]==0){
printf("
");
}
if(data[i][j]==5){
printf("■");
}
if(data[i][j]=1data[i][j]=4){
printf("□");
}
if(data[i][j]==6){
printf("●");
}
}
printf("\n");
}
intCreatHead(int*px,int*py,intdata[ROW][COL])
srand(time(NULL));
while(1){
*px=rand()%(COL-8)+4;
*py=rand()%(ROW-8)+4;
if(data[*py][*px]==0){
break;
}
}//蛇頭只能刷新在空格位置
//x,y始終為蛇頭的坐標(biāo)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工績(jī)效評(píng)價(jià)與激勵(lì)機(jī)制方案
- 物流供應(yīng)鏈協(xié)作平臺(tái)建設(shè)方案
- 隧道施工方案技術(shù)重點(diǎn)解析
- 納米技術(shù)科普與小學(xué)教學(xué)設(shè)計(jì)方案
- 建設(shè)節(jié)能環(huán)保措施實(shí)踐指導(dǎo)方案
- 快遞行業(yè)快件分揀與派送流程優(yōu)化方案
- 冷水機(jī)組吊裝及安裝施工方案
- 北師大版長(zhǎng)方體認(rèn)識(shí)教學(xué)導(dǎo)學(xué)方案
- 企業(yè)員工聯(lián)誼會(huì)組織流程和方案
- 北京學(xué)校防疫工作方案
- 清真生產(chǎn)過程管控制度
- 2026年淺二度燒傷處理
- 北京通州產(chǎn)業(yè)服務(wù)有限公司招聘考試備考題庫(kù)及答案解析
- 河北省NT名校聯(lián)合體2025-2026學(xué)年高三上學(xué)期1月月考英語(yǔ)(含答案)
- 2025-2026學(xué)年滬科版八年級(jí)數(shù)學(xué)上冊(cè)期末測(cè)試卷(含答案)
- 途虎養(yǎng)車安全培訓(xùn)課件
- 衛(wèi)生管理研究論文
- 2025-2026學(xué)年人教版(新教材)小學(xué)數(shù)學(xué)二年級(jí)下冊(cè)(全冊(cè))教學(xué)設(shè)計(jì)(附教材目錄P161)
- 委托市場(chǎng)調(diào)研合同范本
- 畜牧安全培訓(xùn)資料課件
- 2025年度黨支部書記述職報(bào)告
評(píng)論
0/150
提交評(píng)論