2024年最全贪吃蛇基础·框架版(简单)开头有原码_贪吃蛇小游戏框架图(2),2024年最新大数据开发开发避坑指南

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

printf("用上,下,左,右箭头分别控制方向");	

gotoXY(64,20);
printf("F1键加速,F2键减速");

gotoXY(64,22);
printf("空格键暂停游戏");

gotoXY(64,24);
printf("Esc键退出游戏");

}

int biteSelf()
{
snake *self;//这里不涉及内存分配,它只是涉及只向的内容的变化
self=head->next;
while(self!=NULL)
{
//TODO
if(self->xhead->x&&self->yhead->y)
{
return 1;
}
self = self->next;
}
return 0;
}

int cantCrossWall(){
if(head->x0||head->x56||head->y0||head->y26)
{
system(“cls”);
gotoXY(30,6);
printf(“撞墙了”);
return 1;
}
return 0;
}

int snakeMove()
{
snake *newNode;

newNode = (snake*)malloc(sizeof(snake));
if(status==U)
{
	newNode->x=head->x;
	newNode->y=head->y-1;
}
if (status == D) {
	newNode->x = head->x;
	newNode->y = head->y + 1;
}
if (status == L) {
	newNode->x = head->x - 2;
	newNode->y = head->y;
}
if (status == R) {
	//TODO
	newNode->x = head->x + 2;
	newNode->y = head->y;
}

	newNode->next=head;
	//将新的结点赋值给head 
	head=newNode;
	if(cantCrossWall())
	{
			status = 0;
			endGame();
			return 3;
	} 
	
	//判断新的结点是否有食物
	q=head;
	if(newNode->x==food->x&&newNode->y==food->y)
	{
		while(q!=NULL)
		{
			//TODO
			gotoXY(q->x,q->y);
			color(14);
			printf("◆");
			q=q->next;
		}
		//吃掉食物过后总分要加上单个食物的分值 
		sumScore+=add;
		//调用一次
		screenTips(); 
		//食物被吃掉了,再创建一个
		createFood(); 
		
	} else{
	        while(q->next->next!=NULL)
				{
					//TODO
					gotoXY(q->x,q->y);
					color(14);
					printf("◆");
					q=q->next;
				}
				//把倒数第一个变成原来的地图形状
				gotoXY(q->next->x,q->next->y);
				color(3);
				printf("■");
				//释放内存和指针
				free(q->next);
				q->next=NULL; 
          }
          if(biteSelf()==1)
          {
		  	endGame(); 
			  return 2; 
		  }
return 0;

}

void keyboardControl()
{
status =R;//默认向右走 *
while(1)
{
//TODO
//侦听所有键盘事件状态
if(GetAsyncKeyState(VK_UP)&&status !=D)
{
//需要一个变量,来接收是哪个键按下去了
status =U;
}else if(GetAsyncKeyState(VK_DOWN)&&status !=U)
{
status=D;
}
else if(GetAsyncKeyState(VK_LEFT)&&status !=R)
{
status=L;
}
else if(GetAsyncKeyState(VK_RIGHT)&&status !=L)
{
status=R;
}
//空格键游戏暂停,蛇停止运动
if(GetAsyncKeyState(VK_SPACE))
{
//TODO
//第一次按空格键,进程挂起,
while(1)
{
Sleep(300);
//第二次空格键,进程退出
if(GetAsyncKeyState(VK_SPACE))
{
break;
}
}//按下ESC键,游戏结束
} else if(GetAsyncKeyState(VK_ESCAPE)){
endGameStatus=3;
endGame();
break;
}
Sleep(300);
//让蛇动起来
if(snakeMove()!=0)
{
break;
}
}
}

void createFood()
{
snake* food1;
food1=(snake*)malloc(sizeof(snake));
//加上随机数种子,防止伪随机
srand((unsigned)time(NULL));
food1->x=rand()%53+2;//2.54没听懂?问问
//【2~54】
while(food1->x%2!=0)
{
//TODO
food1->x=rand()%53+2;
}
food1->y=rand()%23+1;//?2.58
//food1->next=NULL;?
q=head;
while(q->next!=NULL)
{
if(q->xfood1->x&&q->yfood1->y)
{
free(food1);
createFood();//如果和蛇身重合了,就再次创建食物
}
q=q->next;
}
//把食物打出来
gotoXY(food1->x,food1->y);
color(10);
printf(“●”);
food=food1;
}

