贪吃蛇“大作战”(一)
前两天在博客园看到一个基于Qpython 的贪吃蛇游戏的代码,有点好奇贪吃蛇怎么用Python简单实现,就开始对这个程序代码进行分析。下面是我转载自sunny开始学坏的代码:
1 import os,random 2 sw=[[5,5]] 3 #lc=[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6]] 4 lc=[[5,i] for i in range(10)] 5 s='' 6 for x in range(500): 7 w=len(lc)-1 8 li = [(['○'] * 20) for i in range(20)] 9 a=input('请输入wasd控制:') 10 if a=='': 11 a=s 12 if a=='w': 13 lc.append([lc[w][0]-1,lc[w][1]]) 14 del lc[0] 15 s='w' 16 if a=='s': 17 lc.append([lc[w][0]+1,lc[w][1]]) 18 del lc[0] 19 s='s' 20 if a=='a': 21 lc.append([lc[w][0],lc[w][1]-1]) 22 del lc[0] 23 s='a' 24 if a=='d': 25 lc.append([lc[w][0],lc[w][1]+1]) 26 del lc[0] 27 s='d' 28 if lc[w] in sw: 29 lc.insert(0,[lc[0][0],lc[0][1]-1]) 30 del sw[0] 31 sw.append([random.randint(0,19),random.randint(0,19)]) 32 for i in lc:li[i[0]][i[1]]='●' 33 for w in sw:li[w[0]][w[1]]='◆' 34 os.system('clear') 35 for i in li:print(''.join(i))
以下,我会根据我所理解地,以行号为索引来逐行对上面的代码进行一个说明:
行号1:导入Python中的os模块和random模块,这两个都是安装Python时自带的模块,在该程序中要用到这两个模块
行号2:通读完整个程序了解到列表sw存储的是果实(贪吃蛇的目标,吃了果实,贪吃蛇会长大变长)的横纵坐标位置
行号3:程序注解,看行号4的解释
行号4:我们可以将贪吃蛇的整个身体看成N个点的组合(分成N个部分,和积分的原理类似),把各个点的坐标位置相结合可以得到贪吃蛇的身体信息和位置信息;该行采用列表推导式得到贪吃蛇的初始信息lc(lc=[[5,0],[5,1],[5,2],...,[5,9]],初始的贪吃蛇信息为:身长10,头部坐标[5,9],尾部坐标[5,0])
行号5:对象s用于存储贪吃蛇的前进方向信息,即wsad(上下左右)信息(对象s存储的信息在后面并没有用到)
行号6:用于控制贪吃蛇的前进次数,总共可前进500次
行号7:每次前进前,获取贪吃蛇头部点的坐标索引值,即头部点在lc列表中的索引
行号8:采用列表推导式得到列表li,利用列表li的‘o’字符模拟供贪吃蛇行走的地图(背景)
行号9:等待外部命令,控制贪吃蛇每次前进的方向,以此来控制贪吃蛇成功吃到果实
行号10、11:判断外部命令,若外部无前进方向命令,则不进行操作
行号12、13:判断外部命令,若外部命令为(w)向上,则为列表lc新增一个头部点,原头部点降到第二次序;新增头部点的坐标为原头部点的横坐标-1后的坐标,其纵坐标不变,以此来实现贪吃蛇向上的动作。(此时贪吃蛇的身体长度也+1了)
行号14:删除列表lc的第一个点[5,0],即将贪吃蛇的尾部点[5,0]去除,使贪吃蛇的身体总长保持不变(贪吃蛇只有在吃到果实后才能长大变长)
行号15:将贪吃蛇此次的前进信息存储在对象s中
行号16-19:与行号12-15的释义相同,只贪吃蛇的前进方向为向下
行号20-23:与行号12-15的释义相同,只贪吃蛇的前进方向为向左,lc新增头部点变化的坐标为纵坐标
行号24-27:与行号12-15的释义相同,只贪吃蛇的前进方向为向右,lc新增头部点变化的坐标为纵坐标
行号28:判断贪吃蛇的头部坐标是否与果实坐标重合,即贪吃蛇是否吃到果实
行号29:若贪吃蛇迟到果实,则在lc的尾部插入一个新的点,新的点的坐标与原尾部坐标相比:横坐标不变,纵坐标-1;此时贪吃蛇长大了,身体长度+1
行号30:删除果实的坐标信息,因贪吃蛇已迟到果实,果实消失,坐标信息自然无效了
行号31:通过随机数randint的方式为sw新增一个果实的坐标,位置;一般(0,19)就是界定的贪吃蛇的活动范围,果实可以在20X20的范围内随机出现
行号32:通过"●"字符将贪吃蛇表现在地图中
行号33:通过"◆"字符将果实表现在地图中
行号34:清除此次贪吃蛇的“痕迹”,方便下次动作后贪吃蛇的“显示”
行号35:在命令行中打印(显示)出贪吃蛇的前进动作“景象”(包括地图和果实)
以上,是我根据原代码逐行做出的解释,在之后的博客中会通过图片更生动地对贪吃蛇的运行机制进行分析介绍,并在python中运行这段代码,根据运行结果讲解。
ps:可通过在python中对源码逐行修改观察运行结果的变化来更深层次的了解代码的运行机制