基本信息
源码名称:经典贪吃蛇游戏(有源代码)
源码大小:9.65KB
文件格式:.cpp
开发语言:C/C++
更新时间:2020-10-07
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 10 元 
   源码介绍

C 经典贪吃蛇小游戏【有源代码】

                   彩色界面,无需图形库!


等。。。【许多情况】


int main()
{
	int olddirection='w'; //初始键盘信号
	int newdirection =0;//获取键盘信号
	init();//初始化
 
	setmouth(60, 0);
	setcolour(0xF0);
	printf("\n得分:");
	printf("%d\n", snacklength - 3);
	printf("请切换为英文输入法\n");
	printf("W A S D键分别表示:上 左 下 右\n");
	
	while (1) {
		if (_kbhit()) {  //检测缓冲区中是否有数据
			newdirection = tolower(_getch());  //将缓冲区中的数据以字符的形式读出
			if (newdirection == 27) {
				break;
			}
			else {
				//获取小蛇新的移动方向
				newdirection=movedire(olddirection, newdirection);
				if (newdirection != olddirection)
				{
					olddirection = newdirection;
				}
			}
		}
		screenRefresh(newdirection);
	}
	return 0;
}
//更新得分
void updategoal()
{
	setcolour(0xF0);
	setmouth(60, 0);
	printf("\n得分:%d", snacklength - 3);
	if(snacklength==33)
	{
		MessageBox(NULL,"恭喜你,成功得到“探花”称号","恭喜你,成功得到“探花”称号",MB_OK);
	}
	if(snacklength==53)
	{
		MessageBox(NULL,"恭喜你,成功得到“榜眼”称号","恭喜你,成功得到“榜眼”称号",MB_OK);
	}
	if(snacklength==103)
	{
		MessageBox(NULL,"恭喜你,成功得到“状元”称号","恭喜你,成功得到“状元”称号",MB_OK);
	}
	if(snacklength==153)
	{
		MessageBox(NULL,"恭喜你,欢迎再来游玩","恭喜你,欢迎再来游玩",MB_OK);
		exit(0); 
	}
}
//碰撞检测
int checksnack(int newdirection)
{
	switch (newdirection)
	{
	case 'w':
		if ((show[SnackSite[snackhead].x - 1][SnackSite[snackhead].y].kind)==1)
		{
			snackdie();
			return 0;
		}else if((show[SnackSite[snackhead].x - 1][SnackSite[snackhead].y].kind) == 4)
		{
			snackdie();
			return 0;
		}
		else if ((show[SnackSite[snackhead].x - 1][SnackSite[snackhead].y].kind) == 3)
		{
			return 1;
		}
		else {
			return 2;
 
		}
		break;
	case 's':
		if ((show[SnackSite[snackhead].x   1][SnackSite[snackhead].y].kind) == 1)
		{
			snackdie();
			return 0;
		}
		else if ((show[SnackSite[snackhead].x   1][SnackSite[snackhead].y].kind) == 4)
		{
			snackdie();
			return 0;
		}
		else if ((show[SnackSite[snackhead].x   1][SnackSite[snackhead].y].kind) == 3)
		{
			return 1;
		}
		else {
			return 2;
		}
		break;
	case 'a':
		if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y-1].kind) == 1)
		{
			snackdie();
			return 0;
		}
		else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y-1].kind) == 4)
		{
			snackdie();
			return 0;
		}
		else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y-1].kind) == 3)
		{
			return 1;
		}
		else {
			return 2;
		}
		break;
	case 'd':
		if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y 1].kind) == 1)
		{
			snackdie();
			return 0;
		}
		else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y 1].kind) == 4)
		{
			snackdie();
			return 0;
		}
		else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y 1].kind) == 3)
		{
			return 1;
		}
		else {
			return 2;
		}
		break;
 
	}
}
 
//创建新食物
void newfood()
{
	srand((unsigned)time(NULL));
	FoodSite.x = rand() % 38   1;
	FoodSite.y = rand() % 38   1;
}
 
//刷新屏幕
void screenRefresh(int newdirection)
{
	int re = 0;
	int i = 0;
	re = checksnack(newdirection);
	snackmove(newdirection, re);
	background();
	show[FoodSite.x][FoodSite.y] = food;
	for (i = 0; i <= snackhead; i  )
	{
		if (i == snackhead) {
			show[SnackSite[i].x][SnackSite[i].y] = snack;
			show[SnackSite[i].x][SnackSite[i].y].colour = 0x75;
 
		}
		else {
			show[SnackSite[i].x][SnackSite[i].y] = snack;
		}
		
	}
	
	showing();
	if (re == 1)
	{
		snacklength  ;
		updategoal();
		newfood();
	}
 
 
}
/*********************************************
				获取最新的方向
**********************************************/
int movedire(int olddirection, int newdirection)
{
	if (newdirection == 'w' || newdirection == 'a' || newdirection == 's' || newdirection == 'd')
	{
 
		return newdirection;
	}
	else {
		return olddirection;
	}
 
}
 
/**********************************
          展示最新的show
*********************************/
 
void showing()
{
	int line, lie;
	for (line = 0; line < MaxLine; line  )
	{
		for (lie = 0; lie < MaxLie; lie  )
		{
			setmouth(line, lie);
			setcolour(show[line][lie].colour);
			printf("%s",show[line][lie].display);
 
		}
	}
 
}
 
