當前位置:
首頁 > 最新 > C語言編程學習,貪吃蛇詳解5.GameOver功能與顯示成績

C語言編程學習,貪吃蛇詳解5.GameOver功能與顯示成績

C語言是面向過程的,而C++是面向對象的。C和C++的區別:

C是一個結構化語言,它的重點在於演算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制)。

C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取對象的狀態信息得到輸出或實現過程(事務)控制。 所以C與C++的最大區別在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為「 設計這個概念已經被融入到C++之中 」。

C與C++的最大區別:在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為「 設計這個概念已經被融入到C++之中 」,而就語言本身而言,在C中更多的是演算法的概念。那麼是不是C就不重要了,錯!演算法是程序設計的基礎,好的設計如果沒有好的演算法,一樣不行。而且,「C加上好的設計」也能寫出非常好的東西。

以前我們已經做出來了一個能吃東西變長的蛇。不過它好像不會死。。。

現在就來實現一下game over的功能吧。

寫個函數判斷蛇是否撞到自己或者撞到牆:

boolgameOver(){

boolisGameOver=false;

intsX=s[0][0],sY=s[0][1];//蛇頭的x坐標和y坐標if(sX==0||sX==H-1||sY==0||sY==W-1)

isGameOver=true;

for(inti=1; i

{

if(s[i][0]==sX&&s[i][1]==sY)

isGameOver=true; }

return isGameOver;

}

然後在main裡面加這個實現gameOver

if(gameOver())

{

system("cls");//清除屏幕內容printf("Game Over
");

system("pause");

break;

}

看看效果

GIF

GIF

GIF

小編推薦一個學C語言/C++的學習裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多乾貨和技術資料分享!

到現在為止的代碼:

#include

#include

#include

#include

#include

#defineH 23

#defineW 75

#defineWAIT_TIME 500//定義direction的每個值代表的方向

#defineUP 0

#defineDOWN 1

#defineLEFT 2

#defineRIGHT 3

inta[H][W];//地圖數組

ints[H*W][2];//蛇身坐標數組

intsLength;//蛇的長度

intdirection;//蛇的方向

booleated=false;//標記是否吃到食物

voidinit()//程序開始時的初始化操作

{

srand((unsigned)time(NULL)); //設置隨機數種子為現在的時間CONSOLE_CURSOR_INFO cursor_info = ;

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);//隱藏關標

inti,j;

for(i=0; i

{

a[i][0]=1;//讓第一列為1a[i][W-1]=1;//讓最後一列為1

}

for(j=0; j

{

a[0][j]=1;//讓第一行為1a[H-1][j]=1;//讓最後一行為1

}

sLength=4;//讓蛇的最初長度為4s[0][0]=H/2;

s[0][1]=W/2;//給蛇頭坐標賦值for(i=1; i

{

s[i][0]=s[0][0]+i;

s[i][1]=s[0][1];//給剛開始的蛇身幾個初始坐標

}

direction=UP;}

voidgotoxy(inti,intj)//移動游標

{

COORD position=; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);}

intcheck(intii,intjj)//判斷這個點能不能放食物,可以放返回1,不能放返回0

{

if(a[ii][jj]==1)//如果有障礙物,返回0return0;

inti;

for(i=0; i

if(ii==s[i][0]&&jj==s[i][1])//如果和其中一個蛇身重合,就返回0return0; }

if(ii==0||ii==H-1||jj==0||jj==W-1)//如果在邊界上面,返回0return0;

return1;//最後篩選 過後的是符合條件的點

}

voidfood(){

inti,j;

do {

i=rand()%H;//生成0~H-1之間的一個數j=rand()%W;

} while(check(i,j)==0);//生成點直到滿足條件a[i][j]=-1;//標記為食物

gotoxy(i,j);

printf("$");//畫出食物

}

voiddrawMap()//畫地圖

{

gotoxy(0,0);

inti,j;

for(i=0; i

for(j=0; j

{

if(a[i][j]==0)//為0輸出空格printf("");

else//為1輸出#printf("#");

}

printf("
");//別忘了換行

}}

voidmove(){

int i;

gotoxy(s[sLength-1][0],s[sLength-1][1]);

printf("");//在尾巴上面畫空格以擦除尾巴if(eated)//如果吃到了食物

{

sLength++;

eated=false;//設置為false,不然無限變長}

for(i=sLength-1; i>0; i--)//從尾巴開始,每一個點的位置等於它前面一個點的位置

{

s[i][0]=s[i-1][0];

s[i][1]=s[i-1][1]; }

switch(direction) {

case UP:

s[0][0]--; break;

case DOWN:

s[0][0]++; break;

case LEFT:

s[0][1]--; break;

case RIGHT:

s[0][1]++; break; }}

voiddrawSnake()//畫蛇

{

inti;

for(i=0; i

{

gotoxy(s[i][0],s[i][1]);//移動關標到蛇的坐標printf("@");//在這個位置畫蛇}}

voidkey(){

if(kbhit()!=0)//如果有鍵盤輸入

{

charin;

while(!kbhit()==0)//如果玩家輸入了多個按鍵,以最後一個按鍵為準in=getch();

switch(in) {

case"w":

case"W":

if(direction!=DOWN)//不能縮頭吧。。。。direction=UP; break;

case"s":

case"S":

if(direction!=UP)

direction=DOWN; break;

case"a":

case"A":

if(direction!=RIGHT)

direction=LEFT; break;

case"d":

case"D":

if(direction!=LEFT)

direction=RIGHT; break;

case"p":

case"P":

gotoxy(H,0);//將游標移動到下面system("pause");

gotoxy(H,0);

printf("");//消去下面的按任意鍵繼續break; } }}

boolgameOver(){

boolisGameOver=false;

intsX=s[0][0],sY=s[0][1];//蛇頭的x坐標和y坐標if(sX==0||sX==H-1||sY==0||sY==W-1)

isGameOver=true;

for(inti=1; i

{

if(s[i][0]==sX&&s[i][1]==sY)

isGameOver=true; }

returnisGameOver;}

int main()

{

init(); //程序開始時的初始化操作drawMap();//畫地圖

food();

while(1)

{

drawSnake(); //畫蛇Sleep(WAIT_TIME);//等待一段時間

key();

move(); //移動蛇(主要是修改蛇身數組的數據)if(gameOver())

{

system("cls");//清除屏幕內容printf("Game Over
");

system("pause"); break; }

if(a[s[0][0]][s[0][1]]==-1)//如果蛇頭碰到食物,就重新投放食物,並且把食物點重置為0

{

eated=true;//標記已經吃到食物

food();

a[s[0][0]][s[0][1]]=0;//去掉食物

} }

return0;

}

接下來,我們來顯示一下成績。

聲明一個變數來記錄分數

intscore=0;//得分

然後當吃到食物時分數增加(main裡面)

if(a[s[0][0]][s[0][1]]==-1)//如果蛇頭碰到食物,就重新投放食物,並且把食物點重置為0

{

eated=true;//標記已經吃到食物score+=10;

food();

a[s[0][0]][s[0][1]]=0;//去掉食物}

然後寫一個printScore函數來寫分數

void printScore()

{

gotoxy(0,W+2);

printf(" 貪吃蛇小遊戲");

gotoxy(1,W+2);

printf(" 環家偉製作");

gotoxy(4,W+2);

printf(" 得分:%d",score);

}

記得在main裡面調用啊。看看效果:

GIF

小編推薦一個學C語言/C++的學習裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多乾貨和技術資料分享!

完整代碼:

#include

#include

#include

#include

#include

#defineH 23

#defineW 75

#defineWAIT_TIME 500//定義direction的每個值代表的方向

#defineUP 0

#defineDOWN 1

#defineLEFT 2

#defineRIGHT 3

inta[H][W];//地圖數組

ints[H*W][2];//蛇身坐標數組

intsLength;//蛇的長度

intdirection;//蛇的方向

booleated=false;//標記是否吃到食物

intscore=0;//得分

voidinit()//程序開始時的初始化操作

{

srand((unsigned)time(NULL)); //設置隨機數種子為現在的時間CONSOLE_CURSOR_INFO cursor_info = ;

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);//隱藏關標inti,j;

for(i=0; i

{

a[i][0]=1;//讓第一列為1a[i][W-1]=1;//讓最後一列為1

}

for(j=0; j

{

a[0][j]=1;//讓第一行為1a[H-1][j]=1;//讓最後一行為1

}

sLength=4;//讓蛇的最初長度為4s[0][0]=H/2;

s[0][1]=W/2;//給蛇頭坐標賦值for(i=1; i

{

s[i][0]=s[0][0]+i;

s[i][1]=s[0][1];//給剛開始的蛇身幾個初始坐標

}

direction=UP;}

voidgotoxy(inti,intj)//移動游標

{

COORD position=; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);}

intcheck(intii,intjj)//判斷這個點能不能放食物,可以放返回1,不能放返回0

{

if(a[ii][jj]==1)//如果有障礙物,返回0return0;

inti;

for(i=0; i

if(ii==s[i][0]&&jj==s[i][1])//如果和其中一個蛇身重合,就返回0return0; }

if(ii==0||ii==H-1||jj==0||jj==W-1)//如果在邊界上面,返回0return0;

return1;//最後篩選 過後的是符合條件的點

}

voidfood(){

inti,j;

do {

i=rand()%H;//生成0~H-1之間的一個數j=rand()%W;

} while(check(i,j)==0);//生成點直到滿足條件a[i][j]=-1;//標記為食物

gotoxy(i,j);

printf("$");//畫出食物

}

voiddrawMap()//畫地圖

{

gotoxy(0,0);

inti,j;

for(i=0; i

for(j=0; j

if(a[i][j]==0)//為0輸出空格printf("");

else//為1輸出#printf("#");

}

printf("
");//別忘了換行

}}

voidmove(){

int i;

gotoxy(s[sLength-1][0],s[sLength-1][1]);

printf("");//在尾巴上面畫空格以擦除尾巴if(eated)//如果吃到了食物

{

sLength++;

eated=false;//設置為false,不然無限變長

}

for(i=sLength-1; i>0; i--)//從尾巴開始,每一個點的位置等於它前面一個點的位置

{

s[i][0]=s[i-1][0];

s[i][1]=s[i-1][1]; }

switch(direction) {

case UP:

s[0][0]--; break;

case DOWN:

s[0][0]++; break;

case LEFT:

s[0][1]--; break;

case RIGHT:

s[0][1]++; break; }}

voiddrawSnake()//畫蛇

{

inti;

for(i=0; i

{

gotoxy(s[i][0],s[i][1]);//移動關標到蛇的坐標printf("@");//在這個位置畫蛇}}

voidkey(){

if(kbhit()!=0)//如果有鍵盤輸入

{

charin;

while(!kbhit()==0)//如果玩家輸入了多個按鍵,以最後一個按鍵為準in=getch();

switch(in) {

case"w":

case"W":

if(direction!=DOWN)//不能縮頭吧。。。。direction=UP; break;

case"s":

case"S": if(direction!=UP)

direction=DOWN; break;

case"a":

case"A":

if(direction!=RIGHT)

direction=LEFT; break;

case"d":

case"D":

if(direction!=LEFT)

direction=RIGHT; break;

case"p":

case"P":

gotoxy(H,0);//將游標移動到下面system("pause");

gotoxy(H,0);

printf("");//消去下面的按任意鍵繼續break; } }}

boolgameOver(){

boolisGameOver=false;

intsX=s[0][0],sY=s[0][1];//蛇頭的x坐標和y坐標if(sX==0||sX==H-1||sY==0||sY==W-1)

isGameOver=true;

for(inti=1; i

{

if(s[i][0]==sX&&s[i][1]==sY)

isGameOver=true; }

returnisGameOver;}

void printScore()

{

gotoxy(0,W+2);

printf(" 貪吃蛇小遊戲");

gotoxy(1,W+2);

printf(" 環家偉製作");

gotoxy(4,W+2);

printf(" 得分:%d",score);}

int main()

{

init(); //程序開始時的初始化操作drawMap();//畫地圖

food();

while(1)

{

drawSnake(); //畫蛇

printScore();

Sleep(WAIT_TIME); //等待一段時間

key();

move(); //移動蛇(主要是修改蛇身數組的數據)if(gameOver())

{

system("cls");//清除屏幕內容printf("Game Over
");

system("pause");

break; }

if(a[s[0][0]][s[0][1]]==-1)//如果蛇頭碰到食物,就重新投放食物,並且把食物點重置為0

{

eated=true;//標記已經吃到食物score+=10;

food();

a[s[0][0]][s[0][1]]=0;//去掉食物} }

return0;

}

這些是C/C++能做的

伺服器開發工程師、人工智慧、雲計算工程師、信息安全(黑客反黑客)、大數據 、數據平台、嵌入式工程師、流媒體伺服器、數據控解、圖像處理、音頻視頻開發工程師、遊戲伺服器、分散式系統、遊戲輔助等


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |