• 贪吃蛇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的过程,尽管不知道谁说的,只是我想学习也是如此!

  • 相关阅读:
    六种常见排序算法的自我研究(冒泡排序,选择排序,快速排序,归并排序,插入排序,堆排序)
    设计模式学习总结(二)工厂模式
    SQL Server Reporting Service(SSRS) 第七篇 常见错误汇总
    SQL Server Reporting Service(SSRS) 第六篇 SSRS 部署总结
    设计模式学习总结(一)简单工厂模式
    设计模式学习总结(三)抽象工厂模式
    设计模式学习总结(四)单例模式
    SQL Server覆盖索引--有无包含列对数据库查询性能的影响分析
    Dev Express Report 学习总结(八)Dev Express Reports 常见问题总结
    docker命令笔记
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6881715.html
Copyright © 2020-2023  润新知