/******************************************
			小蛇死亡
*******************************************/
 
 
void snackdie()
{
	setmouth(20, 5);
	printf("Game over! 按任意键重新开始游戏!");
	getch();
	system("cls");
	int olddirection='w'; //初始键盘信号
	int newdirection =0;//获取键盘信号
	init();//初始化
	setmouth(60, 0);
	setcolour(0xF0);
	printf("\n得分:");
	printf("%d\n", snacklength - 3);
	printf("请切换为英文输入法\n");
	printf("W A S D键分别表示:上 左 下 右\n");
	
	while (1) {
		if (_kbhit()) {  //检测缓冲区中是否有数据
			newdirection = tolower(_getch());  //将缓冲区中的数据以字符的形式读出
			if (newdirection == 27) {
				break;
			}
			else {
				//获取小蛇新的移动方向
				newdirection=movedire(olddirection, newdirection);
				if (newdirection != olddirection)
				{
					olddirection = newdirection;
				}
			}
		}
		screenRefresh(newdirection);
	}
}
 
//小蛇移动
void snackmove(int newdirection,int re)
{
	int i = 0;
	
	switch (newdirection)
	{
	case 'w':
		for (i = 0; i < snackhead;i =1) {
			SnackSite[i].x = SnackSite[i   1].x;
			SnackSite[i].y = SnackSite[i   1].y;
		}
		SnackSite[snackhead].x -= 1;
		if (re == 1)
		{
			snackhead  = 1;
			SnackSite[snackhead].x = SnackSite[snackhead-1].x-1;
			SnackSite[snackhead].y = SnackSite[snackhead - 1].y;
 
		}
		break;
	case 's':
		for (i = 0; i < snackhead; i =1) {
			SnackSite[i].x = SnackSite[i   1].x;
			SnackSite[i].y = SnackSite[i   1].y;
		}
		SnackSite[snackhead].x  = 1;
		if (re == 1)
		{
			snackhead  = 1;
			SnackSite[snackhead].x = SnackSite[snackhead - 1].x   1;
			SnackSite[snackhead].y = SnackSite[snackhead - 1].y;
 
		}
		break;
	case 'a':
		for (i = 0; i < snackhead; i =1) {
			SnackSite[i].x = SnackSite[i   1].x;
			SnackSite[i].y = SnackSite[i   1].y;
		}
		SnackSite[snackhead].y -= 1;
		if (re == 1)
		{
			snackhead  = 1;
			SnackSite[snackhead].x = SnackSite[snackhead - 1].x ;
			SnackSite[snackhead].y = SnackSite[snackhead - 1].y-1;
 
		}
		break;
	case 'd':
		for (i = 0; i < snackhead; i =1) {
			SnackSite[i].x = SnackSite[i   1].x;
			SnackSite[i].y = SnackSite[i   1].y;
		}
		SnackSite[snackhead].y  = 1;
		if (re == 1)
		{
			snackhead  = 1;
			SnackSite[snackhead].x = SnackSite[snackhead - 1].x;
			SnackSite[snackhead].y = SnackSite[snackhead - 1].y 1;
 
		}
		break;
 
	}
 
}
 
 
 
//初始食物
 
 
void startfood()
{
	FoodSite.x = 5;
	FoodSite.y = 10;
	show[5][10] = food;
}
//初始小蛇
 
void startsnack()
{
	SnackSite[0].x = 35;
	SnackSite[0].y = 13;
	SnackSite[1].x = 35;
	SnackSite[1].y = 12;
	SnackSite[2].x = 35;
	SnackSite[2].y = 11;
	show[35][11] = snack;
	show[35][11].colour = 0x75;
	show[35][12] = snack;
	show[35][13] = snack;
}
 
/*******************************
	初始化生成show结构体数组
*******************************/
 
void init()
{
	//设置窗口大小
	system("mode con:cols=80 lines=43");
	//隐藏光标
	hidemouth();
	//生成背景图
	background();
	//创建初始食物
	startfood();
	//创建初始小蛇蛇体
	startsnack();
	//显示
	showing();
}
 
 
/**************************************
			生成背景图
**************************************/
void background()
{
	int line, lie;
	for (line = 0; line < MaxLine; line  )
	{
		for (lie = 0; lie < MaxLie; lie  )
		{
			setmouth(line, lie);
			if (lie == 0 || lie == MaxLie-1 || line == 0 || line == MaxLine-1) {
				show[line][lie] = wall;
			}
			else {
				show[line][lie] = livearea;
			}
			
		}
	}
}
 
/********************************
		定义光标位置
*********************************/
 
void setmouth(int x, int y)
{
	COORD coord;
	coord.X = y*2;  //第3列
	coord.Y = x;  //第3行
	//获取控制台缓冲区句柄
	HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
	//设置光标位置
	SetConsoleCursorPosition(ConsoleHandle, coord);
}
 
//设置种类的颜色
void setcolour(int a)
{
		HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleTextAttribute(hConsole, a);	
}
 
 
//隐藏光标
void hidemouth()
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
	CursorInfo.bVisible = 0; //隐藏控制台光标
	SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
 
}