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)、游戲輔助等


