贪吃蛇游戏代码

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

const int maxn = 100;
const int n = 20;

struct node
{
	int x, y;
};

int map[maxn][maxn]; // 0表示空格,1表示蛇身,2表示食物,3表示撞死的位置, 4表示蛇头.
node food;
node squence[maxn]; // 蛇的身子的坐标.
int len; // 蛇的长度.
bool eat; // 判断当前事物是否被吃了.
bool gameover; // 游戏是否失败.
int direction; // 判断当前蛇头是朝哪个方向.

void Output(void);
void Move(int direction);
void Move_up(void);
void Move_down(void);
void Move_left(void);
void Move_right(void);

int main()
{
	int i, j;
	double start;
	int gamespeed; // 游戏速度自己调整.
	int timeover;
	int game_times = 1; // 游戏的次数.
	char c = 'x';
	printf("请输入游戏的级别(1到500,1最难,500最简单):\n");
	scanf("%d", &gamespeed);
	gamespeed = gamespeed;
	// 对图的初始化.
	for (i = 0; i <= n + 1; i++)
	{
		for (j = 0; j <= n + 1; j++)
		{
			map[i][j] = 0;
		}
	}
	// 对蛇的初始化.
	for (i = 1; i <= n; i++)
	{
		squence[i].x = 0;
		squence[i].y = 0;
	}
	len = 1; // 蛇的长度为1.
	squence[len].x = 1;
	squence[len].y = 1; // 初始位置在点(1, 1).
	map[1][1] = 4;
	direction = 4; // 默认开始时蛇向右走.
	srand(time(0));
	while (game_times <= 20)
	{
		eat = 0; // 食物还没被吃.
		while (true)
		{ // 随机生出食物的坐标,注意不能与蛇身重合,否则就重新随机产生.
			food.x = rand() % 20 + 1;
			food.y = rand() % 20 + 1;
			if (map[food.x][food.y] == 0)
			{
				break;
			}
		}
		map[food.x][food.y] = 2; // 食物位置.
		system("cls");
		Output();
		// 以下这段半秒钟不按键还取原方向继续前行.
		while (!eat)
		{
			start = clock();
			timeover=1;
			while(!kbhit())
			{ // 说明没有按键.
				if (clock() - start <= gamespeed)
				{ // 如果时间超过游戏时间.
					timeover = 1;
				}
				else
				{
					timeover = 0;
					break;
				}
			}
			if (timeover)
			{ // 说明有按键.
				// 按一次键,可以连取两个
				c = getch();
				c = getch();
				// 以下几行告诉怎样判断用户按的哪个方向键
				if(c==72) direction = 1; // printf("向上");
				if(c==80) direction = 2; // printf("向下");
				if(c==75) direction = 3; // printf("向左");
				if(c==77) direction = 4; // printf("向右");
			}
			Move(direction);
			system("cls");
			if (gameover)
			{
				Output();
				printf("Game Over!!!\n");
				return 0;
			}
			Output();
		}
		game_times++; // 又成功吃到一次食物.
	}
	printf("You win!!!\n");
	return 0;
}

void Move(int direction)
{
	switch (direction)
	{
	case 1 : Move_up(); break;
	case 2 : Move_down(); break;
	case 3 : Move_left(); break;
	default : Move_right();
	}
}

void Output(void)
{
	int i, j;
	for (j = 0; j <= n + 1; j++)
	{
		printf("#");
	}
	printf("\n");
	for (i = 1; i <= n; i++)
	{
		for (j = 0; j <= n + 1; j++)
		{
			if (j == 0 || j == n + 1)
			{
				if (map[i][j] == 3)
				{
					printf("!");
				}
				else
				{
					printf("#");
				}
			}
			else
			{
				if (map[i][j] == 1)
				{
					printf("*");
				}
				else if (map[i][j] == 2)
				{
					printf("@");
				}
				else if (map[i][j] == 3)
				{
					printf("!");
				}
				else if (map[i][j] == 4)
				{
					switch (direction)
					{
					case 1 : printf("%c", 30); break;
					case 2 : printf("%c", 31); break;
					case 3 : printf("%c", 17); break;
					default : printf("%c", 16);
					}
				}
				else
				{
					printf(" ");
				}
			}
		}
		printf("\n");
	}
	for (j = 0; j <= n + 1; j++)
	{
		printf("#");
	}
	printf("\n");
}

