贪吃蛇

C尝试写的贪吃蛇项目(数组实现)

以后会更新用链表实现贪吃蛇
#define  _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <string.h>
using namespace std;


//PlaySound()函数所需的头文件
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")


#define DEF_SNAKE_LENGTH 20
char c_arrBackground[20][48] =      //一个■占据两个字符的位置。
{

"■■■■■■■■■■■■■■■■■■■■■■■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■■■■■■■■■■■■■■■■■■■■■■■\n"

};

//蛇数组
int g_arrSnake[DEF_SNAKE_LENGTH][3] = { 0 };

//方向
enum {to_east=2,to_west=-2,to_north=-1,to_south=1};
//蛇的方向
int g_Snakedir = to_west;
//食物产生的位置
int food_Line;
int food_Lie;
//蛇长度
int g_lengthSnake = 2;
//食物是否存在
bool isfood = true;
int g_score = 0;





//显示首页☆
void firstPage();
//播放音乐
void MyplaySound();
//检测空格
void TestPace();
//游戏画面  边界
void ShowWallGame();
void ShowWallGame2();
//为蛇产生一个随机的位置
void SetSnakepose();
//画蛇
void DrawSnake();
//蛇动
void SnakeMove();
//销毁蛇
void desary();
//改变蛇反向
void Changedir();
void Changedir1();
//s蛇死亡判断
bool isSnakedie();
//产生食物
void food();
//蛇长大
void groupSnake();
//分数
void grade();


int main()
{

	//显示首页
	firstPage();
	//播放音乐  需要加入<mmsystem.h>  #pragma comment(lib,"winmm.lib"); #<windows.h>
	MyplaySound();
	//检测空格
	TestPace();
	//停止播放音乐
	//PlaySound(NULL, 0, 0);
	//游戏界面 清屏
	system("cls"); 
	//游戏界面 边框
	//ShowWallGame();
    ShowWallGame2();
	//随机显示蛇
	SetSnakepose();
	//产生新食物


	
	while(1)
	{
		system("cls");
		
		//改变方向
		Changedir();
		//产生食物
		food();
		//蛇长大
		groupSnake();
		

		//判断蛇是否死亡
		if (false == isSnakedie())
		{
			
			printf("蛇死亡\n");
			break;
		}
		//蛇动
		SnakeMove();
		
		//显示背景
        ShowWallGame2();
		//分数
		grade();
		Sleep(500);
	}
	
	
	
	
	system("pause");
	return 0;

}

//显示首页
void firstPage()
{
	printf("\n\n\n\n\n");
	printf("              《《欢迎进入贪吃蛇的界面》》\n");
	printf("                      按空格开始游戏\n");
	printf("                    按w s a d控制蛇\n");

}
//播放音乐
void MyplaySound()
{
	//PlaySound("E:/aa.wav", NULL, SND_FILENAME | SND_ASYNC);
}

//检测空格
void TestPace()
{
	char chinput;
	while (1)//按空格键停止播放音乐
	{
		chinput = _getch(); //_getch和getcar();有区别  不会显示在控制台上 需要加入头文件<conio.h>
		if (' ' == chinput)
		{
			break;
		}
	}
}

//画背景
void ShowWallGame()
{
	int i = 0, j = 0;
	int g_arrBackground[20][23] =      //一个■占据两个字符的位置。
	{
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
	};

	while (1)
	{
		system("cls");
		for (i = 0; i < 20; i++)
		{
			for (j = 0; j < 23; j++)
			{
				if (1 == g_arrBackground[i][j])
				{
					printf("■");
				}
				else
					printf("  ");
			}
			printf("\n");
		}
		Sleep(1000);  //需要一个头文件<windows.h>
	}


}

//画背景 重点
void ShowWallGame2()
{
	    int i;
		for (i = 0; i < 20; i++)
		{

			printf(c_arrBackground[i]);
		}
}

//随机产生蛇的位置
void SetSnakepose()
{
	int nx=-1;
	int ny=-1;

	
	//产生随机数
	srand((unsigned int)time(NULL)); //time  需要头文件<time.h>
	nx = rand() % 18 + 1;  //1-19范围
	ny = rand() % 17 + 1;  //1-18范围


	//初始化蛇的节点
	g_arrSnake[0][0]=ny;   //行
	g_arrSnake[0][1]=nx*2; //列
	g_arrSnake[0][2]= to_west;

	g_arrSnake[1][0] = ny;   //行
	g_arrSnake[1][1] = nx * 2+2; //列
	g_arrSnake[1][2] = to_west;

	g_arrSnake[2][0] = ny;   //行
	g_arrSnake[2][1] = nx * 2+4; //列
	g_arrSnake[2][2] = to_west;

	//画到背景上
	DrawSnake();

}



void DrawSnake()
{
	int i;
	
	for (i = 0; g_arrSnake[i][0] != 0; i++)
	{
		strncpy(&c_arrBackground[g_arrSnake[i][0]][g_arrSnake[i][1]], "■", 2);
	}
}


