C语言实现贪吃蛇小游戏

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define PI 3.14
#define NODE_WIDTH 40
//绘制蛇的节点
typedef struct {
	int x;
	int y;
}node;


// 函数封装绘制横线和绘制竖线的方法
void paintGrid() {
	for (int y = 0; y < 600; y += NODE_WIDTH) {
		line(0, y, 800, y);
	}
	for (int x = 0; x < 800; x += NODE_WIDTH) {
		line(x, 0, x, 600);
	}
}
//将四个方向声明为枚举类型的变量
enum direction {
	eUp,
	eDown,
	eLeft,
	eRight
};
// 定义函数
void paintSnake(node* snake, int n) {
	int left, top, right, bottom;
	for (int i = 0; i < n; i++) {
		left = snake[i].x * NODE_WIDTH;
		top = snake[i].y * NODE_WIDTH;
		right = (snake[i].x + 1) * NODE_WIDTH;
		bottom = (snake[i].y + 1) * NODE_WIDTH;
		solidrectangle(left, top, right, bottom);
	}
}



// 定义snakemove函数
node snakeMove(node* snake, int length, int direction) {
	// 记录尾节点的数据
	node tail = snake[length - 1];
	for (int i = length - 1; i > 0; i--) {
		snake[i] = snake[i - 1];
	}
	node newHead;
	newHead = snake[0];

	if (direction == eUp) {
		newHead.y--;

	}
	else if (direction == eDown) {
		newHead.y++;
	}
	else if (direction == eLeft) {
		newHead.x--;
	}
	else{
		newHead.x++;
	}
	snake[0] = newHead;
	return tail;
}


// 通过键盘控制小蛇的移动
void changeDirection(enum direction* pD) {
	// 判断控制方向的按钮是否被按下,检查输入缓存当中是否有数据
	if (_kbhit() != 0) {
		// 获取用户键盘输入
		char c = _getch();
		switch (c) {
		   case 'w':
			   // 控制蛇的运动如果蛇向上移动就不能往相反的方向移动,其他的方向同理
			   if (*pD != eDown)
				   *pD = eUp;// 向上
			   break;
		   case 's':
			   if(*pD != eUp)
			    *pD = eDown; // 向下
			   break;
		   case 'a':
			   if(*pD != eRight)
			     *pD = eLeft; // 向左
			   break;
		   case 'd':
			   if(*pD != eLeft)
			     *pD = eRight; // 向右
			   break;
		}
	}
}

// 绘制食物的函数
void paintFood(node food) { // 传入食物节点数据
	int left, top, right, bottom;
	left = food.x * NODE_WIDTH;
	top = food.y * NODE_WIDTH;
	right = (food.x + 1) * NODE_WIDTH;
	bottom = (food.y + 1) * NODE_WIDTH;
	setfillcolor(YELLOW); // 设置填充颜色为黄色
	solidrectangle(left, top, right, bottom); // 绘制矩形
	setfillcolor(WHITE); // 绘制填充颜色
}
// 随机生成食物的代码
node createFood(node* snake, int length) {
	node food;
	while (1) {
		// 先创建食物
		food.x = rand() % (800 / NODE_WIDTH);
		food.y = rand() % (600 / NODE_WIDTH);
		int i;
		// 判断食物是否和蛇重叠
		for (i = 0; i < length; i++) {
			// 表示重叠则跳出循环
			if (snake[i].x == food.x && snake[i].y == food.y) {
				  break;
			}
		}
		// 如果 i < length说明有重叠,重新开始循环,否则没有重叠,返回食物数据 
		if (i < length) {
			continue;
		}
		else {
			break;
		}
	}
	return food;
}


// 游戏的结束条件函数
bool isGameOver(node* snake, int length) {
	if (snake[0].x < 0 || snake[0].x > 800 / NODE_WIDTH) {
		return true;
	}
	if (snake[0].y < 0 || snake[0].y  > 600 / NODE_WIDTH) {
		return true;
	}
	for (int i = 1; i < length; i++) {
		if (snake[0].x == snake[i].x && snake[0].y == snake[i].y) {
			return true;
		}
		return false;
	}
 
}
// 游戏结束后复位所有参数
void reset(node* snake, int* pLength, enum direction* d) {
	snake[0] = node{ 5,7 };
	snake[1] = node{ 4,7 };
	snake[2] = node{ 3,7 };
	snake[3] = node{ 2,7 };
	snake[4] = node{ 1,7 };
	*pLength = 5;
	*d = eRight;
}

int main()
{
	initgraph(800, 600);
	setbkcolor(RGB(164, 225, 202));
	cleardevice();

	node snake[100] = { {5,7},{4,7},{3,7},{2,7},{1,7} };
	int length = 5;
	// 使用枚举
	enum direction d = eRight;

	// 使用当前的时间作为随机数的种子,让随机数的生成更具有随机属性
	srand(unsigned int(time(NULL)));
	// 第一次生成食物
	node food = createFood(snake, length);
	while (1) {
		// 清空窗体
		cleardevice();
		// 绘制网格
		paintGrid();
		// 绘制蛇的节点
		paintSnake(snake, length);
		// 绘制食物
		paintFood(food);
		// 休眠500毫秒
		Sleep(1000);
		// 检查键盘输入
		changeDirection(&d);
		// 保存snakemove函数返回的蛇尾数据节点
		node lastTail = snakeMove(snake, length, d);
		// 判断蛇头是否和食物节点重合
		if (snake[0].x == food.x && snake[0].y == food.y) {
			if (length < 100) {
				snake[length] = lastTail;
				// 蛇尾的节点重新加回去
				length++;
			}
			//重新生成食物
			food = createFood(snake, length);
		}
		// 代码判断游戏是否结束
		if (isGameOver(snake, length) == true) {
			reset(snake, &length, &d);
			// 重新生成食物
			food = createFood(snake, length);
		}
	}
	getchar();
	closegraph();
	return 0;
}

C语言实现贪吃蛇小游戏_第1张图片

你可能感兴趣的:(c语言,开发语言,EASYX,visual,code)