贪吃蛇C语言代码(简单易懂)
//游戏说明;
//游戏由基本的C语言和easyx制作而成
//在玩游戏之前,你需要下载一个VS并创建一个空项目
//然后再在源文件里创造一个后缀为.cpp的源文件
//由于easyx(一种绘图语言)必须用c++的文件编译,所以用.c后缀的文件是不行的
//但是代码全部是由c语言和c语言的风格写完的,这点大可放心
//将一下代码粘贴过去以后,你需要将VS最上面一栏的"项目"——"xxx的属性"——"高级"——"字符集"改成使用多字符集
//这样做的原因是,音频的播放需要这样修改以后才可以运行
//另外你还需要去easyx官网下载并安装一下easyx
//网站如下https://easyx.cn/download
//以及:代码的音乐文件需要下载并且在最后音频处修改为自己电脑中的音频的地址
// (注意音频播放函数下面的提示和双斜杠哦!)
//完成这些以后,就可以愉快体验贪吃蛇游戏啦!
//祝您游戏愉快!
#define _CRT_SECURE_NO_WARNINGS 1 //scanf函数在vs运行中存在风险,需要先宏定义无风险才可以使用
#include <stdio.h>
#include <stdlib.h>
#include <conio.h> //getch函数
#include <time.h>
#include <graphics.h> //easyx中的函数
#include <mmsystem.h> //播放音乐的头文件
#pragma comment(lib,"winmm.lib")//播放音乐的库文件
/*
知识点:结构体 循环 函数 easyx 数组
*/
#define SNAKE_NUM 100000 //蛇的最大节数
#define X 500
#define Y 500
void Game(); //对游戏函数声明
//xy坐标的结构
struct coor
{
int x; //横坐标
int y; //纵坐标
};
//蛇的结构
struct Snake
{
struct coor xy[SNAKE_NUM]; //记录每一节坐标
int size; //当前蛇的长度
int dir; //方向
}snake;
//食物结构
struct Food
{
struct coor xy; //食物的坐标
int flag; //食物有没有被吃掉的标志
}food;
//墙的结构
struct Wall
{
struct coor xy; //墙的坐标
int flag; //有没有撞墙的标志
}wall;
//初始化食物
void InitFood()
{
food.flag = 1; //食物没有被吃掉
food.xy.x = rand() % ((X - 100) / 10) * 10; //生成的食物的坐标是10整数,否则容易出现不落在方块区域内的问题
food.xy.y = rand() % ((Y - 100) / 10) * 10;
}
//绘制食物
void DrawFood()
{
setfillcolor(WHITE); //设置食物的颜色为白色
setlinecolor(BLACK); //食物的边框线为黑色
fillrectangle(food.xy.x, food.xy.y, food.xy.x + 10, food.xy.y + 10);
}
//初始化墙
void InitWall()
{
wall.xy.x = 0;
wall.xy.y = 0;
wall.flag = 1;
}
//绘制墙
void DrawWall()
{
for (wall.xy.x = 0; wall.xy.x < X; wall.xy.x += 10)
{
wall.xy.y = 0;
setfillcolor(WHITE);
setlinecolor(BLACK);
fillrectangle(wall.xy.x, wall.xy.y, wall.xy.x + 10, wall.xy.y + 10);
}
for (wall.xy.x = 0; wall.xy.x < X; wall.xy.x += 10)
{
wall.xy.y = Y - 10;
setfillcolor(WHITE);
setlinecolor(BLACK);
fillrectangle(wall.xy.x, wall.xy.y, wall.xy.x + 10, wall.xy.y + 10);
}
for (wall.xy.y = 0; wall.xy.y < Y; wall.xy.y += 10)
{
wall.xy.x = X - 10;
setfillcolor(WHITE);
setlinecolor(BLACK);
fillrectangle(wall.xy.x, wall.xy.y, wall.xy.x + 10, wall.xy.y + 10);
}
for (wall.xy.y = 0; wall.xy.y < Y; wall.xy.y += 10)
{
wall.xy.x = 0;
setfillcolor(WHITE);
setlinecolor(BLACK);
fillrectangle(wall.xy.x, wall.xy.y, wall.xy.x + 10, wall.xy.y + 10);
}
}
//方向控制
//0:上 1:下 2:右 3:左
// 用枚举类型来表示这些常数
enum direction
{
up, down, right, left
};
//初始化蛇
void InitSnake()
{
snake.xy[0].x = 20; //初始状态蛇有三节,三节的坐标分别初始化
snake.xy[0].y = 10;
snake.xy[1].x = 10;
snake.xy[1].y = 10;
snake.xy[2].x = 0;
snake.xy[2].y = 10;
snake.size = 3;
snake.dir = right;
//对后面的坐标处理一下;
for (int i = 3; i < SNAKE_NUM; i++)
{
snake.xy[i].x = -100;
snake.xy[i].y = -100;
}
}
//绘制一条蛇
void DrawSnake()
{
setfillcolor(RED); //给蛇头设计一个颜色
setlinecolor(BLACK);
fillrectangle(snake.xy[0].x, snake.xy[0].y, snake.xy[0].x + 10, snake.xy[0].y + 10);
for (int i = 1; i < snake.size; i++)
{
setfillcolor(WHITE); //给蛇身设计一个颜色
setlinecolor(BLACK);
fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
}
}
//移动蛇
void MoveSnake()
{
//处理后面的节数(跟随)
for (int i = snake.size - 1; i > 0; i--)
{
snake.xy[i].x = snake.xy[i - 1].x;
snake.xy[i].y = snake.xy[i - 1].y;
}
switch (snake.dir)
{
case up:
snake.xy[0].y -= 10;
break;
case down:
snake.xy[0].y += 10;
break;
case right:
snake.xy[0].x += 10;
break;
case left:
snake.xy[0].x -= 10;
break;
}
}
//按键处理控制蛇的移动
void KeyDown()
{
char userkey = _getch(); //读入输入的字符并且不需要回车
switch (userkey)
{
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;
}
}
//吃食物
void EatFood()
{
if (food.xy.x == snake.xy[0].x && food.xy.y == snake.xy[0].y)
{
food.flag = 0;
snake.size++;
}
}
//游戏暂停设置
void Stop()
{
if (_kbhit())
{
if (_getch() == ' ')
{
while (_getch() != ' ');
}
}
}
//撞墙游戏结束
void GameOver()
{
if (snake.xy[0].x == X || snake.xy[0].x == -10 || snake.xy[0].y == Y || snake.xy[0].y == -10)
{
wall.flag = 0;
}
}
void Game()
{
int grade = 0; //分数
srand((unsigned int)time(NULL)); //设计随机数种子;
initgraph(X, Y); //初始化绘图窗口
setbkcolor(RGB(rand() % 256, rand() % 256, rand() % 256)); //设置背景颜色为随机
cleardevice(); //用背景色清空屏幕
InitSnake();
InitFood();
InitWall();
mciSendString("open C:\\Users\\F\\Desktop\\bgm.mp3 alias bkmusic", NULL, 0, NULL);
//open指令打开需要播放的音乐,alias后面制定了前面文件路径的别名,以后想要操作这个文件直接使用这个别名就可以了.
//如果音乐文件和我们的debug文件夹在同一目录下,就可以像我这样不用写路径,直接音乐名。
//如果音乐文件不是上面的情况就得写清楚路径。
//例: D盘下的demo目录有一个叫1.MP3的文件
//mciSendString("open D:\\demo\\1.mp3 alias bkmusic", NULL, 0, NULL);
mciSendString("play bkmusic repeat", NULL, 0, NULL); //循环播放音乐
while (1)
{
BeginBatchDraw(); //双缓冲绘图开始
cleardevice();
DrawSnake();
DrawFood();
DrawWall();
MoveSnake();
EatFood();
Stop(); //按空格游戏暂停
GameOver();
if (food.flag == 0)
{
InitFood();
grade += 10;
}
if (wall.flag == 0)
{
printf("***************************************\n");
printf("***************************************\n");
printf("*************Game Over!!!!*************\n");
printf("*************Your Grade is:%d**********\n", grade);
printf("***************************************\n");
printf("***************************************\n");
break;
}
if (_kbhit()) //判断是否有按键
{
KeyDown();
}
Sleep(100); //控制速度
EndBatchDraw(); //将之前的操作显示出来
}
closegraph(); //关闭图形窗口
}
void menu()
{
printf("**************贪吃蛇小游戏*************\n");
printf("***************************************\n");
printf("***************************************\n");
printf("***************游戏说明:**************\n");
printf("****玩家操控蛇吃东西,吃到以后长度+1***\n");
printf("**如果玩家操控蛇头撞墙了那么直接结束***\n");
printf("*******另外按空格可以暂停游戏哦!******\n");
printf("**************ok游戏开始!*************\n");
printf("***************************************\n");
printf("***************************************\n");
printf("***********1.扣1回车开始游戏***********\n");
printf("***************************************\n");
printf("***************************************\n");
printf("********2.扣眼珠子退出(bushi)********\n");
printf("***************************************\n");
printf("***************************************\n");
}
int main()
{
int n = 0;
menu();
while (scanf("%d", &n), n == 1)
{
Game();
}
printf("好的,游戏结束!");
return 0;
}
须知少时凌云志,曾许人间第一流
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具