c语言加EasyX写的简易贪吃蛇小游戏

按下空格后开始游戏, WSAD键控制蛇的上下左右,吃到食物身体加长,蛇头碰到蛇身提示游戏失败。

蛇身体的实现用的是结构体数组没有用链表,应该用双向链表会更合适一点,但是我不会-o-

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

struct SnakeBody {
	int x;
	int y;
};

//游戏状态
int state = 0;//0未开始,1开始游戏,2游戏暂停,3游戏继续,4,游戏失败,5游戏通关
int num = 5;//得分为num时通关;
int main()
{
	initgraph(650, 500);//EX_SHOWCONSOLE显示控制台
	int fen = 0;//记录得分
	int x = 50, y = 0;//蛇头初始位置
	int bodyx=0, bodyy = 0;//记录新身体的位置
	//[0,19]*25
	int foodx = (rand() % 20) * 25;
	int foody = (rand() % 20) * 25;
	
	//图片
	IMAGE head, food, down, up, right, left,bodyimg;
	loadimage(&food, L"./img\\food.png", 25, 25);
	loadimage(&up, L"./img\\up.png", 25, 25);
	loadimage(&down, L"./img\\down.png", 25, 25);
	loadimage(&left, L"./img\\left.png", 25, 25);
	loadimage(&right, L"./img\\right.png", 25, 25);
	loadimage(&bodyimg, L"./img\\body.png", 25, 25);

	head = right;//初始向右

	//初始化蛇身结点
	SnakeBody* body[100];
	for (int i = 0; i < 100; i++) {
		body[i] = new SnakeBody{ 0,0 };//给所有结点赋初值
	}
	body[0]->x = x - 25;
	body[0]->y = y;
	body[1]->x = x - 50;
	body[1]->y = y;
	char key;//状态
	
	while (1)
	{
		//双缓冲绘图,需要放在绘图代码之前和之后
		BeginBatchDraw();

		//设置背景颜色
		setbkcolor(RGB(103, 103, 103));//背景颜色
		cleardevice();//清屏
		for (int i = 0; i <= 20; i++) {
			line(25 * i, 0, 25 * i, 500);
			line(0, 25 * i, 500, 25 * i);
		}
		settextcolor(WHITE);
		settextstyle(26, 0, L"楷体");
		setbkmode(TRANSPARENT);//文字背景透明
		outtextxy(510, 50, L"得分:");//char
		if (fen > 9) {
			outtextxy(580, 50, (fen / 10) + 48);//char
		}
		outtextxy(595, 50, (fen % 10) + 48);//char
		putimage(foodx, foody, &food);//绘制食物

		putimage(x, y, &head);//绘制蛇头
		
		//绘制蛇身
		for (int i = 0; i < fen+2; i++) {
			putimage(body[i]->x, body[i]->y,&bodyimg);
		}

		EndBatchDraw();//结束双缓冲
		if (state == 0) {
			settextcolor(YELLOW);
			settextstyle(35, 0, L"楷体");
			outtextxy(100, 200, L"按下空格键,开始游戏");//char
			while (state != 1) {
				key = _getch();
				if (key == 32) {
					state = 1;
				}
			}
		}
		
		if (fen == num) {
			settextcolor(YELLOW);
			settextstyle(50, 0, L"楷体");
			outtextxy(100, 200, L"游戏通关");//char
			_getch();
		}
		for (int i = 0; i <= fen + 1; i++) {
			if (x == body[i]->x && y == body[i]->y) {
				//碰到自己的身体了,游戏结束
				settextcolor(YELLOW);
				settextstyle(50, 0, L"楷体");
				outtextxy(100, 200, L"游戏失败");//char
				_getch();
			}
		}
		if (_kbhit()) //判断是否有鼠标按下
		{
			char c = _getch(); //阻塞
			switch (c)
			{
				case 'W':
				case 'w':
					head = up;
					y -= 25;
					//更新各蛇身体的位置
					for (int i = fen + 1; i >= 1; i--) {
						body[i]->x = body[i - 1]->x;
						body[i]->y = body[i - 1]->y;
					}
					body[0]->x = x;
					body[0]->y = y + 25;
					bodyx = body[fen + 1]->x;
					bodyy = body[fen + 1]->y + 25;
					if (y < 0) {
						y = 475;
					}
					break;
				case 'S':
				case 's':
					head = down;
					y += 25;
					//更新各蛇身体的位置
					for (int i = fen + 1; i >= 1; i--) {
						body[i]->x = body[i - 1]->x;
						body[i]->y = body[i - 1]->y;
					}
					body[0]->x = x;
					body[0]->y = y - 25;
					bodyx = body[fen + 1]->x;
					bodyy = body[fen + 1]->y - 25;
					if (y >= 500) {
						y = 0;
					}
					break;
				case 'A':
				case 'a':
					head = left;
					x -= 25;
					//更新各蛇身体的位置
					for (int i = fen + 1; i >= 1; i--) {
						body[i]->x = body[i - 1]->x;
						body[i]->y = body[i - 1]->y;
					}
					body[0]->x = x + 25;
					body[0]->y = y;
					bodyx = body[fen + 1]->x+25;
					bodyy = body[fen + 1]->y;
					if (x < 0) {
						x = 475;
					}
					break;
				case 'D':
				case 'd':
					head = right;
					x += 25;
					//更新各蛇身体的位置
					
					for (int i = fen + 1; i >= 1; i--) {
						body[i]->x = body[i - 1]->x;
						body[i]->y = body[i - 1]->y;
					}
					body[0]->x = x - 25;
					body[0]->y = y;
					bodyx = body[fen + 1]->x-25;
					bodyy = body[fen + 1]->y ;
					if (x >= 500) {
						x = 0;
					}
					break;
			}
			
			if (x == foodx && y == foody)
			{
				printf("蛇吃到食物");
				
				foodx = (rand() % 20) * 25;
				foody = (rand() % 20) * 25;
				fen++;
				
				//蛇吃到食物,就加一个身体
				body[fen+1] = new SnakeBody{ bodyx,bodyy};//fen=11时,加上初始的0、1、此为2
			}
			
		}
	}		
	closegraph();//关闭绘图窗体
	return 0;
}

如果对你有帮助的话,那就点个赞吧 

posted @ 2023-05-20 10:29  limyu  阅读(98)  评论(0)    收藏  举报  来源