首先声明,代码是抄的,代码是抄的,代码是抄的,重要的事情说三遍。。

如果有侵权请联系我删除。。

贴原作者的视频。

在b站看的,视频找不到了,我等下会贴代码。。

先分析一下游戏的数据结构:

1.游戏地图用一个数组bk[20][20]存储,有四种状态。0表示没东西;1表示墙;2表示果实;3表示蛇。

2.用xy[2]来存放蛇前进的坐标,xy[0]表示横坐标,xy[1]表示纵坐标。。

3.move[20][20]表示蛇的运动轨迹。也是在和地图一样的格子上,其中move[0][0]记录当前的步数.这个主要是用来刷新蛇使用。

3.look[4]用来记录游戏的各种数据,look[0]为朝向,look[1]为蛇的长度,look[2]为失败判定,look[3]为分数

接下来分析游戏的刷新策略:

1.一开始初始化地图,随机生成果实位置,蛇固定出现在 8,8坐标处。

2.接下来接收移动命令之后进行蛇头位置的刷新。

3.根据move数组的值和蛇的长度进行蛇尾的刷新(实际上每次移动蛇只需要将蛇尾变成地图就行了),这是关键,一定要理解.

举个栗子:

对于这种情况,格子里记录的是轨迹数,一开始在1的位置,刷新一次之后就在2的位置了,加入此时蛇的长度为1,那么1 == 2 -1,那么判定蛇尾已经不在1的位置而跑到2的位置了。(可以自行将2替换成x+1,1替换成x,这样有普遍意义)

