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