1、Python贪吃蛇(完整代码+详细注释+粘贴即)章录代码#!/usr/bin/env python#-*-coding:utf-8-*-#author:Wangdali time:2021年12016:08:44#python实现:贪吃蛇游戏玩法:回车开始游戏;空格暂停游戏/继续游戏;向键/wsad控制蛇向思路:列表存储蛇的体;浅表体,深背景将体凸显出来;蛇的移动:仔细观察,是:体除头和尾不动、尾部消失,头部增加,所以,新添加的元素放在列表头部、删除尾部元素;游戏结束判定策略:超出边界;触碰到的体:蛇前进的下格为体的部分(即在列表中)。#注:因为在列表中需要频繁添加和删除元素,所以deque容
2、器代替列表;是因为deque具有效的插和删除效率#初始化蛇,长度为3,放置在屏幕左上;#导包import randomimport sysimport timeimport pygamefrom pygame.locals import*from collections import deque#基础设置Screen_Height=480Screen_Width=600Size=20#格Line_Width=1#游戏区域的坐标范围Area_x=(0,Screen_Width/Size-1)#0是左边界,1是右边界#注:python中/为整数除法;/为浮点数除法Area_y=(2,Screen_
3、Height/Size-1)#物的初步设置#物的分值+颜Food_Style_List=(10,(255,100,100),(20,(100,255,100),(30,(100,100,255)#整体颜设置Light=(100,100,100)Dark=(200,200,200)Black=(0,0,0)Red=(200,30,30)Back_Ground=(40,40,60)#本输出格式设置def Print_Txt(screen,font,x,y,text,fcolor=(255,255,255):#font.render参数意义:.render(内容,是否抗锯齿,字体颜,字体背景颜)Te
4、xt=font.render(text,True,fcolor)screen.blit(Text,(x,y)#初始化蛇def init_snake():snake=deque()snake.append(2,Area_y0)snake.append(1,Area_y0)snake.append(0,Area_y0)return snake#物设置#注意需要对物出现在蛇上的情况进判断def Creat_Food(snake):注:randint 产的随机数区间是包含左右极限的,也就是说左右都是闭区间的1,n,能取到1和n。randrange 产的随机数区间只包含左极限,也就是左闭右开的1,n),
5、1能取到,n取不到。randint产的随机数是在指定的某个区间内的个值,产的随机数是在指定的某个区间内的个值,randrange 产的随机数可以设定个步长,也就是个间隔。food_x=random.randint(Area_x0,Area_x1)#此处有疑问 food_y=random.randint(Area_y0,Area_y1)#如果物出现在蛇上,重来;while(food_x,food_y)in snake:food_x=random.randint(Area_x0,Area_x1)food_y=random.randint(Area_y0,Area_y1)return food_x,
6、food_y#物风格def Food_Style():return Food_Style_Listrandom.randint(0,2)#返回随机的分值和颜def main():pygame.init()screen=pygame.display.set_mode(Screen_Width,Screen_Height)#初始化个准备显的窗或屏幕 pygame.display.set_caption(贪吃蛇)#Set the current window caption#得分字体设置 font1=pygame.font.SysFont(SimHei,24)#GO字体设置 font2=pygame
7、.font.SysFont(None,72)fwidth,fheight=font2.size(GAME OVER)#程序bug修复:如果蛇在向右移动,快速点击分别施加向下、向左的命令,向下的命令会被覆盖,只有向左的命令被接受,直接GameOver#b变量为了防这个情况发 b=True#蛇 snake=init_snake()#物 food=Creat_Food(snake)food_style=Food_Style()#向控制 pos=(1,0)#启动游戏相关变量初始化 game_over=True#结束标志#是否开始,当start=True,game_over=True时,才显 GAME
8、OVER game_start=False#开始标志 score=0#得分 orispeed=0.3#蛇初始速度 speed=orispeed#蛇速度 last_move_time=None pause=False#暂停while True:for event in pygame.event.get():if event.type=QUIT:sys.exit()elif event.type=KEYDOWN:if event.key=K_RETURN:if game_over:game_start=True game_over=False b=True snake=init_snake()fo
9、od=Creat_Food(snake)food_style=Food_Style()pos=(1,0)#得分 score=0 last_move_time=time.time()elif event.key=K_SPACE:if not game_over:pause=not pause#以下为防蛇在向右移动时按向左键,导致GameOverelif event.key in(K_UP,K_w):if b and not pos1:#pos=(0,-1)b=Falseelif event.key in(K_DOWN,K_s):elif event.key in(K_DOWN,K_s):if b
10、 and not pos1:pos=(0,1)b=Falseelif event.key in(K_LEFT,K_a):if b and not pos0:pos=(-1,0)b=Falseelif event.key in(K_RIGHT,K_d):if b and not pos0:pos=(1,0)b=False#填充背景 screen.fill(Back_Ground)#画格线、竖线for x in range(Size,Screen_Width,Size):pygame.draw.line(screen,Black,(x,Area_y0*Size),(x,Screen_Height)
11、,Line_Width)#画格线、横线for y in range(Area_y0*Size,Screen_Height,Size):pygame.draw.line(screen,Black,(0,y),(Screen_Width,y),Line_Width)#蛇的爬过程if not game_over:curTime=time.time()if curTime-last_move_timespeed:#if not pause:b=True last_move_time=curTime next_s=(snake00+pos0,snake01+pos1)#如果吃到了物if next_s=f
12、ood:snake.appendleft(next_s)score+=food_style0 speed=orispeed-0.03*(score/100)food=Creat_Food(snake)food_style=Food_Style()else:#在区域内if Area_x0=next_s0=Area_x1 and Area_y0=next_s1=Area_y1 and next_s not in snake:snake.appendleft(next_s)snake.pop()else:game_over=True#画物if not game_over:rect(Surface,c
13、olor,Rect,width=0)第个参数指定矩形绘制到哪个Surface对象上第个参数指定颜第三个参数指定矩形的范围(left,top,width,height)第四个参数指定矩形边框的(0表填充矩形)例如绘制三个矩形:pygame.draw.rect(screen,BLACK,(50,50,150,50),0)pygame.draw.rect(screen,BLACK,(250,50,150,50),1)pygame.draw.rect(screen,BLACK,(450,50,150,50),10)#避免 GAME OVER的时候把 GAME OVER的字给遮住了 pygame.dra
14、w.rect(screen,food_style1,(food0*Size,food1*Size,Size,Size),0)#画蛇for s in snake:pygame.draw.rect(screen,Dark,(s0*Size+Line_Width,s1*Size+Line_Width,Size-Line_Width*2,Size-Line_Width*2),0)Print_Txt(screen,font1,30,7,f速度:score/100)Print_Txt(screen,font1,450,7,f得分:score)Print_Txt(screen,font1,450,7,f得分
15、:score)#画GameOverif game_over:if game_start:#print(GameOver)Print_Txt(screen,font2,(Screen_Width-fwidth)/2,(Screen_Height-fheight)/2,GAME OVER,Red)pygame.display.update()if _name_=_main_:main()运截图笔记补充1)蛇的移动,先根据向来判断,这使pos变量来记录向pos(1,0)/表当前蛇向右的向pos(-1,0)/表当前蛇向左的向pos(0,1)/表当前蛇向下的向pos(0,-1)/表当前蛇向上的向2)怎么能控制蛇的速度呢?其实是控制时间来刷新,我们知道所有的动作都在个循环完成的,也就是代码都直在运着。如我设置速度为1,表秒刷新次,那么蛇的移动也就是秒次,我们看到的也是秒移动格。当我们设置速度为0.5,表0.5秒刷新次,那我们就看到0.5秒移动格,速度就相对地看起来快了。参考博客(阿嘎多!)1、2、