猫史档案馆


【编程大揭秘】01 贪吃蛇生存竞争的毛毛虫效果

用户:Mine7Mine7查看:2 回复:20 评论:2 创建时间:2017-11-04T19:00:30


https://lab.codemao.cn/work/892208">
贪吃蛇生存竞争(原名毛毛虫生存竞争)

贪吃蛇生存竞争是我的代表作之一。这是一款有趣的贪吃蛇游戏,游戏画风简洁清晰,游戏操作简单易懂。(其他人的评价)
这里要讲的,是这个作品中技术含量最高的“毛毛虫”效果。

在第7集的toptop中,作者特别注意了一下性能喵对“毛毛虫”效果的说明

编程大事件作品toptop榜07
性能喵找到了毛毛虫效果的主要程序,但是对其原理的解释还不够完整。


这一串长长的运算到底有什么含义呢?这还得从几个月前说起。
2017年7月,
我在制作一个有关弹力球的游戏时,无意间做出了毛毛虫的效果,脚本非常简单:





讲解一下原理:头的程序很简单,是一个“跟踪”鼠标、匀速前进的程序,大家应该都懂;而每一节身体的程序都是跟踪其相对的前一节身体(也就是面向前一节身体,同时保持40步距离)的程序。几个简单的脚本一搭配,就是早期毛毛虫效果的雏形了。
ps:这个贪吃蛇的头的图案和颜色本来是用画板随手一画的,却成了贪吃蛇永远不变的经典造型....
这个程序最大的遗憾在于它不是利用克隆制作的,也就意味着贪吃蛇的长度永远是有限的,于是.......
2017年9月,
我无意间翻到以前做的这个毛毛虫效果,有了制作的灵感,并决心要用克隆体做出毛毛虫效果
用克隆体做出毛毛虫效果,头的脚本是不需要变的,但是身体的脚本部分面临着3大难题:
1..到 的距离:程序中用到“到 的距离”的模块,然而我们没法求出到一个克隆体的距离!
2.面向:程序中用到“面向 ”的模块,然而我们没法面向一个克隆体!
3.程序的不同:在上面的程序中,每一节身体的脚本是跟踪相对的前一节身体,每一节身体要跟踪的角色就是不一样的。换而言之,每一节身体的脚本就是不一样的!
鉴于这3个问题,用克隆体来完成似乎是一项完全不可能的完成的事情。

世上无难事,只怕有心人。接下来要做的事情,就是把难题一个个地解决:
一:到 的距离
———————————勾股定理———————————
勾股定理是一个基本的几何定理,指直角三角形的两条直角边的平方和等于斜边的平方。中国古代称直角三角形为勾股形,并且直角边中较小者为勾,另一长直角边为股,斜边为弦,所以称这个定理为勾股定理,也有人称商高定理。

a²+b²=c²
详见喵science/2016-08/11/c_135587320.htm" target="_blank">http://news.xinhuanet.com/science/2016-08/11/c_135587320.htm
———————————————————————————
你也许会想,勾股定理和距离有什么关系?那么请看看下面这个例子:

绘制通过B的垂直线、通过A的水平线,可以构造出一个直角三角形:

通过勾股定理: a²+b²=c²
40²+50²=AB之间的距离²
AB之间的距离=40²+50²60
同理的,任意两点间的距离都可以用勾股定理来算出来。因此,可以总结出一个公式:到**的距离=(自己的x坐标-**的x坐标)²+(自己的y坐标-**的y坐标)²
利用这个原理,无需用到距离模块,只要知道自己的坐标信息和前一节身体的坐标信息,就可以求出距离!这就是这一段代码的原理:

二:面向
———————————三角函数———————————
三角函数属于初中九年级的数学函数知识。作为数学中属于初等函数中的超越函数的一类函数,它们的本质是任意角的集合与一个比值的集合的变量之间的映射。
通常的三角函数是在平面直角坐标系中定义的,其定义域为整个实数域.另一种定义是在直角三角形中,但并不完全。现代数学把它们描述成无穷数列的极限和微分方程的解,将其定义扩展到复数系。
由于三角函数的周期性,它并不具有单值函数意义上的反函数。
三角函数一般用于计算三角形中未知长度的边和未知的角度,在导航、工程学以及物理学方面都有广泛的用途。
三角函数反正切值(atan)

在一个直角三角形abc中,

有:atan(AC÷CB)=A
因此,利用atan,只需要输入AC和CB长度的比值(AC÷CB),就能求出角A(AC边上的非直角边)的角度。
三角函数正切值(tan)
三角函数正切值与反正切值相反,输入角度有如下等式



