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