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

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,我可以为您提供一个简单的贪吃蛇实现思路和部分代码。 首先,您需要使用 Qt 框架创建一个新的 C++ 项目。然后,您需要创建一个 Snake 类来表示贪吃蛇的状态和行为。这个类应该包含以下属性: - 当前蛇的长度 - 当前蛇的位置 - 当前蛇的方向 - 当前蛇的速度 - 当前蛇的身体部分 贪吃蛇的主要行为包括: - 移动:根据当前方向和速度移动蛇的位置 - 改变方向:根据用户输入改变蛇的方向 - 食物:如果蛇的头部碰到了食物,就将其加入到蛇的身体,并增加蛇的长度 - 碰撞检测:检测蛇是否与边界或自己的身体碰撞,如果是,则游戏结束 下面是一个简单的 Snake 类的实现: ```cpp class Snake { public: Snake(int x, int y, int length, int speed){ // 初始化蛇的位置、长度和速度 } void move(){ // 根据当前方向和速度移动蛇的位置 } void changeDirection(Direction direction){ // 根据用户输入改变蛇的方向 } void eatFood(Food food){ // 如果蛇的头部碰到了食物,就将其加入到蛇的身体,并增加蛇的长度 } bool isGameOver(){ // 检测蛇是否与边界或自己的身体碰撞,如果是,则游戏结束 } private: int m_x; int m_y; int m_length; int m_speed; Direction m_direction; QList<QPoint> m_body; }; ``` 在主窗口,您需要创建一个 QTimer 对象来定期更新游戏状态。在每次定时器超时时,您需要更新蛇的位置、检测是否到了食物、检测是否游戏结束等。您还需要在窗口绘制蛇和食物的位置。下面是一个简单的 MainWindow 类的实现: ```cpp class MainWindow : public QMainWindow { public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 设置窗口大小、标题等 // 创建游戏场景和蛇对象 // 创建定时器,设置定时器超时信号的槽函数 } private slots: void updateGame(){ // 更新蛇的位置、检测是否到了食物、检测是否游戏结束等 // 绘制蛇和食物的位置 } private: QGraphicsScene *m_scene; Snake *m_snake; QTimer *m_timer; }; ``` 这只是一个简单的贪吃蛇实现思路,您可以根据需要进行修改和扩展。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值