贪吃蛇游戏 C语言

**

编写贪吃蛇游戏

**(设计分值:15-20分)
贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
下面就先说说游戏的规则:
开始:按左键开始游戏,按按钮或菜单重新开始。
下键:按下时,是蛇向下行, 当碰到墙壁时,游戏结束。
左键:按左时,是蛇向左行, 当碰到墙壁时,游戏结束。
右键:按右时,是蛇向右行, 当碰到墙壁时,游戏结束。
上键:按上时,是蛇向上行, 当碰到墙壁时,游戏结束。
当碰到目标时 计分器 加10分
**

算法设计

**
在这里插入图片描述

程序分析(C语言)

#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
#define framex 5
#define framey 5
#define wide 20
#define high 20

struct Snake
{
	int x[20];
	int y[20];//蛇位置
	int speed;//移动速度
	int length;//蛇身
	int count;//记分
};//蛇
struct Food
{
	int x;
	int y;
};//食物坐标;
//将光标移动到指定位置
void gotoxy(HANDLE hout,int x,int y)
{
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(hout,pos);
}//将光标位置移动至x,y
//游戏封面
void cover(HANDLE hout)
{
	gotoxy(hout,framex+wide,framey);//在边框外5个单位
	printf("欢迎来到贪吃蛇游戏>o<");
	gotoxy(hout,framex+wide,framey*2);
	printf("为了您的游戏体验,请使用英文输入法O^O");
	getchar();
	system("cls");//清屏指令
}
//制作框架
void frame()
{
	HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
	gotoxy(hout,framex+wide*2+5,framey);
	printf("贪吃蛇游戏");
	gotoxy(hout,framex+wide*2+5,framey+3);
	printf("使用方向键移动");

	gotoxy(hout,framex+wide*2+5,framey+7);
	printf("@代表食物");
	int i;
	for (i=0;i<wide*2+1;i++)
	{
		gotoxy(hout,framex+i,framey-1);
		printf("_");
		gotoxy(hout,framex+i,framey+high+1);
		printf("_");
	}//上下边框
	for (i=0;i<=high+1;i++)
	{
		gotoxy(hout,framex,framey+i);
		printf("|");
		gotoxy(hout,framex+wide*2+1,framey+i);
		printf("|");
	}//左右边框
}

