贪吃蛇程序添加条件的程序设计

分数:320 吃食物数量 20 1增加显示面板,主要显示分数和吃食物的数量以及插入图片;2增加判断死活的功能,蛇不能碰墙壁,不能碰自己的身体:3蛇吃食物后身体长度增加一节; 4蛇和食物换成图片,并且食物的种类可以增多, 5还可增加不可以食用的物品,蛇一旦食用就死亡

#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#define N 120  //常量,蛇的最大长度 
//定义蛇结构体 
struct SNAKE{
	int direction; //方向1往左走,2往右走,3往上走,4往下走 
	int life; //蛇的生命 0死亡,1正常
	int score; //游戏积分
	int level; //等级
	int node; //蛇的初始长度
	int X[N]; //蛇的X坐标,数组的长度表示蛇的矩形个数 
	int Y[N];  //蛇的Y坐标 
}snake; 
//食物结构体
struct FOOD{
	int x;
	int y;
	int yes; //是否需要生成食物(1有食物,0没有食物) 
}food;
//向左箭头 
#define KEY_LEFT 293
//向上箭头
#define KEY_UP 294
//向右箭头
#define KEY_RIGHT 295
//向下箭头
#define KEY_DOWN 296
//声明函数 
void wall();
void wall2(); 
void head();
void getfood();
void getfood2();
int gameover();
int gameover2();

