贪吃蛇C语言版

首先需要在这里,下载easyX

在这里插入图片描述

选择安装的编译器

在这里插入图片描述

#include<stdio.h>
#include<easyx.h>
#include<stdlib.h>
#include <graphics.h>
#include<conio.h>  //kbhit()非阻塞式键盘监听
#include<time.h>
#define SIZE 20
#define MAX (SIZE*SIZE) //蛇体数组长度
typedef struct { int x; int y; }PLACE;
int maxX, maxY;
char dir; //上一次方向

void init(); //初始化
void food(); //生成食物
void move(); //移动
void draw(); //画
void rect(int x, int y, COLORREF color); //画方块
void eat();
void over();
void run();
void keyDown();
struct mySnake
{
	int num; //蛇节
	PLACE xy[MAX]; //蛇体数组
	char direction; //方向
}snake;

PLACE foodxy; //食物位置

enum direction
{
	UP,DOWN,LEFT,RIGHT
};

void init()
{
	srand((unsigned int)time(NULL)); //随机种子
	initgraph(640, 480,EW_SHOWCONSOLE);
	maxX = 640 / SIZE;  //横
	maxY = 480 / SIZE;	//竖
	for (int i = 0; i < 3; i++)
	{
		snake.xy[2 - i].x = i;
		snake.xy[2 - i].y = 0;
	}
	snake.num = 3;
	snake.direction = RIGHT;

	//生成食物
	food();
}
void food() //生成食物坐标
{
	foodxy.x = rand() % maxX;
	foodxy.y = rand() % maxY;
	int i = 0;
	while (i < snake.num)
	{
		if (foodxy.x == snake.xy[i].x && foodxy.y == snake.xy[i].y)
		{
			foodxy.x = rand() % maxX;
			foodxy.y = rand() % maxY;
			i = 0;
		}
		i++;
	}
}
void move()
{
	for (int i = snake.num; i > 0; i--)
	{
		snake.xy[i].x = snake.xy[i - 1].x;
		snake.xy[i].y = snake.xy[i - 1].y;
	}
	switch (dir=snake.direction)
	{
	case RIGHT:
		snake.xy[0].x++;
		break;
	case LEFT:
		snake.xy[0].x--;
		break;
	case DOWN:
		snake.xy[0].y++;
		break;
	case UP:
		snake.xy[0].y--;
		break;
	default:
		break;
	}
}
void draw()
{
	//画蛇

	for (int i = 0; i < snake.num; i++)
	{
		rect(snake.xy[i].x, snake.xy[i].y, RED);
	}
	rect(foodxy.x, foodxy.y, BLUE);

	FlushBatchDraw(); //绘制完再继续
}
void rect(int x, int y, COLORREF color)
{
	setfillcolor(color);
	fillrectangle(x * SIZE, y * SIZE, x * SIZE + SIZE, y * SIZE + SIZE);
}
void eat()
{
	if (snake.xy[0].x == foodxy.x && snake.xy[0].y == foodxy.y)
	{
		snake.num ++ ;
		food();
	}
}
//判断是否结束游戏
void over()
{
	//吃自己
	for (int i = 1; i < snake.num; i++)
	{
		if (snake.xy[0].x == snake.xy[i].x && snake.xy[0].y == snake.xy[i].y)
		{
			MessageBox(GetHWnd(), _T("您操控的小蛇吃到自己了!"), _T("游戏结束"), 0);
			exit(0);
		}
		
	}
	//撞墙
	if (snake.xy[0].x >= maxX || snake.xy[0].x < 0 || snake.xy[0].y >= maxY || snake.xy[0].y < 0)
	{
		MessageBox(GetHWnd(), _T("您操控的小蛇撞墙死了!"),_T("游戏结束"), 0);
		exit(0);
	}
}
void run()
{
	init();
	while (1)
	{
		cleardevice(); //清屏
		while (_kbhit())
		{
			keyDown();
		}
		move();
		eat();
		over();
		draw();
		Sleep(100);
	}
}
void keyDown()
{
	char ch;
	switch (ch=_getch())
	{
	case 'w':
		if (dir != DOWN)
		{
			snake.direction = UP;
		}
		break;
	case 's':
		if (dir != UP)
		{
			snake.direction = DOWN;
		}
		break;
	case 'a':
		if (dir != RIGHT)
		{
			snake.direction = LEFT;
		}
		break;
	case 'd':
		if (dir != LEFT)
		{
			snake.direction = RIGHT;
		}
		break;
	}
	printf("按下了%c键,当前小蛇身长%d\n", ch, snake.num);
}
int main()
{
	
	run();
	system("pause");
	return 0;
}

效果图

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值