贪吃蛇(c++)

这是看了一个网友的C++版的贪吃蛇之后而写的,有一些思想来源于他的代码,后来总共写了三四次,这三次都是有一些大的改动,每次都有一些新的想法,使得程序的可运行性以及美观性都有所进步,由于在控制台上运行,所以界面的美观性总是有限的,只是让控制台的界面更适合我们的眼睛而已,最初的界面闪动的厉害,还有运行中的崩溃问题,后来主要针对这两个方面进行改动,而且还增加了一些辅助信息以及辅助功能,并且解决了后来发现的内存泄露问题,后期还会对这个小程序进行改动,想法是让它更适合于我们的使用习惯,例如以文件的形式保存玩家信息,或者再改写成界面化的程序等,好了废话就这么多,下面把代码贴上来。
/
//                   下面是贪吃蛇的代码                        //     
/
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>

static int grade=0;       // grade表示已吃食物的个数
static int y(1),f(0);          // f表示蛇的长度
char n;	                  // 成绩辅助选项

void gotoxy(int x,int y)  // 光标定位函数,用于控制蛇的打印
{	
   COORD c;   
   c.X = 2*y;   
   c.Y = x;   
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}

class snode
{
public:
	int x,y;
	char a[20][20];
public:
	void Init()      //初始化
	{
		for(x=0;x<=19;x++)
		for(y=0;y<=19;y++)
		{
			if(x==0||x==19||y==0||y==19)
				*(*(a+x)+y)=14;
			else 
				*(*(a+x)+y)=' ';
		}
	}
	void print()        //初始化界面
	{
		for(x=0;x<=19;x++)
		{
			for(y=0;y<=19;y++)
				cout<<a[x][y]<<" ";
			if(x==2||x==10||x==17)
				cout<<"     +**************************+";
			if((x>2&&x<10)||(x>10&&x<17))
				cout<<"     |                          |";
			cout<<endl;
		}
		gotoxy(5,23);	cout<<"     ★ 分数:0"<<endl;
	    gotoxy(12,23);	cout<<"     ★ 制作者:阿杰"<<endl;
		gotoxy(13,23);	cout<<"     ★ 若发现BUG"<<endl;
		gotoxy(14,23);	cout<<"  请联系QQ1306232783 谢谢"<<endl;
		gotoxy(15,23);	cout<<"     ★ 祝你玩的开心~.~"<<endl;
	}
}S;

class snake
{
public:

	snake *prior,*next;
	snake(int a,int b)
	{
		x=a;
		y=b;
	}
	int get_x()			//获取x坐标
	{
		return x;
	}
	int get_y()			//获取y坐标
	{
		return y;
	}
	void add_node(int a,int b)		//增加头结点
	{
		snake *q=new snake(a,b);
		q->next=head;
		q->prior=NULL;
		if(head)
			head->prior=q;		
		if(!tail)
			tail=head; 
		head=q;
		gotoxy(a,b);
		cout<<'*'<<endl;
	}
	void delete_node()				//删除尾节点
	{
		snake *tr=tail;
		tail=tr->prior;
		tail->next=NULL;
		gotoxy(tr->get_x(),tr->get_y());
		cout<<' '<<endl;			
		delete tr;
	}	
private:	
	int x,y;

}*head=NULL,*tail=NULL,*t;

class move
{
public:
	void moving(char ky)			// ky获取按键
	{
		int a,b;		
		a=head->get_x();
		b=head->get_y();
	    if(ky=='a'&&key=='d')
			key='d';
		else if(ky=='w'&&key=='s')
			key='s';
		else if(ky=='s'&&key=='w')
			key='w';
		else if(ky=='d'&&key=='a')
			key='a';
		else key=ky;

		switch(key)
		{
		case 'w':
			--a; 
			break;
		case 's':
			++a; 
			break;
		case 'a':
			--b; 
			break;
		case 'd':
			++b; 
			break;
		default:
			break;
		}
	
		panduan(a,b);

		if(a==food_x && b==food_y)  	//吃到食物增加头结点,并随机下一次的食物
		{
			head->add_node(a,b);
			grade++;
			f++;
			food();
		}
		else
		{
			head->add_node(a,b);
			head->delete_node();
		}
	}

	void panduan(int a,int b)
	{
		t=head;
		for(int i=0;i<f;i++)			//对蛇进行遍历,判断是否撞到了自己
		{
			if((a==t->get_x())&&(b==t->get_y())) 
			{
				gotoxy(7,23);
				cout<<" ★ 你撞了自己 程序结束!"<<endl;
				gotoxy(21,0);
				cout<<"按任意键退出..."<<endl;
				getch();
				exit(0);		  
			}
			t=t->next;
		}

		if(a==0||a==19||b==0||b==19)   //判断是否撞墙
		{
			gotoxy(7,23);
			cout<<" ★ 你撞到了墙 程序结束!"<<endl;
			gotoxy(21,0);
			cout<<"按任意键退出..."<<endl;
			getch();
			exit(0);		
		}
	}	

	void food()
	{
		char d=2;
		int flag=0;		
		food_x=rand()%18+1;
		food_y=rand()%18+1;
		t=head;
		for(int i=0;i<f;i++)	//对蛇进行遍历,判断食物是否出现在蛇身上
		{
			if((food_x==t->get_x()) && (food_y==t->get_y())) 
				flag=1;
			t=t->next;
		} 
		if(flag==1)	
			food();
		else		
		{
			gotoxy(food_x,food_y);
			cout<<d<<endl;
		}
	}

private:
	int food_x,food_y;
	char key;
}ss;

int menu()
{	
	cout<<"\n\n\n\n\t来挑战贪吃蛇游戏吧!\n\n\t规则是w s a d控制上下左右\n\n\t★★注意请严格按照wsad控制方向★★"<<endl;
	cout<<"\n\t请选择难度:\n\n\t  1.简单难度(建议)\n\t  2.中等难度\n\t  3.专家难度(不建议)"<<endl;
	cout<<"\n\t请输入你的选择:>";
	while(1)
	{
		n=getch();
		switch(n)
		{
			case '1':
				return 300;
			case '2':
				return 200;
			case '3':
				return 100;
			default:
				break;
		}
		gotoxy(16,12);
	}
}

int main()
{
	srand(time(NULL));
	int k;
	S.Init();	
	int speed=menu();
	system("cls");
	S.print();
	head->add_node(6,6);
	ss.food();
	while(1)
	{
		k=_getch();
		while(!_kbhit())
		{
			ss.moving(k);
			gotoxy(5,30);
			cout<<grade*100*(n-'0')<<endl;
			Sleep(speed);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值