//蛇动
void SnakeMove()
{
	int i = DEF_SNAKE_LENGTH - 1;

	//销毁蛇
	desary();

	for (i; i >= 1; i--)
	{
		if (0 == g_arrSnake[i][0])
		{
			continue;
		}
		g_arrSnake[i][0] = g_arrSnake[i - 1][0];
		g_arrSnake[i][1] = g_arrSnake[i - 1][1];
		g_arrSnake[i][2] = g_arrSnake[i - 1][2];
	}
	//处理蛇头
	g_arrSnake[0][2] = g_Snakedir;

	if (to_west == g_arrSnake[0][2] || to_east == g_arrSnake[0][2])
	{
		g_arrSnake[0][1] += g_arrSnake[0][2];
	}
	else
	{
		g_arrSnake[0][0] += g_arrSnake[0][2];
	}


	//画蛇
	DrawSnake();
}

//销毁蛇
void desary()
{
	int i;
	for ( i = 0; g_arrSnake[i][0] != 0; i++)
	{
		strncpy(&c_arrBackground[g_arrSnake[i][0]][g_arrSnake[i][1]], "  ", 2);
	}
}


void Changedir()
{
	if (GetAsyncKeyState('W'))
	{
		if (g_arrSnake[0][2] != to_south)
		{
            g_Snakedir = to_north;
		}	
	}
	else if (GetAsyncKeyState('S'))
	{
		
		if (g_arrSnake[0][2] != to_north)
		{
			g_Snakedir = to_south;
		}
	}
	else if (GetAsyncKeyState('A'))
	{
		if (g_arrSnake[0][2] != to_east)
		{
			g_Snakedir = to_west;
		}
		
	}
	else if (GetAsyncKeyState('D'))
	{
		if (g_arrSnake[0][2] != to_west)
		{
			g_Snakedir = to_east;
		}
		
	}
}

void Changedir1()
{
	_getch();
}

//蛇死亡判断
bool isSnakedie()
{
	if (to_west == g_arrSnake[0][2] || to_east == g_arrSnake[0][2])
	{
		//比较蛇头的下一个
		if (0==strncmp(&c_arrBackground[g_arrSnake[0][0]][g_arrSnake[0][1] + g_arrSnake[0][2]],"■",2))
		{
			return false;
		}		
	}
	else if (0 == strncmp(&c_arrBackground[g_arrSnake[0][0] + g_arrSnake[0][2]][g_arrSnake[0][1] ], "■", 2))
		{
			return false;
		}		

	return true;

}


//产生食物
void food()
{
	srand((unsigned int)time(NULL));

	int i = 0;
	if (isfood == false)
	{
		return;
	}
	

	while (1)
	{
	bool flog = true;
	food_Line = rand() % 17 + 1;
	food_Lie = rand() % 20 + 1;

	for (i = 0; g_arrSnake[i][0] != 0; i++)
	{
		if (food_Line == g_arrSnake[i][0] && food_Lie == g_arrSnake[i][1])
		{
			flog = false;
			break;
		}
	}
	if (flog == true)
	{
		break;
	}
	}
	strncpy(&c_arrBackground[food_Line][food_Lie*2], "☆", 2);
	isfood = false;
}

//蛇长大
void groupSnake()
{
	if (food_Line == g_arrSnake[0][0] && food_Lie * 2 == g_arrSnake[0][1])
	{
		if (g_arrSnake[g_lengthSnake][2] == to_east)
		{
			g_arrSnake[g_lengthSnake + 1][0] = g_arrSnake[g_lengthSnake][0];
			g_arrSnake[g_lengthSnake + 1][1] = g_arrSnake[g_lengthSnake][1]-2;
			g_arrSnake[g_lengthSnake + 1][2] = g_arrSnake[g_lengthSnake][2];
		}
		else if (g_arrSnake[g_lengthSnake][2] == to_west)
		{
			g_arrSnake[g_lengthSnake + 1][0] = g_arrSnake[g_lengthSnake][0];
			g_arrSnake[g_lengthSnake + 1][1] = g_arrSnake[g_lengthSnake][1] + 2;
			g_arrSnake[g_lengthSnake + 1][2] = g_arrSnake[g_lengthSnake][2];
		}
		else if (g_arrSnake[g_lengthSnake][2] == to_north)
		{
			g_arrSnake[g_lengthSnake + 1][0] = g_arrSnake[g_lengthSnake][0]+1;
			g_arrSnake[g_lengthSnake + 1][1] = g_arrSnake[g_lengthSnake][1];
			g_arrSnake[g_lengthSnake + 1][2] = g_arrSnake[g_lengthSnake][2];
		}
		else if (g_arrSnake[g_lengthSnake][2] == to_south)
		{
			g_arrSnake[g_lengthSnake + 1][0] = g_arrSnake[g_lengthSnake][0]-1;
			g_arrSnake[g_lengthSnake + 1][1] = g_arrSnake[g_lengthSnake][1];
			g_arrSnake[g_lengthSnake + 1][2] = g_arrSnake[g_lengthSnake][2];
		}
		g_lengthSnake++;
		isfood = true;
		g_score++;
	}
}
//分数
void grade()
{
	COORD rd;
	rd.X = 55;
	rd.Y = 8;
	//设置光标位置
//	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), rd);
	printf("分数:");

	rd.X = 56;
	rd.Y = 9;
	//设置光标位置
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), rd);
	printf("%d",g_score);

}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值