C语言贪吃蛇游戏
微凉秋意 人气:0一、部分代码截图和游戏截图
这里是部分代码截图,仅仅200行左右
这里是游戏截图:
二、制作前的准备工作
1、准备开发环境
我使用的是Visual Stduio 2022
和 easyx
配合的开发环境:
1.首先在官网下载VS2022社区版
2.然后在 easyx官网下载EasyX
3.打开下载的Easyx软件,他会自动检测你的VS版本,选择对应版本安装即可
2、修改项目属性
1.按照图示打开项目属性页
2.选择高级 ——字符集——改为多字节字符集——点击确定
3.在C/C++常规里找到SDL检查并设置为否
三、贪吃蛇游戏源码
源码如下:
/* 项目名称:贪吃蛇 作者: 微凉秋意 开发环境:VS2022+easyx */ #include<time.h> //辅助生成随机数种子 #include<stdio.h> //C语言标准输入输出库 #include<conio.h> //键盘输入 #include<graphics.h> //easyx图像库,提供函数,绘图和贴图 #define MAX_SNAKE 500 //蛇的最大节数 #define WIN_WIDTH 640 //游戏窗口的宽度 #define WIN_HEIGHT 480 //游戏窗口的高度 //枚举 enum Dir { //枚举,从上往下代表0,1,2,3 UP, DOWN, LEFT, RIGHT }; //食物结构体 struct Food { int x; int y; DWORD color; bool flag; //是否被吃掉,决定是否重新生成 }food; //蛇每个节点的位置和颜色 struct P { int x; int y; DWORD color;//DWORD是数据类型,可包含字符串 }; //设计蛇的结构体 struct Snake { int num; //当前节数 int dir; //方向 int score; //得分 int size; //蛇的宽和高 int speed; //移动速度 struct P coor[MAX_SNAKE]; //表示每节蛇的坐标,数组表示 }snake; //初始化游戏函数 void GameInit() { //设置随机数种子 srand((unsigned int)time(NULL)); snake.num = 3; snake.dir = RIGHT;//初识移动方向为右 snake.score = 0; snake.size = 10; snake.speed = 10; //初始化蛇有三个节点 snake.coor[0].x = 320; snake.coor[0].y = 240; snake.coor[0].color = (RGB(rand()%256, rand() % 256, rand() % 256));//随机生成颜色 snake.coor[1].x = 310; snake.coor[1].y = 240; snake.coor[1].color = (RGB(rand()%256, rand() % 256, rand() % 256));//随机生成颜色 snake.coor[2].x = 300; snake.coor[2].y = 240; snake.coor[2].color = (RGB(rand()%256, rand() % 256, rand() % 256));//随机生成颜色 //初始化食物 food.x = rand() % (WIN_WIDTH/10)*10;//这样写的目的是让食物坐标为10的倍数 food.y = rand() % (WIN_HEIGHT/10)*10; food.color = RGB(rand() % 256, rand() % 256, rand() % 256);//随机生成食物颜色 food.flag = true; } //绘制游戏所需资源 void DrawGame() { cleardevice();//刷新窗口 //绘制蛇 for (int i = 0; i < snake.num; i++) { //设置图形填充颜色 setfillcolor(snake.coor[i].color); //画矩形 fillrectangle(snake.coor[i].x, snake.coor[i].y, snake.coor[i].x + 10, snake.coor[i].y+10); } //绘制食物(椭圆) if (food.flag) { setfillcolor(food.color); solidellipse(food.x, food.y, food.x + 10, food.y + 10); } //绘制分数 char temp[20] = " "; sprintf(temp, "分数:%d", snake.score); outtextxy(10, 10, temp);//报错的话是因为字符集问题 /*解决方案如下: * 1、打开项目属性,把常规改为多字节 * 2、打开项目属性,C/C++常规设置里把SDL检查关掉 */ } //蛇移动 void MoveSnake() { //从尾部开始移动 for (int i =snake.num-1 ;i > 0;i--) { snake.coor[i].x = snake.coor[i - 1].x; snake.coor[i].y = snake.coor[i - 1].y; } switch (snake.dir) { case UP: snake.coor[0].y -= snake.speed; if (snake.coor[0].y < 0) { snake.coor[0].y = WIN_HEIGHT; } break; case DOWN: snake.coor[0].y += snake.speed; if (snake.coor[0].y > WIN_HEIGHT) { snake.coor[0].y = 0; } break; case LEFT: snake.coor[0].x -= snake.speed; if (snake.coor[0].x < 0) { snake.coor[0].x = WIN_WIDTH; } break; case RIGHT: snake.coor[0].x += snake.speed; if (snake.coor[0].x > WIN_WIDTH) { snake.coor[0].x = 0; } break; } } void GameControl() { //获取键盘输入,_getch();不回显函数: char key = _getch(); switch (key) { //72代表上,80代表下,75代表左,77代表右 case 72: if (snake.dir!=DOWN)//如果正在往下,则不能掉头往上 { snake.dir = UP; } break; case 80: if (snake.dir != UP)//如果正在往上,则不能掉头往下 { snake.dir = DOWN; } break; case 75: if (snake.dir !=RIGHT)//如果正在往右,则不能掉头往左 { snake.dir = LEFT; } break; case 77: if (snake.dir != LEFT)//如果正在往左,则不能掉头往右 { snake.dir = RIGHT; } break; } } //吃食物 void CreatFood() { if (!food.flag) { food.x = rand() % (WIN_WIDTH / 10) * 10;//这样写的目的是让食物坐标为10的倍数 food.y = rand() % (WIN_HEIGHT / 10) * 10; food.color = RGB(rand() % 256, rand() % 256, rand() % 256);//随机生成食物颜色 food.flag = true; } } void EatFood() { //食物存在且坐标对应,吃掉后节数加一,食物变为不存在 if (food.flag && snake.coor[0].x == food.x && snake.coor[0].y == food.y) { food.flag = false; snake.num++; snake.score += 10; snake.coor[snake.num].color = food.color; CreatFood(); } } int main(void) { //1.创建窗口,initgraoh初始化 graphics 图形窗口 initgraph(WIN_WIDTH,WIN_HEIGHT); setbkcolor(RGB(190,190,190));//设置颜色 cleardevice(); //刷新窗口 GameInit(); //调用初始化 while (1) { DrawGame(); MoveSnake(); if (_kbhit()) { //_kbhit检测是否有键盘输入 GameControl(); } EatFood(); Sleep(75); } getchar();//防止闪退 return 0; }
加载全部内容