......
———————————————————————————
回到我们的程序上。在两点间,我们同样可以构造一个三角形:

利用三角函数反正切值,我们就可以计算出
?=
因此,有了这个函数

脚本为

因为这一部分内容比较难讲,就不详细讲解这个函数的原理了(听说编程猫夏令营有讲到,不过话说我没有去夏令营()),大家可以购买文章末尾的贪吃蛇效果代码,里面有这个函数。

三:有关安排各个克隆执行相对应的命令
在这个程序程序中,每一节身体的克隆体都需要获得前一节身体的xy坐标来执行命令。因此,我们 需要使克隆体拥有自己的“编号”概念。解决这个问题的关键在于一个局部变量 和一个全局变量
我们需要在开始克隆的时候利用这个“计数”变量来显示当前克隆的克隆体的编号(比如当克隆到第1个克隆体时,计数变量=1,每克隆一个克隆体计数+1)以让该克隆体运行时用“编号”变量记录下自己的编号。(注:局部变量对于每一个克隆体的值可以是不一样的)


克隆体运行时用“编号”变量记录下自己的编号:

每一个克隆体有了自己的编号,我们还需要一个信息库随时记载每一个克隆体的位置,这样就可以随时随地轻松地获取和记录任何一个克隆体的坐标信息了。
我们用到两个链表 来记录坐标信息。(两个链表各自记录的信息类型顾名思义)
1.记录信息:为了让获取坐标信息更加容易,我就直接把每一个克隆体的坐标信息记录在链表中该克隆体编号所对应的项上了。脚本是:

比如我要获取第3节身体的x坐标,则是:

2.获取信息:把链表内的数据和上面讲到的程序合并起来,则是:
https://ide.codemao.cn/work/994651">
就这样,克隆版毛毛虫效果就大功告成了!

成品链接:https://lab.codemao.cn/work/994651 大家可以购买代码来查看!
为什么要单独购买毛毛虫效果而不是完整的贪吃蛇游戏?
- 在贪吃蛇游戏中,除了毛毛虫效果还有很多其他的程序脚本和特效。如果不是作者,很有可能
根本看不懂程序或者找不到毛毛虫效果的脚本,那就相当于白买了。
- 在这个代码中,几乎每一个脚本上都有注释,配合注释可以更容易的理解程序脚本!
- 支持任意长度。开始的时候会询问长度(可以修改脚本),更方便使用。
还有任何问题可以在下面讨论


回复

上一页1 页 / 共 1下一页
yhkunyhkun

马赛克打得不错

点赞0


评论


杰鸽杰鸽

哇ω

点赞0


评论


yhkunyhkun



点赞0


评论


小假LittleFalse小假LittleFalse

看了这个,我只能说

切,这个作品我用100年也能做出来

点赞0


评论


Mine7Mine7

我没说你们做不出来啊。。。

点赞0


评论


浪日子的鲸浪日子的鲸

不明觉厉!

点赞0


评论


顺铂顺铂

我能看懂


点赞0


评论


顺铂顺铂

mime7,你那悬浮窗的效果怎么做出来的

点赞0


评论


********

啊啊!不懂

点赞0


评论


主播喵副本主播喵副本

@吴人子弟 你就注意到那个吗?那个我会,显示然后重复执行增加大小就好了,缩小的话重画执行增加负数大小最后隐藏就好了

点赞0


评论


Mine7Mine7


你指哪个?

点赞0


评论


I桔汁糖浆II桔汁糖浆I

真·干货!

有关勾股定理在编程猫的运用其实还有很多,比如说匀速运动:

在({[x1-x2]^2+[y1-y2]^2}^0.5)/(速度值)秒中移到x2,y2

前面的那一串数字便是用勾股定理求出距离(0.5次方就是1/2次方,也就是根号二),然后根据路程等于时间乘以速度这个公式算出时间,并嵌套到积木里,就可以实现这个效果了

点赞1


评论


key无双残曦Yanciekey无双残曦Yancie

看看我的吧:https://ide.codemao.cn/we/3508575

点赞0


评论


key无双残曦Yanciekey无双残曦Yancie

点赞0


评论


ZLS_桃ZLS_桃

挖坟

点赞0


评论


JaMJaM

挖坟

点赞0


评论


Accumulating丶謀Accumulating丶謀

挖坟

点赞0


评论


饭叫兽饭叫兽

考古

点赞0


评论


中秋小蓝就是歌姬吧中秋小蓝就是歌姬吧

???

点赞1


评论


友善的月见草XUbO友善的月见草XUbO

可以直接克隆角色,克隆的角色在一定时间内消失。

点赞0


评论