C语言写个贪吃蛇游戏

article/2025/10/26 8:38:08

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

我试了说一下这个代码 核心的三个函数

    menu();setup();draw();

menu用来设置菜单,也就是我们一运行看到的那个。setup用来设置参数,我们需要设置高度和宽度,还有分数,食物的位置。draw也就是画,也就是画整个画面。

还有一个枚举类型 这个结构体用来设置蛇的几个状态,我觉得这个也是面向对象编程的一个思想,把蛇的状态都封装成一个枚举类型。

typedef enum
{STOP = 0,LEFT,RIGHT,UP,DOWN
}Direction;

还有

/*判断贪吃蛇的长度*/
void logic()

这个函数,这个函数应该是整个贪吃蛇的精髓了,要理解代码怎么把蛇给连接起来。用了点巧妙的东西。

来看这里面的关键代码

/*把上一个位置记下*/int lastX = tailX[0];int lastY = tailY[0];int last2X, last2Y;/*重新获取当前的位置*/tailX[0]=x;tailY[0]=y;int i=0;/*遍历整条蛇的长度 把 0 的位置空出来,其余蛇的位置往后面的空间移动*/for(i=1; i<ntail;i++){last2X = tailX[i];last2Y = tailY[i];tailX[i]=lastX;tailY[i]=lastY;lastX = last2X;lastY = last2Y;}

lastX lastY 用来存上一次的蛇头的位置。后面的 for 循环,通过tail 蛇的长度,把蛇上个状态给保存到数组tailX tailY里面。

完整代码


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <Windows.h>
#include <time.h>
#include <conio.h> /*键盘输入获取*/bool gameOver;
bool stop = false;
bool hit = false;
/*游戏的边框大小*/
const int width = 50;
const int height = 20;
/*蛇的坐标,食物的坐标还有分数*/
int x,y,fruitX,fruitY,score;
/*蛇每个点的坐标*/
int tailX[200],tailY[200];
/*蛇的默认长度*/
int ntail=3;typedef enum
{STOP = 0,LEFT,RIGHT,UP,DOWN
}Direction;Direction Dir;
/*开始菜单*/
void menu()
{int a;printf("------------------------------------------------------------------\n");printf("|                              贪吃蛇游戏                        |\n");printf("|                              1) 新游戏                         |\n");printf("|                              2) 开始边界                       |\n");printf("|                              3) 退出游戏                       |\n");printf("------------------------------------------------------------------\n");printf("---->请输入你的选择:");scanf("%d", &a);
}/*初始化状态*/
void setup()
{gameOver = false;/*根据当前时间设置“随机数种子”*/srand(time(NULL));Dir = STOP;/*贪吃蛇的位置,固定在中间*/x= width/2;y= height/2;/*食物的位置,位置是随机的*/fruitX = rand()%width;fruitY = rand()%height;score = 0;
}
/*绘制界面*/
void draw()
{if(stop == true){return;}system("cls");/*清除屏幕*/printf("分数:%d",score);printf("\n");/*第一行*/int i;for(i= 0 ;i<width+1;i++){printf("-");}printf("\n");/*画中间的画面*/int p;for(p= 0 ;p<height;p++)/*高度*/{int q;for(q= 0 ;q<width;q++)/*宽度*/{/*第一行最后已给字符*/if(q==0 || q==width-1){printf("|");}if(p == fruitY && q == fruitX)/*食物的随机坐标*/{printf("O");}else{int k=0;bool print = false;/*贪吃蛇的长度 默认长度是 3*/for(k=0;k<ntail;k++){if(tailX[k]==q && tailY[k]==p){printf("*");print = true;}}/*如果这个位置打印了 * 就不要打印空格了*/if(!print){printf(" ");}}}printf("\n");}/*最后一行*/int j;for(j= 0 ;j<width+1;j++){printf("-");}}
/*按键输入控制*/
void input()
{if(_kbhit()){/*获取键盘的输入字符*/switch(_getch()){case '4':case 75:/*左键*/Dir = LEFT;hit= true;break;case '8':case 72:/*上键*/Dir = UP;hit= true;break;case '6':case 77:/*右键*/Dir = RIGHT;hit= true;break;case '2':case 80:/*向下键盘键 */Dir = DOWN;hit= true;break;case 'x':case 27:/*ESE*/gameOver = true;break;case 32:/*空格 暂停键*/stop = !stop;break;}}else if(!hit && stop == false)/*如果没有改变方向*/{x++;}
}
/*判断贪吃蛇的长度*/
void logic()
{if(stop == true){return;}/*把上一个位置记下*/int lastX = tailX[0];int lastY = tailY[0];int last2X, last2Y;/*重新获取当前的位置*/tailX[0]=x;tailY[0]=y;int i=0;/*遍历整条蛇的长度 把 0 的位置空出来,其余蛇的位置往后面的空间移动*/for(i=1; i<ntail;i++){last2X = tailX[i];last2Y = tailY[i];tailX[i]=lastX;tailY[i]=lastY;lastX = last2X;lastY = last2Y;}/*根据方向来改变x y 的值*/switch(Dir){case UP:y--;break;case DOWN:y++;break;case LEFT:x--;break;case RIGHT:x++;break;}if(x<0 || width<x || y<0 || height<y){gameOver = true;/*清除屏幕*/system("cls");printf("------------------------------------------------------------------\n");printf("|                                                                |\n");printf("|                                                                |\n");printf("|                             游戏结束                           |\n");printf("|                                                                |\n");printf("|                                                                |\n");printf("------------------------------------------------------------------\n");}if(x==fruitX && y==fruitY){/*吃了一个食物,蛇的长度增加1*/ntail++;score+=10;/*更新下一个食物的位置*/fruitX = rand()%width;fruitY = rand()%height;}
}
int main()
{
#if 0while(1){printf("%d\n",_getch());}
#endifmenu();setup();draw();/*循环画贪吃蛇的界面*/while(!gameOver){draw();input();logic();Sleep(70);}return 0;
}

