C語(yǔ)言實(shí)現(xiàn)貪吃蛇小黑窗_第1頁(yè)
C語(yǔ)言實(shí)現(xiàn)貪吃蛇小黑窗_第2頁(yè)
C語(yǔ)言實(shí)現(xiàn)貪吃蛇小黑窗_第3頁(yè)
C語(yǔ)言實(shí)現(xiàn)貪吃蛇小黑窗_第4頁(yè)
C語(yǔ)言實(shí)現(xiàn)貪吃蛇小黑窗_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論