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

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

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

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

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

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

現(xiàn)在就來實現(xiàn)一下game over的功能吧。

寫個函數(shù)判斷蛇是否撞到自己或者撞到墻:

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里面加這個實現(xiàn)gameOver

if(gameOver())

? ? ? ?{

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

? ? ? ? ? ?system("pause");

break;

? ? ? ?}

看看效果


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

到現(xiàn)在為止的代碼:

#include

#include

#include

#include

#include

#defineH 23

#defineW 75

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

#defineUP 0

#defineDOWN 1

#defineLEFT 2

#defineRIGHT 3

inta[H][W];//地圖數(shù)組

ints[H*W][2];//蛇身坐標數(shù)組

intsLength;//蛇的長度

intdirection;//蛇的方向

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

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

{

? ?srand((unsigned)time(NULL)); ? ? ? ? ? ?//設置隨機數(shù)種子為現(xiàn)在的時間CONSOLE_CURSOR_INFO cursor_info = {1,0};

? ?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<4; i++)

? ?{

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

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

? ?}

? ?direction=UP;}

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

{

? ?COORD position={j,i}; ? ?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之間的一個數(shù)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("\n");//別忘了換行

}}

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("");//消去下面的按任意鍵繼續(xù)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(); ? ? ? ? ? ? ? ? ? ? //移動蛇(主要是修改蛇身數(shù)組的數(shù)據(jù))if(gameOver())

? ? ? ?{

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

? ? ? ? ? ?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;

}

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

聲明一個變量來記錄分數(shù)

intscore=0;//得分

然后當吃到食物時分數(shù)增加(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函數(shù)來寫分數(shù)

void printScore()

{

? ?gotoxy(0,W+2);

? ?printf(" ?貪吃蛇小游戲");

? ?gotoxy(1,W+2);

? ?printf(" ?環(huán)家偉制作");

? ?gotoxy(4,W+2);

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

}

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

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


?完整代碼:

#include

#include

#include

#include

#include

#defineH 23

#defineW 75

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

#defineUP 0

#defineDOWN 1

#defineLEFT 2

#defineRIGHT 3

inta[H][W];//地圖數(shù)組

ints[H*W][2];//蛇身坐標數(shù)組

intsLength;//蛇的長度

intdirection;//蛇的方向

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

intscore=0;//得分

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

{

? ?srand((unsigned)time(NULL)); ? ? ? ? ? ?//設置隨機數(shù)種子為現(xiàn)在的時間CONSOLE_CURSOR_INFO cursor_info = {1,0};

? ?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<4; i++)

? ?{

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

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

? ?}

? ?direction=UP;}

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

{

? ?COORD position={j,i}; ? ?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之間的一個數(shù)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("\n");//別忘了換行

}}

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("");//消去下面的按任意鍵繼續(xù)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(" ?環(huán)家偉制作");

? ?gotoxy(4,W+2);

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

int main()

{

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

food();

while(1)

? ?{

? ? ? ?drawSnake(); ? ? ? ? ? ? ? ?//畫蛇

? ? ? ?printScore();

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

? ? ? ?key();

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

? ? ? ?{

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

? ? ? ? ? ?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++能做的

服務器開發(fā)工程師、人工智能、云計算工程師、信息安全(黑客反黑客)、大數(shù)據(jù) 、數(shù)據(jù)平臺、嵌入式工程師、流媒體服務器、數(shù)據(jù)控解、圖像處理、音頻視頻開發(fā)工程師、游戲服務器、分布式系統(tǒng)、游戲輔助等

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容