上面这段代码直接在Dev C++上面应该是可以运行的,很多人在知乎上私信问我,为什么我的贪吃蛇执行不了呢,可能就是平台不同,少了这个头文件,少了那个头文件,但是你为什么不能跟我一样,用Dev C++呢,轻量级,简单。代码的精髓是什么?我认为精髓一定是思想,不是你写了多少行代码,用了什么高端的IDE。

我自认为我的注释已经写得不错了,所以就没有什么好说明的了吧,有不明白的把代码过一下,至于屏幕刷新这个东西,如果只是用时间刷新就会闪屏,所以出现了一个双缓存,把要显示的东西送到一个buff里面去,另一个buff用来显示,这样就可以保证不会出现闪屏。除了写贪吃蛇,可以用这个方法写其他小程序,挺有意思的。

在知乎上,发起了一个C语言 100 行代码之内实现贪吃蛇的问题。我觉得很不错,里面很多同学的回复都非常赞,特别是叶大神的回复。

https://www.zhihu.com/question/360814879/answer/1013986215


扫码或长按关注

回复「 篮球的大肚子」进入技术群聊


http://chatgpt.dhexx.cn/article/2cY2V21u.shtml

相关文章

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; 由于作者水平…

贪吃蛇(C语言实现)

文章目录 游戏说明游戏效果展示游戏代码游戏代码详解游戏框架构建隐藏光标光标跳转初始化界面颜色设置初始化蛇随机生成食物打印蛇与覆盖蛇移动蛇游戏主体逻辑函数执行按键判断得分与结束从文件读取最高分更新最高分到文件主函数 游戏说明 游戏界面当中没有打印相关的按键说明…

SDRAM控制器(初始化)

SDRAM控制器&#xff08;初始化&#xff09; 文章目录 SDRAM控制器&#xff08;初始化&#xff09;初始化模块时序逻辑图代码仿真结果 初始化模块 SDRAM 在上电之后&#xff0c;执行正常操作之前需要被初始化&#xff0c;实际上就是对上文提到的SDRAM 内部逻辑控制单元进行初始…

SDRAM 控制器设计基本完结

项目可以拓展的地方&#xff1a; 1、接口为AXI 2、接口为AXI与AXI DMA 交互 2、优化读写时序&#xff0c;使得SDRAM输出效率最大&#xff1b; 总结&#xff1a; 项目不足&#xff1a;没有进行效率的优化&#xff0c;无地址映射&#xff0c;无外接交互接口&#xff0c;功能单一…

SDRAM读写控制

SDRAM读写控制器&#xff0c;这里分为三个部分&#xff0c;分别是SDRAM的基本操作实现&#xff0c;SDRAM控制器&#xff0c;封装成FIFO,以方便使用。 一、SDRAM的基本操作&#xff1a;初始化模块、自动刷新模块、写操作模块、读操作模块、SDRAM仲裁模块&#xff0c;顶层模块。 …

SDRAM 控制器(二)——初始化模块

1、初始化模块 SDRAM 的初始化是芯片上电后必须进行的一项操作&#xff0c;只有进行了初始化操作的 SDRAM 芯片才可被正常使用。SDRAM 的初始化是一套预先定义好的流程&#xff0c;除此之外的其 他操作会导致 SDRAM 出现不可预知的后果。 初始化时序图&#xff1a; CK&#xf…

SDRAM详细介绍

概念介绍&#xff1a; SDRAM&#xff1a;Synchronous Dynamic Random Access Memory&#xff0c;同步动态随机存储器。同步是指其时钟频率和CPU前端总线的系统时钟相同&#xff0c;并且内部命令的发送与数据的传输都以它为基准&#xff1b;动态是指存储阵列需要不断的刷新来保证…

sdram简易控制器设计

耗时一周&#xff0c;终于完成sdram简易控制器的所有代码设计&#xff0c;其中感谢开源骚客 – 邓堪文老师在b站发布的相关视频学习教材&#xff1b;其中仿真模块及所使用到的sdram仿真文件来源于开源骚客&#xff1b; 因为时间较为紧迫&#xff0c;其中就不做代码的一些注释&…