0. 写在开头

学习编程也有两三年时间了,中间也玩(学校安排学习)过很多东西 ,从汇编到C到Java和python。用Java和Python也就图一快,真要体会编程乐趣还得看我C语言(开玩笑 )

为什么要用C语言写一个贪吃蛇游戏呢,其实这是我大一时候万姐布置的一个课设,当时就是这个课设,逼着我一个星期“学会了”C语言,但是这段回忆是非常充实有趣的,现在我掌握了新的语言,新的编程思想,回过头来重新做一遍这个课设,感受编程带给我的最初的快乐。

贪吃蛇游戏我相信大家都玩过,具体规则也不用我多说,那么直接开始吧!

1. 如何表示一条蛇

那么如何用C语言表示一条蛇呢?倘若使用Java或者Python这种面向对象语言,我们肯定会为蛇创建一个对象,再添加相应的属性和方法来表示蛇的特征,在C语言中,可以使用结构体来实现相似的功能。

  • 蛇由多节蛇身组成,包括蛇头也算是蛇身,每个蛇身都是一个结构体,我采用循环双链表来表示一条蛇,之所以使用双向循环链表,是为了每一节蛇身可以指向它的下一节蛇身,也可以指向它的上一节蛇身,同时头的上一节是尾巴,尾巴的下一节是头,便于我们遍历操作。类似于:(随意配图,无视苯环)

  • 每一节蛇身有自己的坐标,也有自己运动方向,还有两个分别指向前一节和后一节的指针
  • 蛇的运动方向,我们假设蛇只能向上下左右四个方向运动。
  • 蛇的运动速度,我们假设蛇可以慢速,正常速,快速三种速度 爪巴
  • 蛇的长度,我们记录在蛇的结构体内

2. 具体实现

snake.h头文件中部分内容:

typedef enum direction {up,right,down,left
}Direction;typedef enum speed {slow,normal,fast,
}Speed;//环状双向链表
typedef struct snake_body_node
{int pos_x;int pos_y;Direction dir;struct snake_body_node *previous_node;struct snake_body_node *next_node;
}Snake_Body_Node;typedef struct snake
{int length;Speed speed;Snake_Body_Node *head;
}Snake;

3. 蛇的行为

定义了蛇的表示,那么蛇有哪些行为需要我们实现呢?

毫无疑问,在游戏中,我们要在地图上生成一条蛇,那么一个生成蛇的方法肯定少不了,于是有了

Snake *new_born_snake(int pos_x, int pos_y);

参数pos_xpox_y分别表示最初蛇的位置,这里我将蛇最初的长度设为1,相当于就一脑袋

蛇肯定要移动,蛇在移动的时候,直观上蛇身的全部节点都要移动,但实际则不然,只有两节蛇身是需要变化的,一节是脑袋,一节是蛇尾,其余的蛇身移动的位置其实都是其上一个蛇身移动前的位置,那么我们可以不管这些节点,我们需要做的就是新建一个蛇头,去掉蛇尾。

void add_head_node(Snake* snake, int pos_x, int pos_y);
void remove_tail_node(Snake* snake);
void move(Snake* snake, Direction dir, int pos_x, int pos_y);
void eat(Snake* snake, Direction dir, int pos_x, int pos_y);

蛇吃到食物需要生长,我们就假设食物的位置变为一节蛇身(蛇头),尾巴不去掉,那么用上面add_head_node方法同样可以实现。

4. 具体实现

snake.c

#include "snake.h"struct  snake * new_born_snake(int pos_x, int pos_y)
{Snake* new_snake = (Snake*)malloc(sizeof(Snake));Snake_Body_Node *head = mknode();new_snake->length = 1;new_snake->speed = normal;head->dir = up;head->pos_x = pos_x;head->pos_y = pos_y;new_snake->head = head;head->next_node = head;head->previous_node = head;return new_snake;
}void add_head_node(Snake* snake, int pos_x, int pos_y)
{Snake_Body_Node *head = snake->head;Snake_Body_Node *body = mknode();body->pos_x = pos_x;body->pos_y = pos_y;body->dir = head->dir;body->previous_node = head->previous_node;head->previous_node->next_node = body;head->previous_node = body;body->next_node = head;snake->head = body;snake->length++;
}void remove_tail_node(Snake* snake)
{Snake_Body_Node *head = snake->head;Snake_Body_Node *tail = head->previous_node;head->previous_node = tail->previous_node;tail->previous_node->next_node = head;free(tail);snake->length--;
}void destroy_snake(Snake* snake)
{Snake_Body_Node* head = snake->head;while (head != head->next_node) {free(head);head = head->next_node;}free(head);free(snake);
}Snake_Body_Node* mknode()
{Snake_Body_Node* node = (Snake_Body_Node*)malloc(sizeof(Snake_Body_Node));if (node == NULL){printf("out of memory");exit(1);}return node;
}void move(Snake* snake,  Direction dir, int pos_x, int pos_y) {Sleep(700 - snake->speed * 300);snake->head->dir = dir;add_head_node(snake, pos_x , pos_y);remove_tail_node(snake);
}void eat(Snake* snake, Direction dir, int pos_x, int pos_y) {Sleep(700 - snake->speed * 300);snake->head->dir = dir;add_head_node(snake, pos_x, pos_y);
}