//显示信息
void information(HANDLE hout,struct Snake snake)
{
	gotoxy(hout,framex+wide*2+5,framey+15);
	printf("当前速度:%d",snake.speed+500);
	gotoxy(hout,framex+wide*2+5,framey+17);
	printf("当前积分:%d",snake.count);
	gotoxy(hout,framex+wide*2+5,framey+19);
	printf("当前长度:%d",snake.length);
}
//初始化蛇
void zerosnake(struct Snake *snake)
{
	int i;
	snake->x[0]=framex+2;
	snake->y[0]=framey+high/2;
	snake->count=0;
	snake->length=3;
	snake->speed=400;
	for (i=1;i<snake->length;i++)
	{
		snake->x[i]=snake->x[i-1]+1;
		snake->y[i]=snake->y[i-1];
	}
}
//输出蛇
void snakeout(HANDLE hout, struct Snake snake)
{
		int i;
		for (i=0;i<snake.length;i++)
		{
			gotoxy(hout,snake.x[i],snake.y[i]);
			if (i==0) printf("#");
				else if (i==snake.length-1) printf("*");
						else printf("+");				
		}
}
//移动蛇
void snakemove(HANDLE hout,struct Snake *snake)
{

	int i;
	for (i=1;i<snake->length;i++)
	{
		snake->x[i-1]=snake->x[i];
		snake->y[i-1]=snake->y[i];
	}
}
//移动后蛇尾以及蛇身的坐标,蛇头另给
//打印出食物位置
void foodout(HANDLE hout,struct Snake snake,struct Food *food)
{
	int i;
	srand((unsigned)time(NULL));
	while(1)
	{
		food->x=rand()%(wide-2)+1;
		food->y=rand()%(high-2)+1;
		if (food->x==0||food->y==0) continue;
		food->x=food->x*2+framex;
		food->y+=framey;
		gotoxy(hout,food->x,food->y);
		for (i=0;i<snake.length;i++)
			if (snake.x[i]==food->x&&snake.y[i]==food->y) break;
			if (i==snake.length) {printf("@");break;}
	}
}
//吃食物
int foodeat(HANDLE hout,struct Snake snake,struct Food food)
{
	if ((snake.x[snake.length-1]==food.x)&&(snake.y[snake.length-1]==food.y))
	{
		snake.count+=10;
		return 1;
	}
	return 0;
}
//死亡判定
int death(struct Snake snake)
{
	int i;
	if ((snake.x[snake.length-1]<=framex)||(snake.x[snake.length-1]>=wide*2+framex+1)||(snake.y[snake.length-1]<=framey)||(snake.y[snake.length-1]>=framey+high+1))
	{
		return 1;
	}//撞墙
	for (i=0;i<snake.length-2;i++)
	{
		if ((snake.x[snake.length-1]==snake.x[i])&&(snake.y[snake.length-1]==snake.y[i]))	
			return 1;
	}//撞自己
	return 0;
}
void gameover(HANDLE hout)
{
	gotoxy(hout,framex+4,framey+4);
	printf("*********    *********");
	gotoxy(hout,framex+4,framey+5);
	printf("*********    *********");
	gotoxy(hout,framex+4,framey+6);
	printf("**           **      ");
	gotoxy(hout,framex+4,framey+7);
	printf("**           **      ");
	gotoxy(hout,framex+4,framey+8);
	printf("**  *****    **  *****");
	gotoxy(hout,framex+4,framey+9);
	printf("**  *****    **  *****");
	gotoxy(hout,framex+4,framey+10);
	printf("**     **    **     **");
	gotoxy(hout,framex+4,framey+11);
	printf("*********    *********");
	gotoxy(hout,framex+4,framey+12);
	printf("*********    *********");
	gotoxy(hout,framex+4,framey+13);
	printf("       **           **");
}
int main()
{
	unsigned char ch=77;
	int a[2],def,i;
	HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
	cover(hout);
	frame();
	struct Snake snake;
	struct Food food;
	zerosnake(&snake);
	snakeout(hout,snake);
	foodout(hout,snake,&food);
	Sleep(500);
	while (1)
	{
		information(hout,snake);
		a[0]=snake.x[0];
		a[1]=snake.y[0];
		if (kbhit())
		{
			ch=getch();//getch() 接受任意键的输入,不用按回车就返回,返回值是输入值的ascll码
			if (kbhit())
			{
				Sleep(20);
			}
		}
		snakemove(hout,&snake);
		snakeout(hout,snake);
		switch(ch)
		{
		case 72:  snake.y[snake.length-1]-=1; break;//上 
		case 80:  snake.y[snake.length-1]+=1; break;//下
		case 75:  snake.x[snake.length-1]-=1; break;//左
		case 77:  snake.x[snake.length-1]+=1; break;//右
		}
		snakeout(hout,snake);
		gotoxy(hout,a[0],a[1]);
		printf(" ");
		snakeout(hout,snake);
		if (foodeat(hout,snake,food))
		{
			snake.length+=1;
			for (i=snake.length-1;i>0;i--)
			{
				snake.x[i]=snake.x[i-1];
				snake.y[i]=snake.y[i-1];
			}
			snake.x[0]=a[0];
			snake.y[0]=a[1];
			snake.count+=10;
			snake.speed-=20;
			information(hout,snake);
			foodout(hout,snake,&food);
			snakeout(hout,snake);
		}
		if (death(snake))
		{
			gameover(hout);
			Sleep(1500);
			break;
		}
		if (snake.speed<=50) 
		{
			gotoxy(hout,framex+wide-3,framey+high/2+1);
			printf("YOU WIN");
			Sleep(1000);
			break;
		}
		Sleep(snake.speed+200);
	//	system("pause");
	}
	
return 0;
}

**

实验数据以及效果截屏

**
1.封面
在这里插入图片描述
2.游戏开始
在这里插入图片描述
3.吃果实后
在这里插入图片描述
4.触边结束
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值