首页 > 代码库 > 贪吃蛇c++实现

贪吃蛇c++实现

最近没事翻了一下以前写的程序,真是不堪入目,以前真是什么都不懂,不过有一个程序倒是挺有意思的,大二的时候写的一个贪吃蛇游戏,虽然程序非常难看,还有很多漏洞,但也是这个程序让我真正开始喜欢上了编程,不多说啦,先看看代码!


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. #include<windows.h>  
  3. #include<ctime>  
  4. #include<cstdlib>  
  5. #include<conio.h>  
  6. using namespace std;  
  7. int n ; //墙的大小,写在这里为了好控制  
  8. int foods[2];//食物的横纵坐标  
  9. int m=1;     //控制速度  
  10. void gotoxy(int x,int y)//位置函数,输入坐标后,光标会移动到那个位置以便进行输出  
  11. {  
  12.     COORD pos ;  
  13.     pos.X=2*x;   //因为下面输出的图形都占两个位置  
  14.     pos.Y=y;  
  15. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);//光标控制的位置  
  16. }  
  17. void color(int a)//颜色函数  
  18. {  
  19.   
  20. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);//这样就只有一个参数啦  
  21. }  
  22. void init(){        //初始化墙  
  23.     
  24.    for(int i=0;i<=n;i++)  
  25.        for(int j=0;j<=n;j++){  
  26.            gotoxy(i ,j);  
  27.            if(i==0||i==n||j==0||j==n){  
  28.                 gotoxy(i ,j);  
  29.                color(10);  
  30.                cout<<"■";}//围墙  
  31.          else {  
  32.              gotoxy(i ,j);  
  33.              color(3);  
  34.              cout<<"□" ; }//可以玩的区域  
  35.   
  36.        }  
  37. }  
  38.   
  39. void guize(){  
  40.      gotoxy(5,8);  
  41.      color(2);  
  42.      cout<<"欢迎你玩这款非常好玩的贪吃蛇游戏";  
  43.        gotoxy(5,9);  
  44.      color(2);     
  45.      cout<<"此游戏由吕仰铭制作,比较粗糙,请见谅";  
  46.          gotoxy(n+1,1);  
  47.      color(12);  
  48.      cout<<"请按 w,s,a,d 来控制方向";  
  49.      gotoxy(n+1,2);  
  50.      color(12);  
  51.      cout<<"请按空格键暂停";  
  52.          gotoxy(n+1,3);  
  53.      color(12);  
  54.      cout<<"your score:";  
  55.      Sleep(2000);  
  56.  gotoxy(5,8);  
  57.      color(2);  
  58.      cout<<"                                   ";  
  59.        gotoxy(5,9);  
  60.      color(2);     
  61.      cout<<"                                   ";  
  62.           
  63. }  
  64.   
  65. void food(){ //果实的生成,用时间做变量  
  66.    srand((unsigned)time(NULL));  
  67.         foods[0]=rand()%(n-1)+1;//果实横坐标  
  68.         foods[1]=rand()%(n-1)+1;//果实的纵坐标  
  69.       
  70.           
  71. }  
  72. int main(){  
  73.     char again=‘r‘;  
  74.   
  75.     while(again==‘r‘){  
  76.         int err =0    ;    //输入必须正确的判断  
  77.         do{  
  78.             err++;  
  79.             if(err>1){  
  80.                 gotoxy(0,0);  
  81.                 cout<<"你输入的范围不对,请重新输入";  
  82.             Sleep(500);  
  83.             }  
  84.   
  85.     gotoxy(0,0);  
  86.   
  87.     cout<<"请设置围墙的宽度,范围是10—25,按enter键确定:";  
  88.     cin>>n;  
  89.       
  90.       
  91.     gotoxy(0,1);  
  92.               
  93.     cout<<"请设置难度,1-简单 2—中 3—难,按enter键确定:";  
  94.     cin>>m;  
  95.      gotoxy(0,0);         
  96.     cout<<"                                                    ";   
  97.     gotoxy(0,1);  
  98.     Sleep(200);  
  99.     cout<<"                                                     ";  
  100.         }  
  101.         while(n<=9||n>=26||m<=0||m>=4);  
  102.       
  103.        
  104.   
  105.     int ** snake=NULL;//定义一条蛇,用来控制蛇的移动坐标  
  106.     int score=0;  
  107.     int tail[2];     //尾巴的横纵坐标  
  108.     int len=3;       //初始蛇的长度  
  109.     char ch=‘p‘;     //用来控制方向的参数  
  110.     char sh=‘p‘;     //用来抑制蛇的反方向移动  
  111.     int  yw=1;      //用来判断是否咬到自己  
  112.     int count=1;    //控制关卡  
  113.     guize();  
  114.   
  115.     init();//墙  
  116.     snake=(int**)realloc(snake,4*len);//为snake申请len长度的4个字节的空间  
  117.     for (int i=0;i<len;i++)  
  118.         snake[i]=new int[2];  
  119.     for(i=0;i<len;i++)  
  120.                 {  
  121.                      snake[i][0]=n/2;  
  122.                      snake[i][1]=n/2+i;  
  123.                      gotoxy(snake[i][0],snake[i][1]);  
  124.                      color(14);  
  125.                      cout<<"★"<<endl;//用★来构成蛇的组成部分  
  126.             }     //这样就形成了一条长度为3的蛇  
  127.      
  128. s1: food();       //生成一个果实  
  129.     for(i=len-1;i>=0;i--)  
  130.     if(foods[0]==snake[i][0]&&foods[1]==snake[i][1]) //防止果实长在蛇身上  
  131.         goto s1;  
  132.     gotoxy(foods[0],foods[1]);  
  133.         color(4);  
  134.         cout<<"●"<<endl;  
  135.          int zt=0;              //用来暂停  
  136.     while(1)//正式进入游戏阶段  
  137.         {  
  138.         tail[0]=snake[len-1][0];//尾巴的横坐标  
  139.         tail[1]=snake[len-1][1];//尾巴的纵坐标  
  140.         gotoxy(tail[0],tail[1]);  
  141.         color(3);  
  142.         cout<<"□" ;       
  143.          gotoxy(0,4);  
  144.                color(10);  
  145.                 cout<<"■";  
  146.                 if(ch!=‘ ‘ ){  
  147.         for(i=len-1;i>0;i--)  
  148.         {  
  149.         snake[i][0]=snake[i-1][0];  
  150.         snake[i][1]=snake[i-1][1];  
  151.         gotoxy(snake[i][0],snake[i][1]);  
  152.         color(14);  
  153.         cout<<"★"<<endl; //前面的一节被后面的一节代替  
  154.         }  
  155.                 }  
  156.         
  157.  if(kbhit())     //判断是否有按键按下  
  158.         {  
  159.         gotoxy(0,n+2);  
  160.         ch=getch();  
  161.         }  
  162.       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!=‘ ‘))  
  163.           ch=sh;    //抑制蛇反向移动  
  164.         switch(ch) //移动方向  
  165.         {  
  166.         case ‘w‘:snake[0][1]--;break;  
  167.         case ‘s‘:snake[0][1]++;break;  
  168.         case ‘a‘:snake[0][0]--;break;  
  169.         case ‘d‘:snake[0][0]++;break;  
  170.         case ‘ ‘:break;                  //按下空格键暂停  
  171.         }  
  172.      sh=ch;  
  173.         
  174.         gotoxy(snake[0][0],snake[0][1]);   
  175.             color(14);  
  176.             cout<<"★"<<endl;  
  177.             Sleep(abs(300/m-0.1*score-5*count));//根据分数的增加会越来越快  
  178.   
  179.         if(snake[0][0]==foods[0]&&snake[0][1]==foods[1])//吃掉苹果后蛇分数加1,蛇长加1  
  180.             {  
  181.             score+=5;     //吃掉果实后分数也相应的增加  
  182.             len++;  
  183.             snake=(int**)realloc(snake,4*len);//为snake新申请len长度的4个字节的空间,因为len已经变化  
  184.             snake[len-1]=new int[2];  
  185.   
  186. s2: food(); //生成新的果实  
  187.     for(i=len-1;i>=0;i--)  
  188.     if(foods[0]==snake[i][0]&&foods[1]==snake[i][1]) //防止果实长在蛇身上  
  189.         goto s2;  
  190.       
  191.     gotoxy(foods[0],foods[1]);  
  192.         color(4);  
  193.         cout<<"●"<<endl;  
  194.       
  195.       
  196.     gotoxy(n+7,3);  
  197.             color(12);  
  198.             cout<<score<<endl;  
  199.               
  200.         if(score%50==0)  
  201.             count++;  
  202.         color(2*count);  
  203.         gotoxy(n+2,4);  
  204.         cout<<"第"<<count<<"关  ";  
  205.     }  
  206.                yw=1;  
  207.                 for(i=1;i<len;i++)  
  208.                       
  209.                   if(score>=5&&snake[i][1]==snake[0][1]&&snake[i][0]==snake[0][0])//咬到自己  
  210.                    yw=0;  
  211.                      
  212.                     
  213.                   if(ch==‘ ‘)  
  214.                        zt=score;  
  215.             if((yw==0&&score>zt)||snake[0][1]==0||snake[0][1]==n||snake[0][0]==0||snake[0][0]==n)//咬到自己或撞到围墙后失败  
  216.             {  
  217.             gotoxy(1,n/2);  
  218.             color(30);  
  219.             if(score<100)  
  220.             cout<<"这么快死,真失败!,要加油啊,菜鸟级别"<<endl;  
  221.             else if(score<200)  
  222.                     cout<<"玩的还不错嘛,继续努力,高手级别"<<endl;  
  223.             else   
  224.                  cout<<"玩的这么好,简直就是大神级别"<<endl;  
  225.               
  226.             delete []snake;  
  227.             Sleep(600);  
  228.             goto s;  
  229.             
  230.             }  
  231.   
  232.     }  
  233. s:      for(i=0;i<=n;i++)  
  234.        for(int j=0;j<=n;j++){  
  235.            gotoxy(i ,j);  
  236.            cout<<"  ";}  
  237.     gotoxy(1,n/2+1);  
  238.             color(12);  
  239. cout<<"按r键重来,其他键取消:";  
  240.             gotoxy(13,n/2+1);  
  241.             color(12);  
  242.             cin>>again;  
  243.             system("cls");  
  244.   
  245. }  
  246.   
  247. return 0;  
  248. }  

结果如下:



可以看到,功能是实现了,而且我自己觉得还挺好玩的,但是这个程序有几个明显的缺陷:

1.代码实在太丑,各种不对齐,我自己现在看都觉得有点吃力。

2.这个程序只能在visual c++6.0下才能正确运行,其他环境下可能会出现重定义和未定义等错误,仔细看我写的for循环应该就知道怎么回事了

3,好多goto啊,c++本来是要避免goto的,但以前就是觉得好用,而且没觉得有什么不妥!

唉,想想以前的自己是多么的无知啊,不过有位名人不是说过嘛,生活就是不断发现以前的自己是一个SB的过程,虽然不知道谁说的,不过我想学习也是如此!

贪吃蛇c++实现