贪吃蛇是个非常经典的游戏,用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用来显示,这样就可以保证不会出现闪屏。

除了写贪吃蛇,可以用这个方法写其他小程序,挺有意思的。

----END----

往期好文合集

学C/C++语言,32个必备修养!<<戳这里

用覆铜板雕个女朋友。<<戳这里

C语言八大排序算法,附动图和详细代码解释!<<戳这里

最 后

若觉得文章不错,转发分享,也是我们继续更新的动力。

5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等

在公众号内回复「更多资源」,即可免费获取,期待你的关注~

长按识别图中二维码关注

C语言写个贪吃蛇游戏相关推荐

  1. 好玩的c语言编程游戏,C语言写个贪吃蛇游戏

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言写个贪吃蛇游戏 贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面 ...

  2. bat贪吃蛇游戏代码_C语言写个贪吃蛇游戏

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

  3. x x x x c程序语言,C语言写个贪吃蛇游戏

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

  4. 用c语言写一个贪吃蛇游戏代码

    首先,贪吃蛇是一个经典的游戏,主要通过控制一条蛇在地图上吃食物,不断长长身体,最终实现最高分数. 以下是使用C语言编写贪吃蛇游戏的示例代码: ``` #include<stdio.h> # ...

  5. 贪吃蛇c语言课程设计报告下载,c语言课程设计-贪吃蛇游戏

    c语言课程设计-贪吃蛇游戏 C 语言课程设计 1 山东交通学院 C 语言课程设计 贪吃蛇游戏 院(系)别 交通与物流工程学院 班 级 物联 131 学 号 130516122 姓 名 王赛 指导教师 ...

  6. 简单贪吃蛇c语言代码,一个C语言写简单贪吃蛇源代码.doc

    一个C语言写简单贪吃蛇源代码 #include #include #include #include #include #include int grade=5,point=0,life=3; voi ...

  7. python写一个游戏多少代码-使用Python写一个贪吃蛇游戏实例代码

    我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到 ...

  8. python游戏脚本实例-使用Python写一个贪吃蛇游戏实例代码

    我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到 ...

  9. python游戏贪吃蛇_Python写的贪吃蛇游戏例子_python

    这篇文章主要介绍了Python写的贪吃蛇游戏例子,练手作品,又好玩又可以学到东西,需要的朋友可以参考下 第一次用Python写这种比较实用且好玩的东西,权当练手吧 游戏说明: * P键控制" ...

最新文章

  1. LeetCode简单题之最常见的单词
  2. 清华北大,已经没人本科就找工作了
  3. Java JDBC
  4. Golang的导包和引用包的问题
  5. iOS12-Swift5-Date转化为String:DateFormatter
  6. error=Error Domain=NSURLErrorDomain Code=-1003
  7. 跨境电子商务独立站如何找到热门的利基市场
  8. 2018 CodeM初赛B轮:D.神奇盘子
  9. pandas 数据分析 相关性_Pandas库学习笔记2-Pandas数据特征分析
  10. DNN与微软同声传译系统背后的故事
  11. [2018.07.24 T1] 真板题
  12. 3306端口被占用解决方式
  13. Oracle 11g 创建数据库
  14. EasyExcel 实现冻结行和列
  15. SuperSlide插件轮播图展示
  16. vue v-for循环表格 希望第四个<th>或<td>标签自动换到下一行应该怎么做?
  17. CSS布局:多种方案实现固定页脚(sticky footer)
  18. 王者服务器维护5月1日,5月30日体验服停机更新公告
  19. 必过SafetyNet!以MIUI开发版系统为例详解Android设备通过SafetyNet校验方法
  20. App 上线被拒绝的原因有哪些?

热门文章

  1. SAP UI5 view.bindElement will also trigger an odata request
  2. SAP UI5 this.oModel.createBindingContext will trigger odata request
  3. SAP OData schema version and backend version
  4. Axure external link打开原理
  5. SAP Success factor自定义launchpad
  6. ubuntu上Nginx的配置
  7. Employee Assign Organization unit
  8. How does ABAP check table work
  9. 为什么S/4HANA的生产订单创建后会自动release
  10. linux未知的类型名 FILE,smb使用 ------转载自http://blog.csdn.net/tlaff/article/details/5463068...