void Move_up(void)
{
	int i;
	int x, y;
	if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x + 1)
	{ // 不能移动,则按原来的移动.
		direction = 2; // 按原来的向下移动.
		Move(direction);
		return ;
	}
	// 开始移动.
	x = squence[len].x - 1;
	y = squence[len].y;
	if (x == 0 || map[x][y] == 1)
	{ // 撞到边界或者自己撞到自己.
		map[x][y] = 3;
		gameover = 1;
	}
	if (map[x][y] == 2)
	{ // 说明已经吃到事物.
		map[squence[len].x][squence[len].y] = 1;
		len++;
		squence[len].x = x;
		squence[len].y = y;
		map[x][y] = 4;
		eat = 1;
	}
	else
	{
		map[squence[1].x][squence[1].y] = 0;
		for (i = 1; i <= len - 1; i++)
		{
			squence[i].x = squence[i + 1].x;
			squence[i].y = squence[i + 1].y;
			map[squence[i + 1].x][squence[i + 1].y] = 1;
		}
		squence[len].x = squence[len].x - 1;
		if (gameover)
		{
			map[squence[len].x][squence[len].y] = 3;
		}
		else
		{
			map[squence[len].x][squence[len].y] = 4;
		}
	}
}

void Move_down(void)
{
	int i;
	int x, y;
	if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x - 1)
	{ // 不能移动,则按原来的移动.
		direction = 1; // 按原来的向上移动.
		Move(direction);
		return ;
	}
	// 开始移动.
	x = squence[len].x + 1;
	y = squence[len].y;
	if (x == n + 1 || map[x][y] == 1)
	{ // 撞到边界或者自己撞到自己.
		map[x][y] = 3;
		gameover = 1;
	}
	if (map[x][y] == 2)
	{ // 说明已经吃到事物.
		map[squence[len].x][squence[len].y] = 1;
		len++;
		squence[len].x = x;
		squence[len].y = y;
		map[x][y] = 4;
		eat = 1;
	}
	else
	{
		map[squence[1].x][squence[1].y] = 0;
		for (i = 1; i <= len - 1; i++)
		{
			squence[i].x = squence[i + 1].x;
			squence[i].y = squence[i + 1].y;
			map[squence[i + 1].x][squence[i + 1].y] = 1;
		}
		squence[len].x = squence[len].x + 1;
		if (gameover)
		{
			map[squence[len].x][squence[len].y] = 3;
		}
		else
		{
			map[squence[len].x][squence[len].y] = 4;
		}
	}
}

void Move_left(void)
{
	int i;
	int x, y;
	if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y + 1)
	{ // 不能移动,则按原来的移动.
		direction = 4; // 按原来的向右移动.
		Move(direction);
		return ;
	}
	// 开始移动.
	x = squence[len].x;
	y = squence[len].y - 1;
	if (y == 0 || map[x][y] == 1)
	{ // 撞到边界或者自己撞到自己.
		map[x][y] = 3;
		gameover = 1;
	}
	if (map[x][y] == 2)
	{ // 说明已经吃到事物.
		map[squence[len].x][squence[len].y] = 1;
		len++;
		squence[len].x = x;
		squence[len].y = y;
		map[x][y] = 4;
		eat = 1;
	}
	else
	{
		map[squence[1].x][squence[1].y] = 0;
		for (i = 1; i <= len - 1; i++)
		{
			squence[i].x = squence[i + 1].x;
			squence[i].y = squence[i + 1].y;
			map[squence[i + 1].x][squence[i + 1].y] = 1;
		}
		squence[len].y = squence[len].y - 1;
		if (gameover)
		{
			map[squence[len].x][squence[len].y] = 3;
		}
		else
		{
			map[squence[len].x][squence[len].y] = 4;
		}
	}
}

void Move_right(void)
{
	int i;
	int x, y;
	if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y - 1)
	{ // 不能移动,则按原来的移动.
		direction = 3; // 按原来的向左移动.
		Move(direction);
		return ;
	}
	// 开始移动.
	x = squence[len].x;
	y = squence[len].y + 1;
	if (y == n + 1 || map[x][y] == 1)
	{ // 撞到边界或者自己撞到自己.
		map[x][y] = 3;
		gameover = 1;
	}
	if (map[x][y] == 2)
	{ // 说明已经吃到事物.
		map[squence[len].x][squence[len].y] = 1;
		len++;
		squence[len].x = x;
		squence[len].y = y;
		map[x][y] = 4;
		eat = 1;
	}
	else
	{
		map[squence[1].x][squence[1].y] = 0;
		for (i = 1; i <= len - 1; i++)
		{
			squence[i].x = squence[i + 1].x;
			squence[i].y = squence[i + 1].y;
			map[squence[i + 1].x][squence[i + 1].y] = 1;
		}
		squence[len].y = squence[len].y + 1;
		if (gameover)
		{
			map[squence[len].x][squence[len].y] = 3;
		}
		else
		{
			map[squence[len].x][squence[len].y] = 4;
		}
	}
} 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值