void initSnake()
{
int i=1;
color(15);
snake ss;//结点
//分配内存空间,使用头插法(单链表),以设定的x,y位置开始插入
ss =(snake
)malloc(sizeof(snake));//?
ss->x=24;
ss->y=5;
ss->next=NULL;
//利用头插法,插入剩下的四个结点
for(i=1;i<=4;i++)
{
head=(snake*)malloc(sizeof(snake));
head->next=ss;
head->x=24+i*2;
head->y=5;
ss=head;//将蛇头变成蛇尾,然后重复循环
}
//打印蛇身
while(ss!=NULL)
{
//TODO
gotoXY(ss->x,ss->y);
printf(“◆”);
ss=ss->next;
}
}

int color(int x)
{
//更改待打印颜色属性
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
return 0;
}

void gotoXY(int a,int b)
{
COORD c;//生成c的实例
c.X=a;
c.Y=b;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
//函数定义/函数实现
void createMap()
{
int i,j;
color(6);//0~255
//两个for填边框的色
for(i=0;i<58;i+=2)
{
gotoXY(i,0);
printf(“□”);
gotoXY(i,26);
printf(“□”);
}
for(i=1;i<26;i++)
{
gotoXY(0,i);
printf(“□”);
gotoXY(56,i);
printf(“□”);
}
//填中间的色
color(3);
for(i=2;i<56;i+=2)
{
for(j=1;j<26;j++)
{
gotoXY(i,j);
printf(“■”);
}
}

}

int main()
{
//设置控制台的宽高
system(“mode con cols=110 lines=30”);
printsnake();
welcometoGame();
while(1)
{

	} 
return 0;

}




---


## 首先的首先,这次我编译器是下面这个(需要安装包,请私信Q一下小喵),养成一个好习惯。


![](https://img-blog.csdnimg.cn/f2904831050546408e4d80acf7046a77.png)


 好习惯:


![](https://img-blog.csdnimg.cn/dc7e4267b747414992370a87431628bf.png)


一切以整体原代码为准,图片介绍仅供参考。没完成一步,建议编译一下,进行阶段性测试,这是一个非常实用的习惯,可以把bug缩小到子程序的范围,保证800来行代码的完成效率,谢谢。


小喵觉得图片能更加直观的展示代码(颜色有直观的区别),便于侦错,但csdn系统希望小喵有更完善的描述,所有小喵会附上局部代码,仅供侦错,难免重复,麻烦谅解,水一水字数了。




---


## 窗口设置


![](https://img-blog.csdnimg.cn/91c377f8230b4956af28090e8bc5d90c.png)


![](https://img-blog.csdnimg.cn/e595945bcf544035afe5c52150eaaafa.png)




---


## 地图绘制


![](https://img-blog.csdnimg.cn/d13ffa0399974918a344331390892668.png)


局部代码(仅供侦错)



void gotoXY(int a,int b)
{
COORD c;//生成c的实例
c.X=a;
c.Y=b;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
//函数定义/函数实现
void createMap()
{
int i,j;
color(6);//0~255
//两个for填边框的色
for(i=0;i<58;i+=2)
{
gotoXY(i,0);
printf(“□”);
gotoXY(i,26);
printf(“□”);
}
for(i=1;i<26;i++)
{
gotoXY(0,i);
printf(“□”);
gotoXY(56,i);
printf(“□”);
}
//填中间的色
color(3);
for(i=2;i<56;i+=2)
{
for(j=1;j<26;j++)
{
gotoXY(i,j);
printf(“■”);
}
}

}


写一个颜色变换的函数


![](https://img-blog.csdnimg.cn/95b63ce3c9ac4ea29143fd2c0f0785a4.png)


进行阶段性测试


![](https://img-blog.csdnimg.cn/534c742d62d74f0091567526044a380d.png)


说明其中的函数


![](https://img-blog.csdnimg.cn/603caf73dc1043149b9bda0cc0b1671a.png)




---


## 蛇结点创建


![](https://img-blog.csdnimg.cn/3565270d673243a4aadaf941dcf62bac.png)


![](https://img-blog.csdnimg.cn/b1071fab69784f2eb05cba479a238891.png)



void initSnake()
{
int i=1;
color(15);
snake ss;//结点
//分配内存空间,使用头插法(单链表),以设定的x,y位置开始插入
ss =(snake
)malloc(sizeof(snake));//?
ss->x=24;
ss->y=5;
ss->next=NULL;
//利用头插法,插入剩下的四个结点
for(i=1;i<=4;i++)
{
head=(snake*)malloc(sizeof(snake));
head->next=ss;
head->x=24+i*2;
head->y=5;
ss=head;//将蛇头变成蛇尾,然后重复循环
}
//打印蛇身
while(ss!=NULL)
{
//TODO
gotoXY(ss->x,ss->y);
printf(“◆”);
ss=ss->next;
}
}


![](https://img-blog.csdnimg.cn/45ffd9f42ab645af8785b3c691426a24.png)




---


## 食物创建


![](https://img-blog.csdnimg.cn/548fc7dad6d1417a8dbc2eb4c3d3d0ca.png)



void createFood()
{
snake* food1;
food1=(snake*)malloc(sizeof(snake));
//加上随机数种子,防止伪随机
srand((unsigned)time(NULL));
food1->x=rand()%53+2;//2.54没听懂?问问
//【2~54】
while(food1->x%2!=0)
{
//TODO
food1->x=rand()%53+2;
}
food1->y=rand()%23+1;//?2.58
//food1->next=NULL;?
q=head;
while(q->next!=NULL)
{
if(q->xfood1->x&&q->yfood1->y)
{
free(food1);
createFood();//如果和蛇身重合了,就再次创建食物
}
q=q->next;
}
//把食物打出来
gotoXY(food1->x,food1->y);
color(10);
printf(“●”);
food=food1;
}





---


## 键盘事件侦听


![](https://img-blog.csdnimg.cn/327d69f5dab4463e8a0d335c5b1b5663.png)


## 



void keyboardControl()
{
status =R;//默认向右走
while(1)
{
//TODO
//侦听所有键盘事件状态
if(GetAsyncKeyState(VK_UP)&&status !=D)
{
//需要一个变量,来接收是哪个键按下去了
status =U;
}else if(GetAsyncKeyState(VK_DOWN)&&status !=U)
{
status=D;
}
else if(GetAsyncKeyState(VK_LEFT)&&status !=R)
{
status=L;
}
else if(GetAsyncKeyState(VK_RIGHT)&&status !=L)
{
status=R;
}
Sleep(500);
//让蛇动起来
snakeMove();
}
}


## 蛇的移动


![](https://img-blog.csdnimg.cn/432ba1468056439cb1b7ed17ef6e6c80.png)


![](https://img-blog.csdnimg.cn/ec8682d7c45b4a45a0afd9f5f5bad47c.png)  



//让蛇动起来
void snakeMove();

void snakeMove()
{
snake *newNode;

newNode = (snake*)malloc(sizeof(snake));
if(status==U)
{
	newNode->x=head->x;
	newNode->y=head->y-1;
}
if (status == D) {
	newNode->x = head->x;
	newNode->y = head->y + 1;
}
if (status == L) {
	newNode->x = head->x - 2;
	newNode->y = head->y;
}
if (status == R) {
	//TODO
	newNode->x = head->x + 2;
	newNode->y = head->y;
}

	newNode->next=head;
	//将新的结点赋值给head 
	head=newNode;
	//判断新的结点是否有食物
	q=head;
	if(newNode->x==food->x&&newNode->y==food->y)
	{
		while(q!=NULL)
		{
			//TODO
			gotoXY(q->x,q->y);
			color(14);
			printf("◆");
			q=q->next;
		}
		//食物被吃掉了,再创建一个
		createFood(); 
	} else{
	        while(q->next->next!=NULL)
				{
					//TODO
					gotoXY(q->x,q->y);
					color(14);
					printf("◆");
					q=q->next;
				}
				//把倒数第一个变成原来的地图形状
				gotoXY(q->next->x,q->next->y);
				color(3);
				printf("■");
				//释放内存和指针
				free(q->next);
				q->next=NULL; 
          }

}


 蛇是可以动起来了,但蛇撞墙后出bug,要进行进一步修改


![](https://img-blog.csdnimg.cn/b17176132ded4154b30a43647c27698c.png)


## 


##  屏幕提示


全局变量:


![](https://img-blog.csdnimg.cn/c21a746313864acfae7451e793b46ae2.png)


 子程序


![](https://img-blog.csdnimg.cn/a5fc82a3f3dc4b4ab9cd459d878ef129.png)



//主页面上小提示
void screenTips();

void screenTips(){
color(11);
gotoXY(64,4);
printf(“☆最高记录是:53☆”);
color(14);
gotoXY(64,6);
printf(“当前得分:20”);
gotoXY(73,11);
printf(“小提示”);

gotoXY(60,13);
color(6);
printf("§--------------------§");

gotoXY(60,26);
color(6);
printf("§--------------------§");

gotoXY(64,14);
color(3);
printf("每个食物得分:%d分",add);

gotoXY(64,16);
printf("不能撞墙,不能咬到自己");

gotoXY(64,18);
printf("用上,下,左,右箭头分别控制方向");	

gotoXY(64,20);
printf("F1键加速,F2键减速");

gotoXY(64,22);
printf("空格键暂停游戏");

gotoXY(64,24);
printf("Esc键退出游戏");

}


##  结束页面


#### 匹诺曹



void LostDraw() {
/*
失败界面
*/
system(“cls”);
int i;
gotoXY(45, 1);
color(6);
printf(" |-----| “); //匹诺曹的帽子
gotoXY(45, 2);
color(6);
printf(” | | “);
gotoXY(43, 3);
color(6);
printf(”-------------");

gotoXY(44, 4);
color(14);
printf("(");

gotoXY(47, 4);
color(15);
printf(" > <");				//眼睛

gotoXY(54, 4);
color(14);
printf(")");

gotoXY(17, 5);
color(11);
printf("+------------------------");	//上边框

gotoXY(35, 5);
color(14);
printf("oOOo");

gotoXY(39, 5);
color(11);
printf("----------");					//上边框

gotoXY(48, 5);
color(14);
printf("| |");				//鼻子
gotoXY(48, 6);
color(14);
printf("|_|");

gotoXY(51, 5);
color(11);
printf("----------");					//上边框

gotoXY(61, 5);
color(14);
printf("oOOo");

gotoXY(65, 5);
color(11);
printf("-----------------+");			//上边框

for (i = 6; i <= 19; i++) {				//竖边框
	gotoXY(17, i);
	printf("|");
	gotoXY(82, i);
	printf("|");
}

gotoXY(17, 20);
printf("+------------------------------------------");	//下边框

gotoXY(60, 20);
color(11);
printf("----------------------+");						//下边框

}


#### 结束页面实现及其子函数实现



void endGame()
{
//清屏操作
system(“cls”);
LostDraw();
if(endGameStatus1)
{
//TODO
gotoXY(35,9);
color(7);
printf(“对不起,你撞墙了!游戏结束”);
}else if(endGameStatus
2)
{
//TODO
gotoXY(35,9);
color(7);
printf(“对不起,你咬到自己了!游戏结束”);
}
else if(endGameStatus==3)
{
//TODO
gotoXY(35,9);
color(7);
printf(“游戏结束!”);
}
gotoXY(43,12);
printf(“你的得分是:%d分”,sumScore);
//判断得分是否需要存储
if(sumScore>=highScore)
{
color(10);
gotoXY(33,16);
printf(“创纪录了,最高分被你刷新了!”);
//最高分存入文件当中
File_In();
} else{
gotoXY(33,16);
printf(“继续努力吧~你离最高分还差:%d”,highScore-sumScore);
}
//调用选择选项
choose();

}

void choose()
{
int n=0;
gotoXY(30,23);
color(12);
printf(“重玩一局[1]”);
gotoXY(50,23);
printf(“溜了溜了[2]”);
gotoXY(43,25);
printf(“选择:”);
scanf(“%d”,&n);
switch(n)
{
case 1:
system(“cls”);
printsnake();
//开始界面
welcometoGame();
break;
case 2:
exit(0);
break;
default:
gotoXY(35,27);
color(12);
printf(“你输入的有误,请重新输入”);
break;

} 

}

//文件读写
void File_In()
{
//定义文件指针
FILE *fp;
//指针关联文件
fp=fopen(“save.txt”,“w+”);
//通过文件指针向文件写入内容
fprintf(fp,“%d”,sumScore);
//关闭文件
fclose(fp);
}

void File_Out()
{
FILE *pp;
pp=fopen(“save.txt”,“a+”);
fscanf(pp,“%d”,&highScore);
fclose(pp);

}


## 开始页面



/*
字符拼成英文图案
*/
void printsnake()
{
color(2);
printf(" \n");
printf(" __________ ___ \n");
printf(" / \ / \ \ |____ \ \n");
printf(" / ________ \ / ___ \ / __ | | / \n");
printf(" | | |__| / |
| / [|] |/ \n");
printf(" | | | | | / | \/ \n");
printf(" \ \_______ / \ |
/ ____ \n");
printf(" \ \ ____ ____ ____ __ | | ___ ______ \n");
printf(" \
______ \ | |/ \ / \/ / | | / / / \ \n");
printf(" \ \ | ___ \ / ____ / | |/ / / ____ \ \n");
printf(" __ | | | / \ \ | | | / | / | /
\ | \n");
printf(" \ \
| | | | | | | |__| | | \ | ____/ \n");
printf(" \ / | | | | \ \ | |\ \ \ \
\n");
printf(" \
/ || || \/\\ || \\ \_/ \n");

}
void welcometoGame()
{
int n=0;
int i=0;
int j=0;
gotoXY(43,18);
color(11);
printf(“贪 吃 蛇 游 戏”);
color(14);
for(i=20;i<=26;i++)
{

	for(j=27;j<=74;j++)
	{
	    gotoXY(j,i);
	    if(i==20 ||i==26)
		{
		printf("-");
	    }else if(j==27||j==74)
	    {
		printf("|");
		}
	} 
}
gotoXY(36,22);
color(10);
printf("1.开始游戏");
gotoXY(50,22);
color(10);
printf("2.游戏说明");
gotoXY(36,24);
color(10);
printf("3.退出游戏");
gotoXY(28,27);
color(3);
printf("请选择[1 2 3]:[ ]\b\b");//\b是退格使光标处于两个中括号之间
color(14);
scanf("%d",&n);
switch(n)
{
case 1:
	system("cls");
	File_Out();
	sumScore=0;
	createMap();
	screenTips();
	initSnake();
	createFood();
	keyboardControl();
	break;
case 2:
	//游戏说明界面 
	break;
case 3:
	exit(0); 
	break;
default:
	break;
	
} 

}


## 头文件





![img](https://img-blog.csdnimg.cn/img_convert/5dde4f683b0b3b1ef555efc9770bfa68.png)
![img](https://img-blog.csdnimg.cn/img_convert/3da1966cfaddb09820ce4c2c92f4d303.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

=20 ||i==26)
			{
			printf("-");
		    }else if(j==27||j==74)
		    {
			printf("|");
			}
		} 
	}
	gotoXY(36,22);
	color(10);
	printf("1.开始游戏");
	gotoXY(50,22);
	color(10);
	printf("2.游戏说明");
    gotoXY(36,24);
	color(10);
	printf("3.退出游戏");
    gotoXY(28,27);
    color(3);
    printf("请选择[1 2 3]:[ ]\b\b");//\b是退格使光标处于两个中括号之间
	color(14);
	scanf("%d",&n);
	switch(n)
	{
	case 1:
		system("cls");
		File_Out();
		sumScore=0;
		createMap();
		screenTips();
		initSnake();
		createFood();
		keyboardControl();
		break;
	case 2:
		//游戏说明界面 
		break;
	case 3:
		exit(0); 
		break;
	default:
		break;
		
	} 
			
}

头文件

[外链图片转存中…(img-9YKuNR3S-1715645257784)]
[外链图片转存中…(img-rhb6DqjY-1715645257785)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值