文章目录:
一:运行效果
1.演示
2.思路和功能
二:代码
文件架构
Demo
必备知识:基于C/C++的easyx图形库教程
一:运行效果
1.演示
效果图◕‿◕✌✌✌
基于C/C++的easyx实现贪吃蛇游戏运行演示
参考:【C语言实战】用EasyX写个七彩贪吃蛇游戏(1个小时)
博主提取资源:提取
2.思路和功能
通过按键控制蛇的移动去吃食物
二:代码
文件架构
Demo
#include <graphics.h> #include <conio.h>#define WIDTH 40 //横的有40个格子 #define HEIGHT 30 //竖的有30个格子 #define SIZE 20 //每个格子的大小为20// 全局变量定义 int Blocks[WIDTH][HEIGHT] = { 0 }; //表示所有的方格,用于记录地图中所有的游戏数据 char moveDirection,oldMoveDirection; // moveDirection初始化移动方向 int foodX, foodY; //食物的坐标 int isFailure = 0; //游戏状态//声明函数 void initGame(); //初始化游戏 void show(); //每一次运行时重新绘制蛇和食物的图像 void updateWithInput(); //与输入有关的更新 void updateWithoutInput(); //与输入无关的更新 void moveSnake(); //蛇运动//---------------------------------------------------------------------------------// int main() {//初始化游戏initGame();while (1) {show(); //每一次运行时重新绘制蛇和食物的图像updateWithoutInput(); //与输入无关的更新updateWithInput(); //与输入无关的更新}return 0; } //---------------------------------------------------------------------------------////初始化游戏 void initGame() {//初始化窗口initgraph(WIDTH * SIZE, HEIGHT * SIZE);//设置背景颜色setbkcolor(LIGHTGRAY);// 开始批量绘制BeginBatchDraw();cleardevice();//开始画线setlinecolor(WHITE);int i;//竖线for (i = SIZE; i < WIDTH * SIZE; i += SIZE)line(i, 0, i, HEIGHT * SIZE);//横线for (i = SIZE; i < HEIGHT * SIZE; i += SIZE)line(0, i, WIDTH * SIZE, i);//初始化向右走moveDirection = oldMoveDirection = 'd';//初始化蛇//画蛇头:画面中间画蛇头,数字为1Blocks[WIDTH / 2][HEIGHT / 2] = 1;//画蛇尾3个位置:向左依次3个蛇身,数值依次为2,3,4,for (i = 1; i < 4; i++)Blocks[WIDTH / 2 - i][HEIGHT / 2] = i + 1;//初始化食物随机放置foodX = rand() % (WIDTH - 2) + 1;//1到38foodY = rand() % (HEIGHT- 2) + 1; }//开始绘图:每一次运行时重新绘制蛇和食物的图像 void show() {//画蛇:先找到蛇的位置for (int i = 0; i < WIDTH; i++) {for (int j = 0; j < HEIGHT; j++) {if (Blocks[i][j] != 0)// 元素不等于0表示是蛇:这里让蛇的身体颜色色调渐变setfillcolor(HSVtoRGB(Blocks[i][j] * 10, 0.9, 1));else//设置填充的颜色为浅灰色setfillcolor(LIGHTGRAY);// 在对应位置处,以对应颜色绘制小方格fillrectangle(i * SIZE, j * SIZE, (i + 1) * SIZE, (j + 1) * SIZE);}}//画食物//食物颜色setfillcolor(LIGHTGREEN);// 绘制食物小方块fillrectangle(foodX * SIZE, foodY * SIZE, (foodX + 1) * SIZE, (foodY + 1) * SIZE);//游戏状态if (isFailure) {//设置文字颜色settextcolor(LIGHTRED);settextstyle(80, 0, _T("宋体"));//设置字体的背景setbkmode(TRANSPARENT);outtextxy(240, 220, _T("游戏失败"));}// 批量绘制结束FlushBatchDraw(); }//与输入有关的更新:检测移动方向 void updateWithInput() {// 如果有按键输入,并且不失败if (_kbhit() && isFailure == 0) {// 获得按键输入char input = _getch();if (input == 'a' || input == 's' || input == 'd' || input == 'w') {// 设定移动方向moveDirection = input;//放置误按:调用小蛇移动函数if (moveDirection == 'a' && oldMoveDirection == 'd')moveDirection = 'd';else if (moveDirection == 's' && oldMoveDirection == 'w')moveDirection = 'w';else if (moveDirection == 'd' && oldMoveDirection == 'a')moveDirection = 'a';else if (moveDirection == 'w' && oldMoveDirection == 's')moveDirection = 's';else oldMoveDirection = input;//移动蛇moveSnake();}} }//与输入无关的更新 void updateWithoutInput() {// 如果游戏失败,函数返回if (isFailure)return;// 静态局部变量,初始化时为1static int waitIndex = 1;waitIndex++; //每一帧+1if (waitIndex == 15) { //小蛇每隔10帧移动一次//蛇运动moveSnake();// 再变成1waitIndex = 1;} }//蛇运动 void moveSnake() {int i, j;//日常对蛇身更新:蛇移动for (i = 0; i < WIDTH; i++)for (j = 0; j < HEIGHT; j++)// 不等于0的为小蛇元素 if (Blocks[i][j] != 0)Blocks[i][j]++;//旧蛇头蛇尾:寻找旧蛇头和旧蛇尾的xy坐标int oldHeadX, oldHeadY, oldTailX, oldTailY;//找最大的:蛇尾int tailBlocks = 0; for (i = 0; i < WIDTH; i++) {for (j = 0; j < HEIGHT; j++) {//旧蛇尾:4最大的if (tailBlocks < Blocks[i][j]) {//更新最大的值tailBlocks = Blocks[i][j];//记录最大值的坐标,就是旧蛇尾的位置oldTailX = i;oldTailY = j;}//旧蛇头:1 2 3 4if (Blocks[i][j] == 2) {//数值为2恰好是旧蛇头的位置oldHeadX = i;oldHeadY = j;}}}//新蛇头:根据蛇的移动方向来寻找赋值新蛇头的xy坐标//设定变量存储新蛇头的位置int newHeadX = oldHeadX, newHeadY = oldHeadY;switch (moveDirection) {case'a'://左边移动 xnewHeadX -= 1;break;case 's'://下边移动 ynewHeadY += 1;break;case 'd'://右边移动 xnewHeadX += 1;break;case 'w'://上边移动 ynewHeadY -= 1;break;}//判断游戏是否失败:如果蛇头超出边界,或者蛇头碰到蛇身,游戏失败if (newHeadX >= WIDTH || newHeadX < 0 || newHeadY >= HEIGHT || newHeadY < 0 || Blocks[newHeadX][newHeadY] != 0) {isFailure = 1;return;}// 新蛇头位置数值为1Blocks[newHeadX][newHeadY] = 1;//对吃到食物以及蛇尾的处理//吃到食物if (newHeadX == foodX && newHeadY == foodY) {//食物重新随机位置foodX = rand() % (WIDTH - 2) + 1;foodY = rand() % (HEIGHT - 2) + 1;//不对旧蛇尾处理,相当于蛇的长度+1}//没有吃到食物else// 旧蛇尾变成空白,不吃食物时保持蛇的长度不变Blocks[oldTailX][oldTailY] = 0; //灰格 }