链表贪吃蛇

SNAKE

####具体代码(码云)https://gitee.com/ych0246/c_language_hz114/blob/master/tanchishe/main4.c

#1.运行环境
##此项目在Linux系统下运行(使用虚拟机:Oracle VM Virtualbox)
##使用编译器为GCC,使用VIM以及Sublime Text进行编辑

#2.基本功能
##(1)通过上下左右操作控制蛇的运动方向
##(2) 蛇运动时头不能碰到墙壁和自己的身体
##(3)产生食物,食物有不同的颜色和不同的形状,不同的食物会导致蛇的运动快慢
##(4)游戏可以暂停
##(5)游戏可以保存进度
##(6)启动游戏时可从保存的进度开始游戏,也可选择重新开始游戏

#3.基本结构的定义

###需要用到的头文件

###通过枚举的方式定义方向

###构建结构体链表来实现蛇的身体和食物的坐标

###颜色的调用设置

###移动到指定坐标位置输出的宏定义

###按键设置,实现界面按键不显示数值,直接输入。
###PrepareComsole函数是打开,而RestoreConsole函数是关闭该设置恢复默认,注意,使用完该功能后的关闭(恢复默认)是必须的,如果忘记,会导致命令行失效以及出错!

#4.实现函数
##(1)main函数的实现
###一、首先实现蛇身体的初始化设置,一个判断语句,实现选择是重新开始游戏,还是继续之前保存的进程继续游戏(此处设置可以参考在后面的文件保存和文件读取模块)。

###二、按键设置打开并清屏
###三、进入循环,实现按键读取,产生食物,实现蛇朝前移动,蛇死亡条件以及显示。

#5.具体模块
###(1)蛇身的初始化设置,首先需要定义一些结构体指针来操作,给其中一个指针申请一个其相应结构体大小的内存空间,然后给其附上相应的坐标值(选择给其幅一定范围内的随机数值),在通过循环for语句实现剩下蛇的身体节点部分(snake_length表示蛇的身体节点个数,是一个全局变量),我这边将该初始化措施设置成了一个函数的形试,传进代表蛇节点的链表头head,返回一个链表。
###(2)游戏区域的设置以及游戏分数和食物种类的显示,通过上述的MOVETO宏定义设置,将光标移到你想要的坐标位置,printf直接输出,就可以显示游戏边框以及游戏各种你想要的提示信息。


###(3)蛇节点和食物的显示,使用while循环,MVOETO到结构体所代表的坐标位置输出蛇的身体,输出一个链表的结构体后,将对应的指针移动到链表的下一个结构体位置,以此实现链表中所有结构体的输出(即输出蛇的所有节点);通过蛇结构体中的成员time实现不同的食物类型的输出。

###(4)蛇的移动设置,我这边选择的方法是将链表的最后一个结构体作为蛇的头部,当蛇向前移动的时候,将后一个结构体的值往链表头部的位置相应移动一个单位(pp->data = pp->pnext->data),而代表蛇头部的结构体则是判断按键输入情况来改变其上下左右移动。因为需要显示朝前移动,则需要将之前上一次显示蛇尾位置打印上空格,覆盖之前的蛇身节点。如果是吃到食物的情况的话,就直接将在链表的尾部位置增加一个结构体,该结构体的坐标信息和食物的坐标信息一致,并将指向蛇的头部的指针head指到该新加的链表结构体。而食物则需要重新生成。

###(5)蛇死亡情况,一、蛇碰到自己身体节点死亡,实现方法是一个指针指向链表最后一个结构体(即蛇头部),另外一个指针指向除蛇头结构体外,依次指向其他结构体进行判断,如果两指针指向的结构体有相同的坐标数值,即是蛇碰到自己死亡的情况;二、蛇碰到游戏边框死亡,当蛇头部的结构体的坐标数值等于上下边框所代表的横坐标或者是左右边框所代表的纵坐标的时候,即蛇的死亡情况。

###(6)食物的产生,设置一个食物结构体,成员在游戏边框内随机幅值,但当食物出现在蛇的身体上的时候,需要重新生成,再返回继续判断,直到食物生成在游戏区域内、不重叠在蛇节点上的位置才算成功。

###(7)文件保存,当代表保存的按键按下后,需要将版本信息、蛇的身体节点、食物结构体、蛇长、游戏分数等信息给写到文件中

###(8)文件打开,打开之前的文件信息,并导出来作为此次游戏开始的初始化设置
###(9)注意:malloc出来的内存在程序结束之前需要将它给free。程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,会导致程序运行速度减慢甚至系统崩溃等严重后果。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值