在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++游戏开发 → 经典贪吃蛇游戏(有源代码)

经典贪吃蛇游戏(有源代码)

C/C++游戏开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:9.65KB
  • 下载次数:23
  • 浏览次数:198
  • 发布时间:2020-10-07
  • 实例类别:C/C++游戏开发
  • 发 布 人:王平
  • 文件格式:.cpp
  • 所需积分:10
 相关标签: 经典 游戏 c++ 有源码 有趣

实例介绍

【实例简介】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);//设置控制台光标状态
 
}


实例下载地址

经典贪吃蛇游戏(有源代码)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警