5. 在游戏中控制蛇,下篇揭晓。。。。。

一下篇链接

再来一次的C语言贪吃蛇小游戏(一)相关推荐

  1. 再来一次的C语言贪吃蛇小游戏(三)

    8.游戏的不同界面 为了便于实现主要功能,之前我们所有的状态控制都是放在游戏中,但实际上我们应该把这些状态控制抽离出来,通过菜单来控制,以便在不同游戏界面间切换. 菜单界面 游戏界面 排行榜 游戏结束 ...

  2. 再来一次的C语言贪吃蛇小游戏(二)

    5.游戏地图 贪吃蛇的游戏地图由一个个方格组成,每一格方格可以表示地面,墙,食物,蛇的身体等等,蛇只能在地面上行动,吃到食物则生长一节蛇身,撞到墙就GG. 我们可以同样可以使用枚举来表示地图上的不同物 ...

  3. C语言小游戏大全,C语言贪吃蛇小游戏(附源码)

    一.C语言小游戏大全,C语言贪吃蛇小游戏(附源码) 贪吃蛇小游戏源码和更多C语言课设项目小游戏源码免 费 下 载 链 接 如下: c语言项目课设小游戏源码资料压缩包.zip-C文档类资源-CSDN下载 ...

  4. c语言贪吃蛇小游戏的简易实现

    命令行界面通过打印字符实现了贪吃蛇游戏的基本功能 代码仅130行 实现原理为,采用链式单调数列在矩阵地图中储存为蛇的坐标信息. //贪吃蛇的实现原理在于,将蛇在矩阵中的点表示为正数,并且由蛇尾到蛇头是 ...

  5. c语言--贪吃蛇小游戏

    第一步:下载visual 2019编程软件 和 Easyx 第二步:设置头文件: 编写代码: 首先得做一个看得过去的运行窗口: initgraph(680, 480); //设置背景颜色 setbkc ...

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

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

  7. c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

    /* *程序名称:贪吃蛇v2.1 *程序描述:一个简易的贪吃蛇小游戏 *版本信息:v2.1 *v1.1版本更新:1:加入菜单选择项 *v1.2版本更新:1:修复菜单选择bug *v1.3班本更新:1: ...

  8. c语言贪吃蛇打包到桌面,C语言实现桌面贪吃蛇小游戏

    本篇写的是桌面贪吃蛇小游戏,大家自己看吧,感谢大家的支持,谢谢!O(∩_∩)O~~ #define _CRT_SECURE_NO_WARNINGS #include #include #include ...

  9. C语言实现贪吃蛇小游戏1.0

    C语言实现贪吃蛇小游戏1.0 贪吃蛇游戏要有三个东西:边框.蛇.食物 还有两个灵魂的东西:光标的移动与按键监控 一.光标的移动 在我看来在控制台上移动光标画图是实现这个小游戏的灵魂了,在这之前我一直以 ...

最新文章

  1. 【转】Visual Studio团队资源管理器 Git 源码管理工具简单入门
  2. MYSQL查询数据中通讯最多的两个人
  3. cookie工具类 java_springboot封装JsonUtil,CookieUtil工具类代码实例
  4. 美团面试动态规划——整数拆分
  5. 宝塔执行sh文件_宝塔面板未授权访问
  6. ITK:对给定LabelMap的所有LabelObject应用形态学关闭操作
  7. linux 内核 性能,Linux内核十个版本性能对比
  8. Hbase完全分布式高可用集群安装配置
  9. 给你出道题---如何蒙题
  10. python3.6字典有序_为什么Python3.6字典变得有序了?
  11. markdownpad 2 的使用
  12. ARM处理器是有益补充
  13. office VBA 学习
  14. # 深圳杯D题爬取电视收视率排行榜
  15. 注意力机制学习 BAM
  16. 如何理解CRM软件里的销售机会与线索
  17. 全国CSM敏捷教练认证将于2023年3月25-26开班,报名从速!
  18. Asp.net Core 6.0 使用EF DB First 连接mysql
  19. 简易版走迷宫(c语言)
  20. DB2进行压缩的最佳实践

热门文章

  1. dos命令关闭所有dos窗口
  2. 解决django.db.utils.InternalError: (1049, Unknown database 'exam_db')
  3. 多行匹配.+表示分组的错误
  4. struts1 几种Action父类的比较
  5. 关于Ajax 错误:'sys'未定义解决方法.
  6. qt combox 向上弹出_一睹芳容!人类首次拍到活的公羊角乌贼 手臂和触须向上飞速穿过水柱...
  7. 【数字信号处理】线性常系数差分方程 ( 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 “ 线性时不变系统 “ 案例 | 根据 “ 线性时不变系统 “ 定义证明 )
  8. 【Flutter】FutureBuilder 异步编程 ( FutureBuilder 构造方法 | AsyncSnapshot 异步计算 )
  9. 【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★
  10. 【DBMS 数据库管理系统】数据仓库 ( 数据仓库简介 | 操作型数据与分析性数据对比 | 数据仓库特征 | 特征一 : 面向主题组织数据 | 面向应用 | )