从对象出发看贪吃蛇
在上一篇博客中,我通过逐行分析代码对贪吃蛇的运行机制做了一个简要的介绍;逐行分析后可以看出这个贪吃蛇例程的编写范式更突出面向过程:该例程先是预设食物和贪吃蛇的位置参数,然后通过选择逻辑判断外部命令的值,根据不同的值做出不同的动作,最后在地图上将之前的动作“渲染”,达到贪吃蛇“前进”的效果;如此下来,一步一步地根据“看得到的逻辑”实现了贪吃蛇的运行机制。
现在,我从面向对象的编程思维来对这个贪吃蛇运行机制做一个分析。从下面这幅图中我们看到了什么?
我们能看到蛇、老鼠还有它们身下的草地,换个意思说是:蛇、食物和它们的活动空间。整个贪吃蛇的运行机制就是围绕着三个对象建立的。我们针对这三个对象分别做一个深入的分析。
蛇
- 蛇是动物,是会动的,所以它掌握了“动”(move)这个方法
- 蛇是绿色的,所以它有“颜色”(color)这一属性
- 从图上能看出,这条蛇有个鲜明的特征——长,所以蛇具有长度(length)这个属性
- 蛇会吃老鼠,所以蛇有吃(eat)这个方法,蛇吃到老鼠会长大,所以蛇每次吃到老鼠长度会发生变化
老鼠(食物)
- 老鼠是群居动物,假定每次只出现一只老鼠,那么每次老鼠出现的位置是随机的,老鼠有随机出现的特性
- 老鼠是棕色的,所以它有“颜色”这个属性
- 老鼠是蛇的食物所以老鼠被蛇吃了之后会消失,然后又出现一只老鼠,所以老鼠有存在与不存在这两种状态
草地(活动空间)
- 草地是草绿色的,所以有“颜色”这个属性
- 草地范围有限,蛇和老鼠只能在草地中活动,草地有大小这个属性
我通过python代码分别对蛇、老鼠和草地这三个对象做一个定义:
#蛇的类定义 class Snake(direc) color = ‘green‘ length = 5 position = 0 # 蛇出现的初始位置 def move(self,direc): if self.direc = ‘w‘: #执行向上前行动作 if self.direc = ‘s‘ #执行向下前行动作 if self.direc = ‘a‘ #执行向左前行动作 if self.direc = ‘d‘ #执行向右前行动作 def eat(): #判断是否吃到老鼠 #执行吃到老鼠的操作——length += 1 #老鼠的类定义 class Mouse(): color = ‘brown‘ #此处定义老鼠出现的位置(草地内的随机位置,不包括蛇的体内) #此处判断老鼠是否存在,若不存在则刷新出新的老鼠 #草地的类定义 class grass(): color = ‘grassgreen‘ area = ‘20*20‘
以上一些代码逻辑暂用文字表现,理解意思就好,会在后续的博客以完整的代码例程来展现面对对象的贪吃蛇运行机制(还没开始编写代码)。其实原来的代码就可以用面向对象的思想来看,我只是通过类定义把面对对象表现的更鲜明。
列表lc可以代表蛇这个对象,它包括了蛇的长度属性和位置信息,通过对列表操作可以表达蛇“前进”这个方法。
列表sw可以代表食物这个对象,它包括了食物的位置,通过对它操作可以判断食物是否存在,控制食物下一次出现的位置
列表li则可以代表草地这个对象,它包括了草地的面积和“颜色”,通过对蛇和食物“颜色”属性的”渲染“可以在草地上观察到蛇和食物的位置变化信息。
还可以通过数学知识——坐标轴来看待这个代码例程:草地就是坐标轴(整数坐标轴)中的x轴0~20与y轴0~20联合包围起来的一个区域;蛇就是在这个区域中连续的几个点;食物就是这个区域中可以随机出现的一个点;通过对这个坐标轴体系中的这三个对象进行操作就可以实现一个简单的贪吃蛇运行机制。
ps:这两篇博客我都是通过文字来解释贪吃蛇的运行机制,在下一篇博客我会开始运行这个代码例程,并不断完善这个例程(因为我发现这个例程其实距离真正可玩的贪吃蛇游戏还有很大的距离,bug有点多,代码结构也不够合理),将我学习改善这个例程的每个细节和大家分享;最后我会以面向对象的编程范式来实现这个贪吃蛇游戏,并争取可以通过窗口来真正地玩这个游戏,而不是命令行模拟。
原文地址:https://www.cnblogs.com/3fman/p/9206623.html