easyx C语言贪吃蛇

本程序使用VS2022编写,预先安装好easyx图形库

tip:记得设置字符集使用多字节字符集

在b站上学习并自己加以修改

在网络上下载了一些声音素材

源码程序与素材下载

链接: https://pan.baidu.com/s/1YisBwq2iiWTq2p-J7fVzKw?pwd=wnsa 提取码: wnsa

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
#include <mmsystem.h>
#pragma comment(lib,"Winmm.lib")
#define SNAKE_NUM 500  
int score = 0;
struct Snake
{
	int size;
	int dir;
	int speed;
	POINT coor[SNAKE_NUM];
}snake;
struct Food
{
	int x;
	int y;
	int r;
	bool flag;
	DWORD color; 
}food;
enum Dir
{
	UP,
	DOWN,
	LEFT,
	RIGHT,
};
void GamaInit()
{	
	initgraph(640, 480);
	SetWindowText(GetHWnd(), "贪吃snake by 话说");
	mciSendString("play src/bgm.mp3 repeat", 0, 0, 0);
	snake.size = 3;
	snake.speed = 10;
	snake.dir=RIGHT;
	for (int i = 0; i < snake.size ; i++)
	{
    snake.coor[i].x = 40 - 10*i;
	snake.coor[i].y = 10;
	} 
	food.x = rand() % 640; 
	food.y = rand() % 480;
	food.color = RGB(rand()%256, rand() % 256, rand() % 256);
	food.r = rand() % 10 + 5;
	food.flag = true;
}
void GameDraw()
{
	//BeginBatchDraw();
	setbkcolor(RGB(30, 30, 30));
	cleardevice();
	setfillcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
	for (int i = 0; i < snake.size; i++)
	{
		solidcircle(snake.coor[i].x, snake.coor[i].y, 5);
	}
	if (food.flag)
	{
		solidcircle(food.x, food.y, food.r);
	}
	//EndBatchDraw();
}
void snakeMove()
{
	for (int i = snake.size - 1; i > 0 ; i--)
	{
		snake.coor[i] = snake.coor[i - 1];
	}
	switch (snake.dir)
	{
	case UP: snake.coor[0].y -= snake.speed;
		if (snake.coor[0].y+10<=0)
		{
			snake.coor[0].y = 480;
		}
		break;
	case DOWN: snake.coor[0].y += snake.speed;
		if (snake.coor[0].y - 10 >= 480)
		{
			snake.coor[0].y = 0;
		}
		break;
	case LEFT: snake.coor[0].x -= snake.speed;
		if (snake.coor[0].x + 10 <= 0)
		{
			snake.coor[0].x = 640;
		}
		break;
	case RIGHT: snake.coor[0].x += snake.speed;
		if (snake.coor[0].x - 10 >= 640)
		{
			snake.coor[0].x = 0;
		}
		break;
	}
}
void keyContorl()
{
	if (_kbhit())
	{
		switch (_getch())
		{
		case 'w':
		case 'W':
		case 72:	if (snake.dir != DOWN)
		{
			snake.dir = UP;
		}
			break;
		case 's':
		case 'S':
		case 80:	if (snake.dir != UP)
		{
			snake.dir = DOWN;
		}
			break;
		case 'a':
		case 'A':
		case 75:	if (snake.dir != RIGHT)
		{
			snake.dir = LEFT;
		}
			break;
		case 'd':
		case 'D':
		case 77:	if (snake.dir != LEFT)
		{
			snake.dir = RIGHT;
		}
			break;
		case ' ':
			while (1)
			{
				if (_getch() == ' ')
					return;
			}
			break;
		case 't':
		case 'T': 
			snake.speed += 2;
			if (snake.speed >= 20)snake.speed = 20;
			   break;
		case 'y':
		case 'Y':  
			snake.speed -= 2;
			if (snake.speed <= 5)snake.speed = 5;
				break;
		}
	}
}
void Eatfood()
{
	if (food.flag&&snake.coor[0].x>=food.x-food.r&& snake.coor[0].x <= food.x + food.r&& snake.coor[0].y >= food.y - food.r&& snake.coor[0].y <= food.y + food.r)
	{
		mciSendString("play src/eat.mp3", 0, 0, 0);
		food.flag = false;
		snake.size++; score++;
	}
	if (!food.flag)
	{
		food.x = rand() % 640;
		food.y = rand() % 480;
		food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
		food.r = rand() % 10 + 5;
		food.flag = true;
	}
}
void score_write(int score)
{
	TCHAR s[30];
	TCHAR sp[30];
	_stprintf_s(s, _T("%d"), score);//需要先把数字进行转换
	_stprintf_s(sp, _T("%d"),snake.speed);
	//BeginBatchDraw();
	setbkmode(TRANSPARENT);
	settextcolor(RGB(255, 255, 255));
	settextstyle(30, 0, "楷体");
	outtextxy(5, 450, "你的分数:");
	outtextxy(150, 450, s);
	outtextxy(180, 450, "速度:");
	outtextxy(250, 450, sp);
	//EndBatchDraw();
}
void Gameover()
{
	for (int i = 1; i < snake.size; i++)
	{
		if (snake.coor[0].x > snake.coor[i].x - 4 && snake.coor[0].x < snake.coor[i].x + 4  && snake.coor[0].y > snake.coor[i].y - 4 && snake.coor[0].y < snake.coor[i].y + 4)
		{
			mciSendString("close src/bgm.mp3", 0, 0, 0);
			mciSendString("play src/dead.mp3", 0, 0, 0);
			while (1)
			{	if(score<=15)
				outtextxy(200, 240, "牛马 按空格继续");
				else if(score<30)
				outtextxy(200, 240, "666 按空格继续");
				else
				outtextxy(200, 240, "驭蛇大师 按空格继续");
				if (_getch() == ' ')
				{
					snake.size = 3;
					score = 0;
					GamaInit();
					return; 
				}
					
			}
		}
	}
}
int main()
{
	GamaInit();
	while (1)
	{	
		snakeMove();
		BeginBatchDraw();
		GameDraw();
		score_write(score);
		EndBatchDraw();
		keyContorl();
		Eatfood();
		Gameover();
		Sleep(50);
	}
	return 0;
}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用easyx库实现的简单贪吃蛇游戏C语言代码: ```c #include <graphics.h> #include <conio.h> #include <time.h> #define WIDTH 640 // 窗口宽度 #define HEIGHT 480 // 窗口高度 #define SIZE 20 // 贪吃蛇每个正方形的边长 #define MAX_LENGTH (WIDTH / SIZE) * (HEIGHT / SIZE) // 贪吃蛇最大长度 struct Snake { int x, y; // 贪吃蛇头部坐标 int length; // 贪吃蛇长度 int direction; // 贪吃蛇运动方向 int body[MAX_LENGTH][2]; // 贪吃蛇身体各个部分的坐标 } snake; struct Food { int x, y; // 食物坐标 } food; void init(); // 初始化函数 void drawSnake(); // 绘制贪吃蛇 void moveSnake(); // 移动贪吃蛇 void generateFood(); // 生成食物 bool isHitWall(); // 判断是否撞墙 bool isHitBody(); // 判断是否撞身体 bool isEatFood(); // 判断是否吃到食物 int main() { init(); while (1) { moveSnake(); if (isHitWall() || isHitBody()) { break; } if (isEatFood()) { generateFood(); } cleardevice(); drawSnake(); Sleep(100); } closegraph(); return 0; } void init() { initgraph(WIDTH, HEIGHT); setbkcolor(WHITE); setfillcolor(BLACK); setcolor(BLACK); snake.x = WIDTH / 2; snake.y = HEIGHT / 2; snake.length = 3; snake.direction = VK_RIGHT; for (int i = 0; i < snake.length; i++) { snake.body[i][0] = snake.x - i * SIZE; snake.body[i][1] = snake.y; } generateFood(); } void drawSnake() { for (int i = 0; i < snake.length; i++) { fillrectangle(snake.body[i][0], snake.body[i][1], snake.body[i][0] + SIZE, snake.body[i][1] + SIZE); } setfillcolor(RED); fillrectangle(food.x, food.y, food.x + SIZE, food.y + SIZE); setfillcolor(BLACK); } void moveSnake() { for (int i = snake.length - 1; i > 0; i--) { snake.body[i][0] = snake.body[i - 1][0]; snake.body[i][1] = snake.body[i - 1][1]; } switch (snake.direction) { case VK_UP: snake.y -= SIZE; break; case VK_DOWN: snake.y += SIZE; break; case VK_LEFT: snake.x -= SIZE; break; case VK_RIGHT: snake.x += SIZE; break; } snake.body[0][0] = snake.x; snake.body[0][1] = snake.y; } void generateFood() { srand((unsigned int)time(NULL)); bool flag = true; while (flag) { flag = false; food.x = SIZE * (1 + rand() % (WIDTH / SIZE - 2)); food.y = SIZE * (1 + rand() % (HEIGHT / SIZE - 2)); for (int i = 0; i < snake.length; i++) { if (food.x == snake.body[i][0] && food.y == snake.body[i][1]) { flag = true; break; } } } } bool isHitWall() { if (snake.x < SIZE || snake.x > WIDTH - 2 * SIZE || snake.y < SIZE || snake.y > HEIGHT - 2 * SIZE) { return true; } else { return false; } } bool isHitBody() { for (int i = 1; i < snake.length; i++) { if (snake.body[i][0] == snake.x && snake.body[i][1] == snake.y) { return true; } } return false; } bool isEatFood() { if (snake.x == food.x && snake.y == food.y) { snake.length++; snake.body[snake.length - 1][0] = snake.body[snake.length - 2][0]; snake.body[snake.length - 1][1] = snake.body[snake.length - 2][1]; return true; } else { return false; } } ``` 在该代码中,我们使用了`graphics.h`和`conio.h`两个头文件来实现图形界面和键盘输入的功能。其中,`init()`函数负责初始化贪吃蛇和食物的位置、长度、方向等信息,`drawSnake()`函数负责绘制贪吃蛇和食物,`moveSnake()`函数负责移动贪吃蛇,`generateFood()`函数负责随机生成食物,并判断其是否与贪吃蛇身体重叠,`isHitWall()`函数和`isHitBody()`函数分别用于判断贪吃蛇是否撞墙和撞身体,`isEatFood()`函数用于判断贪吃蛇是否吃到了食物。在主函数中,我们使用一个循环不断移动贪吃蛇,并根据不同情况终止游戏。 在编写完代码后,我们需要在编译选项中添加`-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32`这些库文件,才能正常编译和运行程序
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值