首页 > 代码库 > 贪吃蛇c++实现
贪吃蛇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++实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。