贪吃蛇小游戏项目总结

经过了几天的思考和完善,我的贪吃蛇也是终于完成啦。属实是很开心的,当然完成这个项目的过程也是很曲折的。因此就要来一次全面的总结来对自己在这个过程中学到的新知识加以巩固。

这个项目不是完全以自己的知识范围所写出来的,我想到要开发贪吃蛇,第一个想到的问题就是怎么样让蛇显示到我想要它在的位置上呢。由于我之前并没有接触过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和百度不断学习,不断提高自己的编程能力,加油!!!

最后,想要源码的同学请点个赞并私聊我吧!

我是热爱剪辑与编程小刘同学!

如何用Java还原童年回忆?在线教你完成贪吃蛇小游戏

今天我就从零开始来完成这个小游戏,完成的方式也是一步一步的添加功能这样的方式来实现。

额,不好意思,放错了,重来

大家见到的贪吃蛇小游戏,界面肯定是少不了的。因此,第一步就是写一个小界面。

实现代码如下:

我们见过的贪吃蛇游戏,是由一个格子一个格子构成,然后蛇在这个里面运动。

重写paint方法,单元格就是横着画几条线竖着画几条线即可。

代码如下:

效果如下:

由于,蛇的运动就是改变蛇所在的位置,然后进行重画,就是我们所看到的运动。因此,在这里,我们单独用一个线程来控制重画。

1、新建一个MyPaintThread类,实现了Runnable接口

2、在SnakeFrame的launchFrame方法中添加代码:new Thread(new MyPaintThread()).start();即可。

完成功能:利用双缓冲来解决闪烁的问题

贪吃蛇游戏中的蛇就是用一系列的点来表示,这里我们来模拟一个链表。链表上的每个元素代表一个节点。

首先,我们先新建一个Node类来表示构成蛇的节点,用面向对象的思想,发现,这个类应该有如下的属性和方法:

1、位置

2、大小,即长度、宽度

3、方向

4、构造方法

5、draw方法

Node类的代码如下:

Direction是一个enum,具体如下:

而在Snake类中,用面向对象的思维,可以发现,Snake类中应该有如下的属性和方法

1、头结点

2、尾结点

3、构造函数

3、draw方法

具体代码如下:

在SnakeFrame类中new一个Snake对象,然后调用Snake对象的draw方法即可。

效果如下:

首先想到的是这样:在Snake类中添加一个keyPressed方法,然后在SnakeFrame的键盘事件中调用Snake对象的keyPressed方法。

注意:蛇的移动是通过在头部添加一个单元格,在尾部删除一个单元格这样的思想来实现。

具体如下:

Snake类中添加一个keyPressed方法,主要是根据键盘的上下左右键来确定蛇的头结点的方向,然后move方法再根据头结点的方向来在头部添加一个单元格。

这样就实现了通过键盘来实现蛇的移动。

完成的功能:蛇吃蛋

首先我们新建一个蛋Egg的类。

类的属性和方法有:

1、位置、大小

2、构造方法

3、draw方法

4、getRect方法:用于碰撞检测

5、reAppear方法:用于重新产生蛋的方法

代码如下:

蛇吃蛋,怎么样才能判断蛇吃到蛋了呢,这就需要用到碰撞检测了。

这里我们在Snake类中添加一个eatEgg方法。当蛇吃到蛋之后,就需要将蛇的长度+1,这里处理的是在蛇的头部添加一个节点,当蛋被吃掉之后,就需要再重新随机产生一个蛋。

代码如下:

以上就完成了蛇吃蛋的功能。

完成的功能:添加边界处理

在我们熟悉的贪吃蛇游戏中,我们一般都知道,当蛇撞到墙或者是撞到自己身体的某一部分,则游戏就结束。下面我们就来实现这一功能。

在Snake类中,添加checkDead方法

如果蛇撞墙或是撞到自己本身的某一个部分。则调用SnakeFrame类中的gameOver()方法来进行一定的处理。

本游戏的处理方法为:通过设置一个boolean 变量,来停止游戏并提示相关信息。

具体代码如下:

以上就完成了蛇是否撞墙或是撞到自身一部分的功能。

