贪吃蛇小游戏项目总结(贪吃蛇小游戏设计总结)
wptr33 2025-06-09 00:39 5 浏览
经过了几天的思考和完善,我的贪吃蛇也是终于完成啦。属实是很开心的,当然完成这个项目的过程也是很曲折的。因此就要来一次全面的总结来对自己在这个过程中学到的新知识加以巩固。
这个项目不是完全以自己的知识范围所写出来的,我想到要开发贪吃蛇,第一个想到的问题就是怎么样让蛇显示到我想要它在的位置上呢。由于我之前并没有接触过SetConsoleCursorPosition()函数,因此这个问题就让我很困惑。因此我就开始看了慕课上的教程,于是知道了SetConsoleCursorPosition()函数可以解决我的这个问题。但是对这个函数比较陌生,因此我就在CSDN上查了这个函数加以学习。这个函数可以将你的光标移动到你想移动到的位置,这个函数是需要传入两个参数,但是参数并不是你想要移动的X,Y位置坐标,这里的参数是我之前没有接触到的。SetConsoleCursorPosition(hout,coord);coord是一个结构体,这个是由系统定义好的结构体,结构体中包括了两个成员,一个是x,一个是y,这就是你所想要移动到的坐标。那hout是什么呢?我查到的资料是说hout是一个句柄。我现在的知识量还不够特别深入详细地明白句柄的作用。但在使用这个函数的时候,只需要将coord中的X和Y两个元素赋值就可以进行操作啦。在项目中定义的gotoxy()函数中就用到了这个函数。而为了游戏的美观我又学习到了一个新的函数SetConsoleTextAttribute()函数,这个函数是API设置控制台窗口字体颜色和背景色的函数,可以改变字体颜色,让游戏更加美观。在实现键盘控制功能的时候又学习到了一个新的函数GetAsyncKeyState(VK_UP),这个函数是用来接收键盘的输入值,这里我们通过键盘的上下左右来操作蛇,直接就是UP,DOWN,RIGHT,LEFT来代表键盘的上下左右,这全都是由系统函数所规定的,直接调用即可。
除了上述三个新接触的函数,其它功能的实现都是在我已学知识范围内可以完成的或者是之前接触过的。本次我使用了刚学的链表完成了对蛇的创建。使用链表的好处就是在于实现蛇吃掉食物蛇身增加一节,以及蛇咬到自己,蛇撞墙这些功能时比较好理解,比较形象。相对于用数组来实现这些功能,个人觉得还是链表更简单一些。
新学到的知识总结完啦,下面就来总结一下自己在代码敲完之后,运行程序出现的问题,以及自己的解决方案。我在代码敲完之后,运行程序并进行测试,在多次运行程序之后,发现了这样的问题,那就是食物和蛇身重合的情况还是会出现。
一开始实现这个功能的代码如下:
/*
随机创建食物
*/
void createfood()
{
snake *food_1;
srand((unsigned)time(NULL)); //初始化随机数
food_1=(snake*)malloc(sizeof(snake)); //初始化food_1
while((food_1->x%2)!=0) //保证其为偶数,使得食物能与蛇头对齐,然后食物会出现在网格线上
{
food_1->x=rand()%52+2; //食物随机出现,食物的x坐标在2~52
}
food_1->y=rand()%24+1; //食物的y坐标在1~24
q=head;
while(q->next!=NULL)
{
if(q->x==food_1->x && q->y==food_1->y) //判断蛇身是否与食物重合
{
free(food_1); //如果蛇身和食物重合,那么释放食物指针
createfood(); //重新创建食物
}
q=q->next;
}
gotoxy(food_1->x,food_1->y);
food=food_1;
color(12);
printf("●"); //输出食物
}
这是最开始的代码,这部分我要实现的功能是随机生成食物,并判断是否与蛇身重合,如果重合,就重新生成食物。但从运行效果来看,这部分的代码还是有问题的。于是我想着去把这部分代码给改善一下。思考了很多天,也和同学讨论了这部分的问题,我也在CSDN上问了一些大神博主,最终找出了这部分代码出错的原因。出错的原因有两个:1.while(q->next! =NULL)这个while循环的判断条件导致蛇尾没有进行判断就跳出了循环。2.在while循环中递归调用了这个函数本身,假若第一个节点是与食物重合的,那么会第二次调用这个函数本身,此时第一次调用这个函数中的food_1是被释放掉的。如果第二次调用中食物不在蛇身上产生了,第二次调用结束,那么这个函数回到第一次调用的时候gotoxy(food_1->x,food_1->y);这句话就是违法的。第一个错误很简单,但是即使把第一个错误改掉之后,我发现第二个错误没法改。因此我得出了创建食物和判断是否与蛇身重合不能写在一个函数中的结论。于是我想把这个函数拆成两个函数,但具体改的方案不是我自己完成的,是我和同学一起讨论,最终完成了修改。
修改完的这部分代码如下:
/*
随机出现食物
*/
void createfood()
{
snake *food_1;
srand((unsigned)time(NULL)); //初始化随机数
food_1=(snake*)malloc(sizeof(snake)); //初始化food_1
do
{
food_1->x=rand()%(52/2)*2+2; //食物随机出现,食物的x坐标在2~52
food_1->y=rand()%24+1; //食物的y坐标在1~24
}
while(intobody(food_1->x,food_1->y));
gotoxy(food_1->x,food_1->y);
food=food_1;
color(12);
printf("●"); //输出食物
}
/*
判断食物是否与蛇身重合
*/
int intobody(int x,int y)
{
for(q=head;q!=NULL;q=q->next)
{
if(q->x==x&&q->y==y)
return 1;
}
return 0;
}
把原来的那个函数拆成了两个函数,一个用来创建食物,一个用来判断是否与蛇身重合,如果重合,第二个函数返回值为1,从而导致第一个函数继续循环,重新创建食物,直到不再和蛇身重合,第二个函数返回值为0,第一个函数跳出循环并且打印食物。这样修改十分具有可行性。在运行了很多次后都没有出现蛇身与食物重合的情况。自此,代码完善完成,贪吃蛇项目正式完工。
在这次的项目实践中我觉得自己独立思考问题的能力还有待提高,并且我觉得自己知识面太窄,需要想办法扩充自己的知识面。我的学习路径主要就是CSDN和百度,我认为CSDN上博主的讲解还是很好懂的,比较不错。后期我要试着开发其他一些小程序并且继续通过CSDN和百度不断学习,不断提高自己的编程能力,加油!!!
最后,想要源码的同学请点个赞并私聊我吧!
我是热爱剪辑与编程小刘同学!
相关推荐
- Linux文件系统操作常用命令(linux文件内容操作命令)
-
在Linux系统中,有一些常用的文件系统操作命令,以下是这些命令的介绍和作用:#切换目录,其中./代表当前目录,../代表上一级目录cd#查看当前目录里的文件和文件夹ls#...
- 别小看tail 命令,它难倒了技术总监
-
我把自己以往的文章汇总成为了Github,欢迎各位大佬star...
- lnav:基于 Linux 的高级控制台日志文件查看器
-
lnav是一款开源的控制台日志文件查看器,专为Linux和Unix-like系统设计。它通过自动检测日志文件的格式,提取时间戳、日志级别等关键信息,并将多个日志文件的内容按时间顺序合并显示,...
- 声明式与命令式代码(声明模式和命令模式)
-
编程范式中的术语和差异信不信由你,你可能已经以开发人员的身份使用了多种编程范例。因为没有什么比用编程理论招待朋友更有趣的了,所以这篇文章可以帮助您认识代码中的流行范例。命令式编程命令式编程是我们从As...
- linux中的常用命令(linux常用命令和作用)
-
linux中的常用命令linux中的命令统称shell命令shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互shell终端:我们平时输入命令,执行程序的那个...
- 提高工作效率的--Linux常用命令,能够决解95%以上的问题
-
点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf...
- 如何限制他人操作自己的电脑?(如何控制别人的电脑不让发现)
-
这段时间,小猪罗志祥正处于风口浪尖,具体是为啥?还不知道的小伙伴赶紧去补一下最近的娱乐圈八卦~简单来说,就是我们的小罗同事,以自己超强的体力,以及超强的时间管理能力,重新定义了「多人运动」的含义,重新...
- 最通俗易懂的命令模式讲解(命令模式百科)
-
我们先不讲什么是命令模式,先通过一个场景来引出命令模式,看看命令模式能解决什么样的问题。现在有一个渣男张三,他有还几个女朋友,你现在是不是还是单身狗,你就说你气不气?然后他需要每天分别叫几个女朋友起床...
- 互联网大厂后端必看!Spring Boot 中Runtime执行与停止命令?
-
你是否曾在使用SpringBoot开发项目时,遇到需要执行系统命令的场景?比如调用脚本进行文件处理,又或是启动外部程序?很多后端开发人员会使用Processexec=Runtime.get...
- Linux 常用命令(linux常用的20个命令面试)
-
日志排查类操作命令...
- Java字节码指令:if_icmpgt(0xA3)(java字节码使用的汇编语言)
-
if_icmpgt是Java字节码中的一条条件跳转指令,其全称是"IfIntegerCompareGreaterThan"。它用于比较两个整数值的大小。如果栈顶的第一个...
- 外贸干货|如何增加领英的曝光量和询盘
-
#跨境电商#...
- golang执行linux命令(golang调用shell脚本)
-
需求需要通过openssl生成rsa秘钥,然后保存该秘钥。代码实例packagemainimport("io/ioutil""bytes"&...
- LINUX磁盘挂载(linux磁盘挂载到windows)
-
1、使用root用户查看磁盘挂载情况:fdisk-l2、使用df查看当前磁盘挂载情况,根据和fdisk-l的结果进行对比,查看还有那些磁盘未使用3、挂载:mount磁盘挂载路径...
- Linux命令学习——nl命令(linux ln命令的使用)
-
nl命令主要功能为每一个文件添加行号,每一个输入的文件添加行号后发送到标准输出。当没有文件或文件为-时,读取标准输入...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)