int menu();
void level1();//第一关 
void level2();
void level3();
int main(){
	int cmd;
	//图形界面初始化
	initgraph(800,600,0);	 
	
	while(1){
		cmd = menu();
		switch(cmd){
			case 1:
				level1();
				break;
			case 2:
				level2();
				break;
			case 3:
				level3();
				break;
		}
	}
	getch();
	closegraph(); 
}
void level1(){
	int i;
	int key;
	//初始化蛇
	snake.direction = 2; //初始往右走 
	snake.life = 1;  //生命 
	snake.level = 1; //等级 
	snake.node = 3; //蛇的默认长度
	snake.score = 0; //得分 
	//蛇头的位置
	snake.X[0] = 200;
	snake.Y[0] = 100;
	//第二节位置 
	snake.X[1] = 190;
	snake.Y[1] = 100;
	//第三节 
	snake.X[2] = 180;
	snake.Y[2] = 100; 
	//初始化食物
	food.yes = 1; 
	while(snake.life){
		//显示标题
		head();
		//画墙
		wall();
		//生成食物
		getfood(); 
		//画蛇
		//设置蛇的颜色
		setcolor(0XFF0000); 
		for(i=0;i<snake.node;i++){
			//画空心矩形rectangle 
			rectangle(snake.X[i],snake.Y[i],snake.X[i]+10,snake.Y[i]+10);
		}
		
		//延迟
		delay_ms(100);
		//最后一节的坐标画成背景颜色
		setcolor(0x000000);
		rectangle(snake.X[snake.node-1],snake.Y[snake.node-1],snake.X[snake.node-1]+10,snake.Y[snake.node-1]+10); 

		/*
			让蛇动起来
				1.蛇后一节的坐标等于前一节的坐标 
				2.修改蛇头的坐标
				
				//方向1往左走,2往右走,3往上走,4往下走
		*/
		//1.蛇后一节的坐标等于前一节的坐标 
		for(i=snake.node-1;i>=1;i--){
			snake.X[i] = snake.X[i-1]; //前一节x的值赋值给后一节 
			snake.Y[i] = snake.Y[i-1]; //前一节Y的值赋值给后一节
		} 
		//读取键盘输入
		if(kbhit()){ //判断有没有按键 
			//改变蛇头的方向 
			key = getch(); //获取方向键的值
			switch(key){
				case KEY_LEFT:
					if(snake.direction != 2){
						snake.direction = 1;
					}
					
					break;
				case KEY_UP:
					if(snake.direction != 4){
						snake.direction = 3;
					}
					break;
				case KEY_RIGHT:
					if(snake.direction != 1){
						snake.direction = 2;
					}
					break;
				case KEY_DOWN:
					if(snake.direction != 3){
						snake.direction = 4;
					}
					break; 
			} 
		} 
		//2.修改蛇头的坐标
		switch(snake.direction){
			case 1: //往左走
				snake.X[0] = snake.X[0] - 10;
				break;
			case 2: //往右走 
				snake.X[0] = snake.X[0] + 10;
				break;
			case 3: //往上走
				snake.Y[0] = snake.Y[0] - 10;
				break;
			case 4: //往下走
				snake.Y[0] = snake.Y[0] + 10;
				break;
		}		 
		//判断食物的坐标与蛇头的坐标是否相等,相等就表示蛇吃到了食物
		if(snake.X[0] == food.x && snake.Y[0] == food.y){
			//蛇的长度加一
			snake.node++;
			snake.score += 10; //得分加10 
			food.yes = 1; //重新发食物
			//升级,每100分升一级
			if(snake.score != 0 && snake.score % 100 == 0){
				snake.level++;
			} 
		} 
		//判断游戏结束 
		if(gameover()){
			//清空屏幕
			cleardevice();
			setcolor(0xff0000);
			setfont(60,50,"微软雅黑");
			outtextxy(180,250,"游戏结束");
			getch();
			break; //终止游戏的循环 
		}
	}
}
void level2(){
	int i;
	int key;
	//初始化蛇
	snake.direction = 2; //初始往右走 
	snake.life = 1;  //生命 
	snake.level = 2; //等级 
	snake.node = 3; //蛇的默认长度
	snake.score = 0; //得分 
	//蛇头的位置
	snake.X[0] = 200;
	snake.Y[0] = 100;
	//第二节位置 
	snake.X[1] = 190;
	snake.Y[1] = 100;
	//第三节 
	snake.X[2] = 180;
	snake.Y[2] = 100; 
	//初始化食物
	food.yes = 1; 
	while(snake.life){
		//显示标题
		head();
		//画墙
		wall2();
		//生成食物
		getfood2(); 
		//画蛇
		//设置蛇的颜色
		setcolor(0XFF0000); 
		for(i=0;i<snake.node;i++){
			//画空心矩形rectangle 
			rectangle(snake.X[i],snake.Y[i],snake.X[i]+10,snake.Y[i]+10);
		}
		
		//延迟
		delay_ms(80);
		//最后一节的坐标画成背景颜色
		setcolor(0x000000);
		rectangle(snake.X[snake.node-1],snake.Y[snake.node-1],snake.X[snake.node-1]+10,snake.Y[snake.node-1]+10); 

		/*
			让蛇动起来
				1.蛇后一节的坐标等于前一节的坐标 
				2.修改蛇头的坐标
				
				//方向1往左走,2往右走,3往上走,4往下走
		*/
		//1.蛇后一节的坐标等于前一节的坐标 
		for(i=snake.node-1;i>=1;i--){
			snake.X[i] = snake.X[i-1]; //前一节x的值赋值给后一节 
			snake.Y[i] = snake.Y[i-1]; //前一节Y的值赋值给后一节
		} 
		//读取键盘输入
		if(kbhit()){ //判断有没有按键 
			//改变蛇头的方向 
			key = getch(); //获取方向键的值
			switch(key){
				case KEY_LEFT:
					if(snake.direction != 2){
						snake.direction = 1;
					}
					
					break;
				case KEY_UP:
					if(snake.direction != 4){
						snake.direction = 3;
					}
					break;
				case KEY_RIGHT:
					if(snake.direction != 1){
						snake.direction = 2;
					}
					break;
				case KEY_DOWN:
					if(snake.direction != 3){
						snake.direction = 4;
					}
					break; 
			} 
		} 
		//2.修改蛇头的坐标
		switch(snake.direction){
			case 1: //往左走
				snake.X[0] = snake.X[0] - 10;
				break;
			case 2: //往右走 
				snake.X[0] = snake.X[0] + 10;
				break;
			case 3: //往上走
				snake.Y[0] = snake.Y[0] - 10;
				break;
			case 4: //往下走
				snake.Y[0] = snake.Y[0] + 10;
				break;
		}		 
		//判断食物的坐标与蛇头的坐标是否相等,相等就表示蛇吃到了食物
		if(snake.X[0] == food.x && snake.Y[0] == food.y){
			//蛇的长度加一
			snake.node++;
			snake.score += 10; //得分加10 
			food.yes = 1; //重新发食物
			//升级,每100分升一级
			if(snake.score != 0 && snake.score % 100 == 0){
				snake.level++;
			} 
		} 
		//判断游戏结束 
		if(gameover2()){
			//清空屏幕
			cleardevice();
			setcolor(0xff0000);
			setfont(60,50,"微软雅黑");
			outtextxy(180,250,"游戏结束");
			getch();
			break; //终止游戏的循环 
		}
	}
}
void level3(){
	cleardevice();
	setcolor(0xff0000);
	setfont(60,50,"微软雅黑");
	outtextxy(180,250,"正在开发中.....");
}
void wall(){
	int i;
	//设置矩形颜色
	setcolor(0xff0000); 
	//水平方向 
	for(i=0;i<=790;i+=10){
		rectangle(i,60,i+10,70); //顶部 
		rectangle(i,590,i+10,600);//底部 
	}
	//垂直方向 
	for(i=60;i<=590;i+=10){
		rectangle(0,i,10,i+10); //左边 
		rectangle(790,i,800,i+10);  //右边 
	}
}
void wall2(){
	int i;
	//设置矩形颜色
	setcolor(0xff0000); 
	//水平方向 
	for(i=0;i<=790;i+=10){
		rectangle(i,60,i+10,70); //顶部 
		rectangle(i,590,i+10,600);//底部 
	}
	//垂直方向 
	for(i=60;i<=590;i+=10){
		rectangle(0,i,10,i+10); //左边 
		rectangle(790,i,800,i+10);  //右边 
	}
	//画实心的障碍物
	setfillstyle(6,0x00ff00);
	setcolor(0x00ff00);
	bar(200,200,250,400); 	
	rectangle(200,200,250,400); 
	
	bar(600,200,650,400); 	
	rectangle(600,200,650,400); 
}
void head(){
	int i;
	char str[30]="贪吃蛇游戏";
	setfillstyle(8,EGERGB(0, 255, 0));
	bar(0,0,800,59);
	setcolor(EGERGB(255,0,0));
	setfont(20,30,"宋体");
	outtextxy(250,20,str);
	//打印等级和分数
	char s[20];
	setfont(20,20,"宋体");
	sprintf(s,"等级:%d",snake.level);
	outtextxy(10,20,s); 
	char s2[20];
	sprintf(s2,"得分:%d",snake.score);
	outtextxy(600,20,s2); 
	
}
//生成食物
void getfood(){
	int i; 
	int flag=1;
	if(food.yes==1){ //1表示要重新发食物
	 //初始化随机种子
	 randomize();
	 //随机生成食物
	 while(1){
	 	flag = 1;
		 food.x = random(760) + 20; //x的值必须在(20 ~780以内) ,要确保x的值是10的整数倍 
		 while(food.x % 10 !=0){
		 	food.x = random(760+20);
		 }
		 food.y = random(510) + 80; //y的值必须在(80~590以内)  ,要确保y的值是10的整数倍 
		 while(food.y % 10 !=0){
		 	food.y = random(510) + 80;
		 }
		 //判断食物是否在蛇的内部
		 for(i=0;i<snake.node;i++){
		 	if(food.x == snake.X[i] && food.y== snake.Y[i]){
		 		flag=0;
		 		break;
			}
		 }
		 if(flag){
		 	break;//终止循环,说明食物不在蛇的内部 
		 }
	 }
	 //画食物
	 setcolor(0xff0000);
	 rectangle(food.x,food.y,food.x+10,food.y+10);	
	 food.yes = 0; 
	} 
} 
//生成食物
void getfood2(){
	int i; 
	int flag=1;
	if(food.yes==1){ //1表示要重新发食物
	 //初始化随机种子
	 randomize();
	 //随机生成食物
	 while(1){
	 	flag = 1;
		 food.x = random(760) + 20; //x的值必须在(20 ~780以内) ,要确保x的值是10的整数倍 
		 while(food.x % 10 !=0){
		 	food.x = random(760+20);
		 }
		 food.y = random(510) + 80; //y的值必须在(80~590以内)  ,要确保y的值是10的整数倍 
		 while(food.y % 10 !=0){
		 	food.y = random(510) + 80;
		 }
		 //判断食物是否在蛇的内部
		 for(i=0;i<snake.node;i++){
		 	if(food.x == snake.X[i] && food.y== snake.Y[i]){
		 		flag=0;
		 		break;
			}
		 }
		 //判断是否在障碍物内部 	
		 if(food.x>=200 && food.x <=250 && food.y>=200 && food.y<=400){
		 	flag=0;
		 }
		 if(food.x>=600 && food.x <=650 && food.y>=200 && food.y<=400){
		 	flag=0;
		 }
		 if(flag){
		 	break;//终止循环,说明食物不在蛇的内部 
		 }
	 }
	 //画食物
	 setcolor(0xff0000);
	 rectangle(food.x,food.y,food.x+10,food.y+10);	
	 food.yes = 0; 
	} 
} 
//游戏结束(撞墙)
int gameover(){
	int flag = 0;
	int i;
	switch(snake.direction){
		case 1: //往左走
			if(snake.X[0]<=10){
				flag = 1;
			} 
			break;
		case 2: //往右走 
			if(snake.X[0]>=790){
				flag = 1;
			} 
			break;
		case 3: //往上走
			if(snake.Y[0]<=70){
				flag=1;
			}
			break;
		case 4: //往下走
			if(snake.Y[0]>=590){
				flag=1;
			}
			break;
	} 
	//蛇吃自己
	for(i=3;i<snake.node;i++){
		if(snake.X[0] == snake.X[i] && snake.Y[0]== snake.Y[i]){
			flag=1;
			break;
		}
	}
	return flag;
} 
int gameover2(){
	int flag = 0;
	int i;
	switch(snake.direction){
		case 1: //往左走
			if(snake.X[0]<=10){
				flag = 1;
			} 
			break;
		case 2: //往右走 
			if(snake.X[0]>=790){
				flag = 1;
			} 
			break;
		case 3: //往上走
			if(snake.Y[0]<=70){
				flag=1;
			}
			break;
		case 4: //往下走
			if(snake.Y[0]>=590){
				flag=1;
			}
			break;
	} 
	//蛇吃自己
	for(i=3;i<snake.node;i++){
		if(snake.X[0] == snake.X[i] && snake.Y[0]== snake.Y[i]){
			flag=1;
			break;
		}
	}
	//障碍物 
	if(snake.X[0]>=200 && snake.X[0] <=250 && snake.Y[0]>=200 && snake.Y[0]<=400){
		flag=1;
	}
	if(snake.X[0]>=600 && snake.X[0] <=650 && snake.Y[0]>=200 && snake.Y[0]<=400){
		flag=1;
	}
	return flag;
} 
//主菜单

int menu(){
	int key;
	int cmd=1;
	//定义图片变量 
	PIMAGE img = newimage();
	//获取图片文件 
	getimage(img, "d:\\snake.jpg");
	//画图 
	putimage(0, 0, img);
	//删除图片变量,回收内存 
	delimage(img);
//	delay_ms(1000);
//	cleardevice();
	//设置背景为透明
	setbkmode(TRANSPARENT);
	setcolor(0xff0000);
	setfont(40,30,"微软雅黑");
	outtextxy(70,20,"2020最新款贪吃蛇游戏");
	outtextxy(270,120,"1.第一关");
	outtextxy(270,220,"2.第二关");
	outtextxy(270,320,"3.第三关");
//	outtextxy(270,320,"4.返回主菜单");
	outtextxy(270,420,"5.退出");
	key = getch();
	switch(key){
		case 49: //按1 
			cmd = 1;
			break;
		case 50: //按2
			cmd = 2;
			break;
		case 51: //按3
			cmd = 3;
			break;
		case 52: //按4
			cmd = 4; 
			break;
		case 53: //按5
			exit(1); //终止程序运行 
			break;
			
	}
	cleardevice();
	return cmd;
} 

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632