以上基本上实现了贪吃蛇的基本功能。剩下的一些功能不再介绍,例如:添加得分记录、通过键盘某按键来控制游戏的停止、重新开始、再来一局等。

以上的功能虽然没有介绍,但是在代码中,没有实现这些相应的功能。

完整代码可以在这里获取:https://github.com/wojiushimogui/Snake

3分钟告诉你各种编程语言到底能干什么

当下,科技在极速的发展,人们正在向着人工智能化时代迈进,我们也越来越离不开一些高科技设备的帮助。大到工厂内的机械臂,小到每个人手上拿的智能手机,这都可以算是高科技产物的体现。

那么要想让这些高科技产物动起来,离不开软件工程师的技术加持。目前市面上有上百种计算机编程语言,那么这些编程语言多能做什么呢?

2021年编程语言排行榜

这是2021年的编程语言排行榜,这里以前3名为例介绍一下他们到底能做什么事。

这是知乎上的回答,不难看出,其实C语言算是最底层的编程语言,正是因为有了C,才有了今天各种编程语言百花齐放的现象。当然,有一些编程语言声称要取代C的地方,但是这个愿望依然没有实现。

总结一下:C语言具体应用领域

系统软件开发:

  1. 操作系统。Windows、Linux、Unix
  2. 驱动程序。主板驱动、显卡驱动等等
  3. 数据库底层实现。Oracle、SqlServer等

应用软件开发:

  1. 办公软件开发。Wps
  2. 图文图像多媒体。PhotoShop
  3. 嵌入式系统开发。智能手机、掌上电脑
  4. 游戏开发。2D、3D游戏

Java语言从问世至今在编程领域一直有着不可撼动的地方,目前全世界超过30亿的设备在使用Java。那么Java语言到底能做什么呢?

1、开发企业级网站项目。

此图片来自网络

Java语言最常见的应用领域就是编写动态的网页工程,例如一些政务网站、学校的官方网站都可能是由Java语言完成的。

2、做手机APP开发

目前在做APP开发领域基本上被Android和IOS两家独占了。那关Java什么事呢?

其实Android语言的源码是基于Java的,学完了Java可以无缝连接到Android软件开发。

3、Java开发游戏

其实在智能手机之前大家还在使用功能机的年代,那时候手机上的大部分游戏其实都是由Java语言编写的,比如大家都知道的贪吃蛇游戏。

除了手机上的游戏以外,电脑上也有Java开发的游戏。比如说最经典的《我的世界》以及当前世界上最具人气和影响力的《英雄联盟》

4、Java可以做软件

大部分的编程语言都是可以做软件的,Java语言也不例外。比如Eclipse等知名的Java开发工具。不过目前基于浏览器服务器这样的B/S结构的项目多一些,所以Java语言目前做软件的相对较少。

5、大数据分析

随着大数据时代的来临,大数据分析已经成为了发展趋向。Java语言作为最流行的语言之一自然不会错过这方面的投入。例如Hadoop分布式框架

Python语言作为后起之秀,借着其强大的“胶水语言”的特点迅速占领了一定的地位,这与它能够实现的功能是密不可分的。接下来我们来看看Python到底能干什么?

1、Web开发

Python中含有大量的免费的数据函数库以及服务器交互的库。通过这些内容就可以实现web的开发。

其中Django和Flask是最流行的基于Python的Web框架,可以由他们可以实现服务器端的代码实现。

2、网络爬虫

在爬虫领域,Python是具有强大的话语权的。将网络上的数据通过爬虫技术进行爬取据为己有,可想而知它的分量。

3、人工智能

当AI时代降临,Python语言又一次脱颖而出。各种人工智能的算法都是基于Python语言来编写的。比如说打败世界围棋冠军李世石的“阿尔法狗”以及目前我们每天都会用到的声音处理、图像处理等等都离不开人工智能技术。

4、游戏开发

在游戏开发领域,Python也具有良好的表现力。Python可以通过非常少的代码实现非常复杂的业务逻辑。

5、办公自动化

Python还提供了大量的用于操作办公软件的库,比如操作Word、Excel、PPT等等,有了Python的帮忙,可以节约大量的时间成本来完成海量数据的处理。

以上是对于常见的编程语言的简单介绍,如有不对请多指正

以上图片均来源于网络,如有侵权请告知删除

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。