分析完了,接下啦贴代码:

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
//方向键的ASCLL值:上72,左75,右77,下80
//背景颜色的代码: 0=黑色  1蓝色 2 绿色 3湖蓝色 4红色 5紫色 6黄色 7白色 8灰色 9淡蓝色
//**改变当前光标方块的背景颜色和字体颜色**//
void BackGround(unsigned int ForeColor = 7, unsigned int BackGroundColor = 0) {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);  //获取控制台的句柄SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改变当前光标的背景和字体颜色
}//**改变光标的位置**//
void gotoxy(int x, int y) {HANDLE handle;COORD coord;   //获取坐标轴结构体coord.X = x;coord.Y = y;handle = GetStdHandle(STD_OUTPUT_HANDLE);  //获取控制台句柄,值为-11SetConsoleCursorPosition(handle, coord);   //移动光标到x,y处
}//**初始化地图数据**//
void restart(int bk[20][20], int look[4], int move[20][20]) {//bk为总的地图数据记录整个地图,为1时表示墙体,为2时表示果实,为3时表示蛇//look记录数据,为0时表示朝向,为1时表示长度,为3时表示胜负情况,为4表示分数//move记录蛇走过的路程,用来打印蛇时判断用int pp, qq;  //用来记录获取的随机坐标//接下来要初始化整个地图//for(int i=0;i<=16;i++)for (int j = 0; j <= 16; j++) {if (i == 0 || i == 16 || j == 0 || j == 16)  bk[i][j] = 1;//1表示墙体else bk[i][j] = 0; //0表示什么都没有move[i][j] = 0;    //该数组用来记录蛇移动的轨迹}//将蛇初始化在8,8坐标上bk[8][8] = 3;move[8][8] = 1;//则此时8,8,上的轨迹就应该记录为1move[0][0] = 1;//用此来记录步数pp = rand() % 15 + 1;//范围是1-15qq = rand() % 15 + 1;bk[pp][qq] = 2;//表示这个位置有果实了look[0] = 1;//表示朝向,向上look[1] = 1;//表示长度look[2] = 0;//当为1是表示失败look[3] = 0;//记录得分//接下来要绘制地图//for(int i=0;i<=16;i++)for (int j = 0; j <= 16; j++) {gotoxy(i * 2, j);//光标移动,每个光标都是矩形switch (bk[i][j]) {case 0:BackGround(0, 0);break;//如果没有东西打印黑色case 1:BackGround(0, 1);break;//墙打印蓝色case 2:BackGround(0, 2);break;//果实打印绿色case 3:BackGround(0, 3);break;//蛇打印湖蓝色default:break;}printf("  ");//地图中直接就是涂空格符}//接下来要显示积分//gotoxy(35, 0);BackGround(7, 0);//用白字黑底打印printf("现在得分是:%d,请再接再厉!^_^", look[2]);
}//**运动主体**//
void map(int bk[20][20], int look[4], int xy[2], int move[20][20]) {//bk是地图信息,look作数据记录,xy记录坐标,move记录蛇的运动轨迹int b[10], qq=0, pp=0;//b用来吸收输入,qq和pp用来随机初始化果实坐标if (kbhit()) {//记录按下的是哪个方向键b[0] = getch();//用b来记录if (b[0] == 224)  b[0] = getch();//如果为224表示为方向键,但是要再一次获取才行if (b[0] == 72 && look[0] != 2)//如果输入的为上并且朝向不为下look[0] = 1;if (b[0] == 80 && look[0] != 1)look[0] = 2;if (b[0] == 75 && look[0] != 4)look[0] = 3;if (b[0] == 77 && look[0] != 3)look[0] = 4;}switch (look[0]) {case 1://往上走xy[1]--;break;case 2://往下走xy[1]++;break;case 3://往左走xy[0]--;break;case 4://往右走xy[0]++;break;}//接下来蛇就开始走动了//move[0][0]++;//蛇的步数加一move[xy[0]][xy[1]] = move[0][0];//记录当前格子中蛇的轨迹gotoxy(35, 2);BackGround(7, 0);printf("横坐标:%d,纵坐标:%d", xy[0],xy[1]);gotoxy(xy[0] * 2, xy[1]);//这里蛇头就往前移动了BackGround(0, 3);//与蛇体一个颜色printf("  ");//如果吃了果实//if (bk[xy[0]][xy[1]] == 2) {look[2]++;//分数加一look[1]++;//长度加一//更新分数gotoxy(35, 0);BackGround(7, 0);printf("现在得分是:%d,请再接再厉!^_^", look[2]);while (bk[pp][qq] != 0) {pp = rand() % 15 + 1;qq = rand() % 15 + 1;}bk[pp][qq] = 2;//将这个地方变为果实gotoxy(pp * 2, qq);BackGround(0, 2);printf("  ");}//如果撞了墙或者自己//if (bk[xy[0]][xy[1]] == 1 || bk[xy[0]][xy[1]] == 3) {look[3] = 1;//表示已经输了gotoxy(6, 6);BackGround(7, 0);printf("你输了,最后得分:%d", look[2]);}bk[xy[0]][xy[1]] = 3;//使这个位置变成蛇//接下来要检测蛇然后刷新蛇的位置//for(int i=0;i<=16;i++)for (int j = 0; j <= 16; j++) {if (move[i][j] == move[xy[0]][xy[1]] - look[1]){//如果符合这个条件,则表示蛇已经移动出这个位置了//要删除这个位置的蛇尾巴//一次只有一个方块会符合要求吧?bk[i][j] = 0;gotoxy(i * 2, j);BackGround(0, 0);printf("  ");break;//一次只找一个}}end:;
}
int main() {int bk[20][20], xy[2], move[20][20], look[4];xy[1] = xy[0] = 8;srand((unsigned) time(NULL));//初始化随机种子system("pause");restart(bk, look, move);while (look[3] == 0) {Sleep(200);//休眠400ms一次map(bk, look, xy, move);}system("pause");printf("游戏结束,谢谢游玩!^_^");return 0;
}

下面是运行界面:

没有对界面进行美化,小伙伴们可以自行进行美化,如果想要让这个界面处于屏幕中间的话,只要定义一个很大的坐标系,然后去中间的坐标点就行了。。

关于FPS显示的想法:

我认为可以在while循环里面进行Fps显示,首先定义一个帧数计数器count,然后进行计时,每当一秒钟的时候,count在屏幕上刷新一次,然后重置为0,每当运行一次map的时候count++。。

