贪吃蛇c++实现
来源:互联网 发布:db2和mysql优缺点 编辑:程序博客网 时间:2024/05/17 03:36
最近没事翻了一下以前写的程序,真是不堪入目,以前真是什么都不懂,不过有一个程序倒是挺有意思的,大二的时候写的一个贪吃蛇游戏,虽然程序非常难看,还有很多漏洞,但也是这个程序让我真正开始喜欢上了编程,不多说啦,先看看代码!
#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的过程,虽然不知道谁说的,不过我想学习也是如此!
3 0
- 贪吃蛇C实现
- 贪吃蛇----C语言实现
- C语言实现贪吃蛇
- [C++]C++实现贪吃蛇
- 贪吃蛇游戏(c实现)
- C + SDL 贪吃蛇的基础实现
- 【LB】C语言实现贪吃蛇
- 30行C代码实现贪吃蛇
- c语言实现,图形化贪吃蛇
- 贪吃蛇游戏的C语言实现
- c语言实现贪吃蛇小游戏
- C语言之实现贪吃蛇
- 贪吃蛇C语言实现(简易版)
- C语言用数组实现贪吃蛇
- C语言 贪吃蛇实现(不闪屏)
- 用C语言实现贪吃蛇
- 贪吃蛇——C语言实现
- C语言-贪吃蛇具体实现
- kafka 操作中
- 黑马程序员-判断字符串是否为对称字符串
- 第十一周 oj平台项目2 当年第几天
- 第十一周上机项目5 当年第几天
- MySQL的Grant命令
- 贪吃蛇c++实现
- 学习Haar-Like特征和AdaBoost进行人脸识别
- hdu 5076 Memory(最小割 数学建模)智商被爆出翔
- C++ 解析 csv 方法对比
- final finally finalize
- 用freeze.py打包python程序成可执行程序(linux)
- 黑马程序员-斐波那契数列第n项
- linux常用故障排除命令
- 天地币:所用到的 Android Socket 通讯编程技术试验