【C语言】贪吃蛇小游戏代码详解

article/2025/10/25 21:52:30

贪吃蛇的规则大家应该都知道,简单来说就是吃到食物则蛇身增长,蛇可以在游戏区域内随意移动。游戏结束条件就是蛇撞到边界或者撞到自己色蛇身。
在这里插入图片描述

首先,实现一个函数,这个函数的作用是将光标移动到我们所期望的位置

/**  控制光标所在的位置*/
void gotoxy(int x, int y)
{COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

构建结构体对象

设计这个游戏,最重要的两个对象就是蛇和食物,因此用两个结构体来代表这两个对象。食物只关注其坐标位置,蛇的话,成员包括坐标数组,长度和分数。

// 定义游戏区域的边界宽度
#define   WIDTH        100
#define   HIGH         20
// 定义蛇的最大长度
#define   MAX_LENGHT   100
// 定义游戏初始速度
#define   SPEED        500// 定义游戏中的两个对象:食物和蛇
struct
{int x;int y;
}food;struct
{int len;int x_buf[MAX_LENGHT];int y_buf[MAX_LENGHT];int score;
}snake;// 要用到的全局变量
int food_flag = 0;
int key = 72;

初始化游戏边界和小蛇

这个没什么难度,就是循环打印,直接放代码。

/* *  绘制游戏区域边界*/
void DrawMap(void)
{int x, y;for (x = 0; x < WIDTH + 4; x += 2){y = 0;gotoxy(x, y);printf("■");y = HIGH + 2;gotoxy(x, y);printf("■");}for (y = 1; y < HIGH + 2; y++){x = 0;gotoxy(x, y);printf("■");x = WIDTH + 2;gotoxy(x, y);printf("■");}// 将光标移出游戏区域gotoxy(0, HIGH + 5);
}

注意最后一行使用gotoxy函数移动函数很重要,不然光标会在游戏区域内持续闪烁,在退出游戏时,甚至会出现显示问题。(为了避免遗漏,我基本在每个涉及到光标移动的函数最后都加了这句话)

/**  初始化小蛇*/
void CreateSnake(void)
{int orgin_x, orgin_y;orgin_x = WIDTH / 2 + 2;orgin_y = HIGH / 2 + 1;snake.len = 3;snake.x_buf[0] = orgin_x;snake.y_buf[0] = orgin_y;snake.x_buf[1] = orgin_x;snake.y_buf[1] = ++orgin_y;snake.x_buf[2] = orgin_x;snake.y_buf[2] = ++orgin_y;snake.score = -1;int i;for (i = 0; i < snake.len; i++){gotoxy(snake.x_buf[i], snake.y_buf[i]);printf("■");}gotoxy(0, HIGH + 5);
}

生成食物

我使用一个标志位food_flag来代表区域内是否存在食物(初始时刻,以及蛇吃到食物时,food_flag为0)。当food_flag为0时就执行生成食物的操作。由于要保证游戏的随机性,用随机数来生成食物坐标。

/**  当游戏区域内不存在食物时,随机创造一个食物*/
void CreateFood(void)
{if (food_flag == 0){int flag = 0,i;do{srand((unsigned int)time(NULL));food.x = (rand() % (WIDTH/2))*2 + 2;food.y = rand() % HIGH + 1;// 判断生成的食物是否和蛇身重合for (i = 0; i < snake.len; i++){if (snake.x_buf[i] == food.x && snake.y_buf[i] == food.y){flag = 1;break;}}} while (flag);gotoxy(food.x, food.y);printf("★");// 吃到食物,则分数加1snake.score++;food_flag = 1;}gotoxy(0, HIGH + 5);
}

实现的方法都大同小异,但是我强调的点是随机生成坐标的实现。由于字符"■"是占两位,所以横坐标必须为2的倍数。其他的帖子里一般是用以下方法

food.x = rand() % WIDTH + 2;
food.y = rand() % HIGH + 1;

然后通过while循环来判断x是否适合要求,不符合就重新生成。但这种做法会出现一种问题,游戏进行过程中会出现卡顿的效果。主要原因就是奇偶数出现概率各占50%,因此有大概率出现多次的循环操作。
我的方法如下,这样的好处是可以保证生成的横坐标一定是偶数。避免了大量的循环操作。

food.x = (rand() % (WIDTH/2))*2 + 2;
food.y = rand() % HIGH + 1;

移动小蛇

首先要对snake对象中坐标缓存区内的坐标进行后移,以便装入新的坐标。在此要分两种情况,一是小蛇没吃到食物,则抹去最后一节,在头部加入新坐标;二是小蛇吃到食物,则不删去最后一节。

void SnakeMove(int x, int y)
{// 判断是否吃到食物,吃到长度加1if (!food_flag)snake.len++;// 没吃到则抹去最后一节else{gotoxy(snake.x_buf[snake.len - 1], snake.y_buf[snake.len - 1]);printf("  ");}int i;for (i = snake.len - 1; i > 0; i--){snake.x_buf[i] = snake.x_buf[i - 1];snake.y_buf[i] = snake.y_buf[i - 1];}snake.x_buf[0] = x;snake.y_buf[0] = y;gotoxy(snake.x_buf[0], snake.y_buf[0]);printf("■");gotoxy(0, HIGH + 5);
}

随后根据用户按键,改变小蛇前进方向。这块部分代码也是我移植过来的,有详细的注释,就不在这赘述了。

void move()
{int pre_key = key, x, y;if (_kbhit())//如果用户按下了键盘中的某个键{fflush(stdin);//清空缓冲区的字符//getch()读取方向键的时候,会返回两次,第一次调用返回0或者224,第二次调用返回的才是实际值key = _getch();//第一次调用返回的不是实际值key = _getch();//第二次调用返回实际值}// 小蛇移动方向不能和上一次的方向相反if (pre_key == 72 && key == 80)key = 72;if (pre_key == 80 && key == 72)key = 80;if (pre_key == 75 && key == 77)key = 75;if (pre_key == 77 && key == 75)key = 77;switch (key){case 75:x = snake.x_buf[0] - 2;//往左y = snake.y_buf[0];break;case 77:x = snake.x_buf[0] + 2;//往右y = snake.y_buf[0];break;case 72:x = snake.x_buf[0];y = snake.y_buf[0] - 1;//往上break;case 80:x = snake.x_buf[0];y = snake.y_buf[0] + 1;//往下break;}if (x == food.x&&y == food.y)food_flag = 0;SnakeMove(x, y);
}

检查游戏进程

主要是包括两个方面,(1)失败:小蛇撞墙或者撞到自己的身体;(2)成功:小蛇长度达到最大长度。

void check(void)
{int i;// 失败条件if (snake.x_buf[0] == 0 | snake.x_buf[0] == WIDTH + 4 | snake.y_buf[0] == 0 | snake.y_buf[0] == HIGH + 2){printf("Game Over!\n");exit(0);}for (i = 1; i < snake.len; i++){if (snake.x_buf[0] == snake.x_buf[i] && snake.y_buf[0] == snake.y_buf[i]){printf("Game Over!\n");exit(0);}}// 胜利条件if (snake.len == MAX_LENGHT){printf("Your are win!\n");exit(0);}// 打印得分gotoxy(0, HIGH + 6);printf("Your score: %d", snake.score);
}

主函数

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>
#include <conio.h>int main(void)
{DrawMap();CreateSnake();while (1){CreateFood();move();// 用于控制游戏的速度Sleep(SPEED - 2 * snake.len);check();}
}

http://chatgpt.dhexx.cn/article/9IZsYXtt.shtml

相关文章

乐趣c语言——贪吃蛇

目录 ​ 1.游戏介绍与思路 1.1介绍&#xff1a; 1.2游戏区思路 1.2.1围墙 1.2.2游戏区域 1.2.3蛇头与蛇身 1.3游戏逻辑思路 2.正式实现贪吃蛇 2.1在开始前我们先包头文件和宏定义 2.2创建游戏区并且初始化 2.3初始化蛇头与蛇身 2.4打印与覆盖蛇 2.5实现蛇的移动 2…

C语言制作小游戏——贪吃蛇

直接上代码 ​ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h> #include <time.h> #include <windows.h>//MAXWIDTH、MAXHEIGHT、INITLEN 以字符记 #define MAXWIDTH (30) #define MAXHEIGHT MAXWIDTH #d…

C语言之贪吃蛇游戏源码

贪吃蛇游戏是我编程以来做的第一个游戏&#xff0c;很兴奋&#xff0c;我记得当时我一直最求代码数量的最小化&#xff0c;即以最少的代码实现功能&#xff0c;有的时候&#xff0c;对换行、括号之类的都下手&#xff0c;呵呵&#xff0c;现在想想都想笑&#xff0c;那些年让我…

c语言贪吃蛇(简易版本含完整代码)

文章目录 前引头文件注释部分头文件部分主函数部分实现效果 前引 这个贪吃蛇是在我学完C语言的基本部分 在跟着哈工大的c语言程序设计Mooc课程完了之后做的 因为学完C语言很迷茫 不晓得应该学什么 学校里面的题库感觉刷起来又没有实际我能看到的东西 我认为在阶段性的学习过程中…

C语言实现简单贪吃蛇代码

基本构成 穿墙控制 死亡控制 初始化蛇&#xff08;init_snake函数&#xff09; 移动蛇&#xff08;move_snake函数&#xff09; 打印蛇&#xff08; print_snake函数&#xff09; 利用for循环检测坐标对应的蛇的位置 代码演示 #include <stdio.h> #include <window…

C语言实现贪吃蛇

C语言实现贪吃蛇 贪吃蛇项目是在b站的一位老师那里边学边敲的&#xff08;现在视频被老师删掉了&#xff09;&#xff0c;在这里记录一下代码和学习时的一些思考&#xff0c;希望自己以后能用链表将贪吃蛇实现。 思考过程&#xff1a; 贪吃蛇 C语言实现 1.打印首页 --FirstP…

C语言写个贪吃蛇游戏

贪吃蛇是个非常经典的游戏&#xff0c;用C语言来实现也是一个好玩的事情。这个游戏我写完后放在知乎&#xff0c;竟然点赞的人数超级多。我觉得大家喜欢&#xff0c;一个方面是因为写得简单&#xff0c;大家都能看得懂&#xff0c;一个可扩展性还是非常强的。 我试了说一下这个…

C语言实现贪吃蛇小游戏(详解)

目录 一、程序实现的原理&#xff1a; 二、预备知识 1、控制台窗口 2、通过代码将光标移动到控制台指定位置 三、 程序框架 四、具体操作 1、定义相关头文件 2、定义函数结构以及相关属性 五、完成各代码块 1、 实现将光标移到指定位置的操作 2、 打印游戏边框以及游戏初始…

小白入门——“贪吃蛇”的C语言实现(详细)

C语言实现&#xff0c;编译环境VS&#xff12;&#xff10;&#xff11;&#xff17; 附&#xff1a;easyx图形化(文章末尾&#xff09; 效果图如下 &#xff08;有一些函数kbhit&#xff0c;getch&#xff0c;在这表示为_kbhit与_getch&#xff09;//不同编译器原因 注意在Dev…

【C语言】贪吃蛇游戏的实现(一)

&#xff08;注意&#xff1a;本代码是在VC6.0环境下编译的&#xff0c;在其他环境如codeblocks下运行可能会产生意想不到的问题&#xff0c;请尽量使用VC。至于为什么要使用VC编译&#xff0c;哦&#xff0c;我亲爱的朋友&#xff0c;这只有上帝才知道&#xff09; 最近由于小…

C语言贪吃蛇 新手入门(超详细)

贪吃蛇小程序&#xff0c;主要采用C语言描述&#xff0c;采用数组进行数据存储的图形化操作界面&#xff0c;会涉及一点点C 知识&#xff08;特别少的一点点&#xff09;&#xff0c;但是有C语言基础就够用了&#xff0c;编译器&#xff1a;VS2015&#xff0c;会涉及部分库函数…

C语言实现的贪吃蛇(无EasyX,详解)

&#x1f4a6;前言 或许厌倦了枯燥的做题&#xff0c;那就学学贪吃蛇&#xff0c;激发你的学习乐趣吧~ 你将进一步加深对结构体&#xff0c;单链表&#xff0c;函数&#xff0c;循环等基础的理解。 希望对你有所帮助~ 纯C实现的贪吃蛇&#x1f40d; &#x1f4a6;前言&#x1f…

教你如何用C语言做一个简单的贪吃蛇

小时候大家可能都玩过贪吃蛇&#xff0c;但有没有想过自己做一个出来玩玩看。今天我们就教大家用C语言做一个简单的贪吃蛇游戏。这里没有采用图形界面去做&#xff0c;而是采用win32控制台。 首先&#xff0c;先把做好的游戏初始界面和游戏截图先展示一下。 游戏初始界面如图&a…

C语言实现贪吃蛇(简易)

文章目录 目录 文章目录 前言 一、游戏功能和效果 1.游戏功能 2.游戏效果 二. 游戏初步实现 1.确定地图大小 2.创建蛇对象&#xff0c;食物对象 3.初始化蛇 4.生成随机食物 5.画蛇 6.画食物 7. 游戏内移动控制 1.当按上下左右时移动方向改变 。 2.开始游戏时的默认方向 8.判…

C语言贪吃蛇小游戏,贪吃蛇C语言代码实现大全

一、C语言贪吃蛇代码实现前言 设计贪吃蛇游戏的主要目的是让大家夯实C语言基础&#xff0c;训练编程思维&#xff0c;培养解决问题的思路&#xff0c;领略多姿多彩的C语言。 贪吃蛇是非常经典的一款游戏&#xff0c;本次我们模拟在控制台实现贪吃蛇游戏&#xff0c;也就是实现…

C语言实现贪吃蛇[内附详细步骤]

C语言贪吃蛇项目 今天给分享一下使用C语言写个贪吃蛇小游戏&#xff0c;主要包含以下10部分内容&#xff1a; 1、windows光标定位与隐藏 2、欢迎界面 3、打印围墙 4、产生食物 5、初始化蛇身 6、响应按键 7、蛇身运动 8、碰撞检测 9、结束界面 10、程序运行 windows…

C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享

贪吃蛇&#xff08;也叫做贪食蛇&#xff09;游戏是一款休闲益智类游戏&#xff0c;有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋&#xff0c;从而使得蛇变得越来越长。 我们的今天的目标就是&#xff1a;用C语言来实现一个贪吃蛇项目&#xff0c;也不用…

C语言 贪吃蛇

基于C语言编写的贪吃蛇 编写环境&#xff1a;VS2019x86 这是一个基于C语言链表开发的贪吃蛇游戏 其实贪吃蛇游戏要解决的主要问题就是 1、这个游戏的基本组成元素和数据结构 2、如何初始化贪吃蛇并正常行走 3、如何判断事件发生 代码中运用到了键盘虚拟键判断、终端窗口大小的…

游戏贪吃蛇(c语言)

游戏贪吃蛇&#xff08;c语言&#xff09; 一、项目背景二、设计目的三、项目功能需求1、初始化游戏2、控制蛇的运行轨迹3、控制蛇的长度4、控制食物生成5、计算分数6、结束条件 四、系统的功能结构图五、总体设计1、初始化模块2、游戏控制模块3、运行控制模块4、食物生成模块 …

C语言实现贪吃蛇(详细版)

一、需要掌握的知识&#xff1a; C语言基础语法&#xff08;结构体、指针、链表&#xff09;、<windows.h>库、<stdlib.h>库、<time.h>库中的一些函数&#xff08;不需要额外学习&#xff0c;本文后面会讲贪吃蛇需要用到的相关函数&#xff09; 由于作者水平…