1、python贪吃蛇源码+详解代码分析:、先想好总体的步骤1.弄个显窗出来,设置帧频#帧频可以调节蛇的速度2.蛇头,蛇,物,把游戏循环搞出来3.在窗上把蛇和物显出来4.让蛇动起来,检测键盘输来控制蛇5.检测game over、开始完善1.先按着步骤少写点,到什么就顺创建开始的基本框架代码如下:#初始框架import pygame#初始化pygame.init()#游戏画有多宽WHW=800H=600#格有68列 W/COL就是格的宽度 H/ROW就是格的度ROW=60#100COL=80#100size=(W,H)window=pygame.display.set_mode(size)#disp
2、lay显模块pygame.display.set_caption(贪吃蛇)#游戏循环quit=True#创建时钟对象(可以控制游戏循环频率)clock=pygame.time.Clock()while quit:#处理事件for event in pygame.event.get():#QUIT是pygame中的退出模块if event.type=pygame.QUIT:qiut=False#移动#渲染画出来#三个参数(往哪画,(颜),(起始位,终位)pygame.draw.rect(window,(255,255,255),(0,0,W,H)#display中的flip把控制权交给系统 py
3、game.display.flip()#设置帧频 clock.tick(20)为显窗做些必要的定义设置,在窗显就draw,设置帧频要到flip(),我注释的也够详细,这时也可以运下看看有没有窗闪了下出来2.设置蛇头,蛇,物的坐标以及它们各的颜,游戏循环让窗停留不再闪过,pygame.QUIT 可以通过标点右上的关闭窗,可以看到draw画出来的背景了。代码如下:因为涉及到重复的调,先简单定义个Point备,copy这可以先不写,下到的时候再回来补上class Point():row=0 col=0def _init_(self,row,col):self.row=row self.col=col
4、def copy(self):return Point(row=self.row,col=self.col)head蛇头,snakes蛇head=Point(row=int(ROW/2),col=int(COL/2)head_color=(0,128,128)snakes=Point(row=head.row,col=head.col+1),Point(row=head.row,col=head.col+2),Point(row=head.row,col=head.col+3)snake_color=(200,200,200)物位置要随机变化,这步可以先写个不动的物来过渡food=Point(
5、row=22,col=22)#food=gen_food()food_color=(255,255,0)把注释掉的print(event)先放出来,运然后依次按上下左右键wasd键,可以看到key的值,便下步操作#游戏循环clock=pygame.time.Clock()quit=Truewhile quit:for event in pygame.event.get():if event.type=pygame.QUIT:quit=Falseelif event.type=pygame.KEYDOWN:#print(event)3.这可以渲染出来蛇头和物了,两步搞定def rect(Poin
6、t,color):cell_width=W/COL cell_height=H/ROW left=Point.row*cell_width top=Point.col*cell_height pygame.draw.rect(window,color,(left,top,cell_width,cell_height)rect(head,head_color)rect(food,food_color)for snake in snakes:rect(snake,snake_color)#蛇是列表,直接遍历取出渲染让蛇头带着移动,让物随机成,把上下左右键盘控制完善移动起来direct先设定默认值为
7、left#移动if direct=left:head.row-=1elif direct=right:head.row+=1elif direct=up:head.col-=1elif direct=down:head.col+=1物随机出现,并检测蛇头是否和物坐标重合def gen_food():while 1:pos=Point(row=random.randint(0,ROW-1),col=random.randint(0,COL-1)#检测蛇是否跟物相遇 is_coll=Falseif head.row=pos.row and head.col=pos.col:is_coll=True
8、if not is_coll:breakreturn pos蛇吃物后成下个物,不吃物就删除最后节,吃物不删除最后节,反向思维,蛇头带着移动直接直接上的copy法,简单的句话eat=(head.row=food.row and head.col=food.col)if eat:food=gen_food()snakes.insert(0,head.copy()if not eat:snakes.pop()完善键盘控制,让键盘可以操作蛇的移动,这步早写晚写都不影响逻辑,其实可以在上QUIT时直接完善,代码如下:elif event.type=pygame.KEYDOWN:#print(event)
9、if event.key=273 or event.key=119:if direct=left or direct=right:direct=upelif event.key=274 or event.key=115:if direct=left or direct=right:direct=downelif event.key=276 or event.key=97:if direct=up or direct=down:direct=leftelif event.key=275 or event.key=100:if direct=up or direct=down:direct=right5.这时候的游戏基本已经做完了,检测下何时需要game over#检测 dead=False#1.撞墙if head.col0 or head.row=COL or head.row=ROW:dead=True#2.撞for snake in snakes:if head.col=snake.col and head.row=snake.row:dead=Truebreakif dead:print(死了)quit=False完成