C语言实现超简单贪吃蛇(代码是抄的),我做一下讲解相关推荐

  1. 完整版! 大一新手C语言数据结构实现简单贪吃蛇游戏

    大一新手C语言数据结构实现简单贪吃蛇游戏含源代码 贪吃蛇 1.前言简述 2.编写语言及工具 3.游戏的头文件代码(.h) 3.1map.h 3.2snake.h 3.3Food.h 4.游戏的源文件代 ...

  2. python贪吃蛇代码课程设计_c语言课程设计之贪吃蛇代码及思路 c语言课程设计报告之贪吃蛇...

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8846529.html 注:本文档需与c语言课程设计之贪吃蛇文档配套使用.c语言实现贪吃蛇代码可 ...

  3. c语言程序员写贪吃蛇代码28,厉害了,程序员28行代码写贪吃蛇游戏,附源码!...

    对于贪吃蛇游戏,大家基本上都玩过,但是作为一个程序员,大家是否想过要自己去写一个贪吃蛇,毕竟玩别人写的游戏和自己写的游戏是两种截然不同的感受,而且也可以通过制作来提升自己的技术! 其实贪吃蛇的逻辑并不 ...

  4. python成长记:写一个自己的超简单贪吃蛇游戏

    本人系python小白,这是我的第一篇博客,一路摸爬滚打,终于入了门.花了两天琢磨,写了这个超简单的容易理解的贪吃蛇游戏,给大家分享自己的理解吧. 简介: 1,老方法用pygame库来画背景,蛇,食物 ...

  5. 微信小程序--超简单贪吃蛇

    上代码: tan.js // pages/tan/tan.js var startX=0; var startY=0; var moveX = 0; var moveY = 0; //移动位置和开始位 ...

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

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

  7. 基于C语言Ncurse库和链表的简单贪吃蛇小游戏

    参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...

  8. c语言安卓贪吃蛇代码下载,C语言贪吃蛇代码

    c语言编写贪吃蛇源代码,简单易懂,文件为VC源代码.如果你正在学习c语言,就来下载吧.很经典的 C语言贪吃蛇代码部分 #include #include #include#include #defin ...

  9. 贪吃蛇的c语言程序码,C语言贪吃蛇代码下载_C语言贪吃蛇代码官方下载-太平洋下载中心...

    C语言编写贪吃蛇源代码,简单易懂,文件为VC源代码.如果你正在学习c语言,就来下载吧.很经典的. C语言贪吃蛇代码原理: 产生一个固定大小没有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的 ...

  10. c语言字符蛇代码,C语言实现贪吃蛇代码

    本文实例为大家分享了C语言实现贪吃蛇代码的具体代码,供大家参考,具体内容如下 #include"stdafx.h" #include #include #include #incl ...

最新文章

  1. 在Fabric ChainCode中导入第三方包(以状态机为例)
  2. 推荐系统的应用案例剖析
  3. Java8的十大新特性
  4. Android将允许纯C/C++开发应用
  5. Oracle分页排序数据混乱原因及解决
  6. 微服务系列实践 .NET CORE
  7. 编写干净的测试–验证或不验证
  8. ipfs c++client
  9. 记录——《C Primer Plus (第五版)》第九章编程练习第六题
  10. ExtJS之EditorGridPanel
  11. java远程关机代码_使用shutdown命令实现局域网内远程关机、重启整蛊他人
  12. 物理机是什么?跟云服务器有什么区别
  13. win10系统下计算器界面变成英文的解决方法
  14. yapi在centos下的部署安装 后台启动(亲自动手实践)
  15. Python实例29:利用python自动创建多个Excel表格
  16. Airbnb创始人:屌丝的逆袭之路
  17. Eclipse快捷键,IDEA中使用Eclipse快捷键
  18. java时区问题_Java时区问题
  19. linux--挂载,解挂
  20. uni-app开发流程一(项目搭建)

热门文章

  1. AXURE9最全的WEB设计元件库(分享版).rplib
  2. PHP开发之留言板项目的一般流程,PHP留言板小项目(大作业)
  3. CSU 2124智慧树(建图+BFS)
  4. 2019美赛B题完整论文
  5. 已知平面上两点坐标及半径,求过两点圆弧的圆心坐标
  6. java反射(面试题)
  7. 复习和练习2 连接查询,子查询,分页查询
  8. 信道编码-RS-CRC-交织(一)
  9. centos 安装 fortran
  10. 零起点学习Linux系列培训视频 [共61课] (万分感谢寒冰老师分享!)