生活随笔
收集整理的這篇文章主要介紹了
贪吃蛇c++实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
近期沒事翻了一下曾經寫的程序。真是不堪入目。曾經真是什么都不懂。只是有一個程序倒是挺有意思的,大二的時候寫的一個貪吃蛇游戲。盡管程序非常難看,還有非常多漏洞。但也是這個程序讓我真正開始喜歡上了編程。不多說啦。先看看代碼。
#include<iostream>
#include<windows.h>
#include<ctime>
#include<cstdlib>
#include<conio.h>
using namespace std;
int n ; //墻的大小,寫在這里為了好控制
int foods[2];//食物的橫縱坐標
int m=1; //控制速度
void gotoxy(int x,int y)//位置函數,輸入坐標后。光標會移動到那個位置以便進行輸出
{COORD pos ;pos.X=2*x; //由于以下輸出的圖形都占兩個位置pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);//光標控制的位置
}
void color(int a)//顏色函數
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);//這樣就僅僅有一個參數啦
}
void init(){ //初始化墻for(int i=0;i<=n;i++)for(int j=0;j<=n;j++){gotoxy(i ,j);if(i==0||i==n||j==0||j==n){gotoxy(i ,j);color(10);cout<<"■";}//圍墻else {gotoxy(i ,j);color(3);cout<<"□" ; }//能夠玩的區域}
}void guize(){gotoxy(5,8);color(2);cout<<"歡迎你玩這款很好玩的貪吃蛇游戲";gotoxy(5,9);color(2); cout<<"此游戲由呂仰銘制作。比較粗糙,請見諒";gotoxy(n+1,1);color(12);cout<<"請按 w,s,a,d 來控制方向";gotoxy(n+1,2);color(12);cout<<"請按空格鍵暫停";gotoxy(n+1,3);color(12);cout<<"your score:";Sleep(2000);gotoxy(5,8);color(2);cout<<" ";gotoxy(5,9);color(2); cout<<" ";}void food(){ //果實的生成。用時間做變量srand((unsigned)time(NULL));foods[0]=rand()%(n-1)+1;//果實橫坐標foods[1]=rand()%(n-1)+1;//果實的縱坐標}
int main(){char again='r';while(again=='r'){int err =0 ; //輸入必須正確的推斷do{err++;if(err>1){gotoxy(0,0);cout<<"你輸入的范圍不正確,請又一次輸入";Sleep(500);}gotoxy(0,0);cout<<"請設置圍墻的寬度,范圍是10—25,按enter鍵確定:";cin>>n;gotoxy(0,1);cout<<"請設置難度,1-簡單 2—中 3—難。按enter鍵確定:";cin>>m;gotoxy(0,0); cout<<" "; gotoxy(0,1);Sleep(200);cout<<" ";}while(n<=9||n>=26||m<=0||m>=4);int ** snake=NULL;//定義一條蛇,用來控制蛇的移動坐標int score=0;int tail[2]; //尾巴的橫縱坐標int len=3; //初始蛇的長度char ch='p'; //用來控制方向的參數char sh='p'; //用來抑制蛇的反方向移動int yw=1; //用來推斷是否咬到自己int count=1; //控制關卡guize();init();//墻snake=(int**)realloc(snake,4*len);//為snake申請len長度的4個字節的空間for (int i=0;i<len;i++)snake[i]=new int[2];for(i=0;i<len;i++){snake[i][0]=n/2;snake[i][1]=n/2+i;gotoxy(snake[i][0],snake[i][1]);color(14);cout<<"★"<<endl;//用★來構成蛇的組成部分} //這樣就形成了一條長度為3的蛇s1: food(); //生成一個果實for(i=len-1;i>=0;i--)if(foods[0]==snake[i][0]&&foods[1]==snake[i][1]) //防止果實長在蛇身上goto s1;gotoxy(foods[0],foods[1]);color(4);cout<<"●"<<endl;int zt=0; //用來暫停while(1)//正式進入游戲階段{tail[0]=snake[len-1][0];//尾巴的橫坐標tail[1]=snake[len-1][1];//尾巴的縱坐標gotoxy(tail[0],tail[1]);color(3);cout<<"□" ; gotoxy(0,4);color(10);cout<<"■";if(ch!=' ' ){for(i=len-1;i>0;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];gotoxy(snake[i][0],snake[i][1]);color(14);cout<<"★"<<endl; //前面的一節被后面的一節取代}}if(kbhit()) //推斷是否有按鍵按下{gotoxy(0,n+2);ch=getch();}if((sh=='a'&&ch=='d')||(sh=='d'&&ch=='a')||(sh=='w'&&ch=='s')||(sh=='s'&&ch=='w')||(ch!='a'&&ch!='w'&&ch!='d'&&ch!='s'&&ch!=' '))ch=sh; //抑制蛇反向移動switch(ch) //移動方向{case 'w':snake[0][1]--;break;case 's':snake[0][1]++;break;case 'a':snake[0][0]--;break;case 'd':snake[0][0]++;break;case ' ':break; //按下空格鍵暫停}sh=ch;gotoxy(snake[0][0],snake[0][1]); color(14);cout<<"★"<<endl;Sleep(abs(300/m-0.1*score-5*count));//依據分數的添加會越來越快if(snake[0][0]==foods[0]&&snake[0][1]==foods[1])//吃掉蘋果后蛇分數加1。蛇長加1{score+=5; //吃掉果實后分數也對應的添加len++;snake=(int**)realloc(snake,4*len);//為snake新申請len長度的4個字節的空間。由于len已經變化snake[len-1]=new int[2];s2: food(); //生成新的果實for(i=len-1;i>=0;i--)if(foods[0]==snake[i][0]&&foods[1]==snake[i][1]) //防止果實長在蛇身上goto s2;gotoxy(foods[0],foods[1]);color(4);cout<<"●"<<endl;gotoxy(n+7,3);color(12);cout<<score<<endl;if(score%50==0)count++;color(2*count);gotoxy(n+2,4);cout<<"第"<<count<<"關 ";}yw=1;for(i=1;i<len;i++)if(score>=5&&snake[i][1]==snake[0][1]&&snake[i][0]==snake[0][0])//咬到自己yw=0;if(ch==' ')zt=score;if((yw==0&&score>zt)||snake[0][1]==0||snake[0][1]==n||snake[0][0]==0||snake[0][0]==n)//咬到自己或撞到圍墻后失敗{gotoxy(1,n/2);color(30);if(score<100)cout<<"這么快死,真失敗。。要加油啊,菜鳥級別"<<endl;else if(score<200)cout<<"玩的還不錯嘛。繼續努力,高手級別"<<endl;else cout<<"玩的這么好,簡直就是大神級別"<<endl;delete []snake;Sleep(600);goto s;}}
s: for(i=0;i<=n;i++)for(int j=0;j<=n;j++){gotoxy(i ,j);cout<<" ";}gotoxy(1,n/2+1);color(12);
cout<<"按r鍵重來。其它鍵取消:";gotoxy(13,n/2+1);color(12);cin>>again;system("cls");}return 0;
}
結果例如以下:
能夠看到。功能是實現了,并且我自己認為還挺好玩的。可是這個程序有幾個明顯的缺陷:
1.代碼實在太丑,各種不正確齊,我自己如今看都認為有點吃力。
2.這個程序僅僅能在visual c++6.0下才干正確執行,其它環境下可能會出現重定義和沒有定義等錯誤。細致看我寫的for循環應該就知道怎么回事了
3,好多goto啊,c++本來是要避免goto的,但曾經就是認為好用,并且沒認為有什么不妥!
唉,想想曾經的自己是多么的無知啊,只是有位名人不是說過嘛,生活就是不斷發現曾經的自己是一個SB的過程,盡管不知道誰說的,只是我想學習也是如此!
總結
以上是生活随笔為你收集整理的贪吃蛇c++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。