10分钟用Python编写贪吃蛇小游戏

首先,让我们来看看贪吃蛇游戏的主要想法

废话不多说,我们直接来解释一下如何用Python来写贪吃蛇。
1.调用库和初始设置
1.1 调用第三方库
Python与其他语言非常不同的是,他有很多第三方库可以调用。Python编写游戏时,Pygame是一个非常简单的第三方库,可以通过pip直接安装。安装方法已在前一篇文章中提到,因此不再重复。想了解更多pygame功能的朋友也可以查阅官方文档。
这是我们在编写贪吃蛇时需要调用的库。
importpygame 2importsystsss 3importtimme 4importrandom 5frompygame.localsimport*
1.2 初始设置
我们通过这些行代码初始化pygame,定义窗口(边界)的大小、标题和图标。
1#pygame初始化
2pygame.init()
3fpsClock=pygame.time.Clock()
4
创建pygame显示层
6playSurface=pygame.display.set_mode((640,480))
7#定义标题
8pygame.display.set_caption('SnakeGo!')
9#加载资源图片,game.ico包含在最终文件中
10image=pygame.image.load('game.ico')
11#设置图标
12pygame.display.set_icon(image)1.3 定义颜色变量
因为我们需要使用一些颜色,而Python不是我们自己的。因此,我们需要定义几种颜色。
1redcolourur=pygame.Color(255,0,0) 2blackcolourlllourllour=pygame.Color(0,0,0) 3whitecolourur=pygame.Color(255,255,255) 4greycolour=pygame.Color(150,150,150) 5LightGrey=pygame.Color(220,220,220)
2.GameOver
正如前面提到的,所有游戏中最重要的部分是循环。Gameover函数是跳出这个循环的条件。这里给蛇吃到自己的身体或接触边界时显示的界面(判断死亡的代码稍后会显示)
1#定义gameover函数
2defgameover(playSurface,score):
3#显示GAMEOVER并定义字体和大小
4gameoverfont=pygame.font.Font('arial.ttf',72)
5gameoversur=gameOverFont.render('GameOver',True,greyColour)
6gameOverRect=gameOverSurf.get_rect()
7gameOverRect.midtop=(320,125)
8playSurface.blit(gameOverSurf,gameOverRect)
9#显示分数并定义字体和大小
10scoreFont=pygame.font.Font('arial.ttf',48)
Surff11score=scoreFont.render('SCORE:'+str(score),True,greyColour)
Rectt12score=scoreSurf.get_rect()
Rectt13score.midtop=(320,225)
14playSurface.blit(scoreSurf,scoreRect)
15pygame.display.flip()#刷新显示界面
休眠5秒后自动关闭16#
17time.sleep(5)
18pygame.quit()
19sys.exit()3.贪吃蛇和树莓
接下来介绍一下游戏的主题部分,就是贪吃蛇和蛇莓的展示和运动。
3.1 定义初始位置
我们把整个界面看成很多20*20的小方块,每个方块代表一个单位,蛇的长度可以用几个单位来表示。蛇的身体以列表的形式存储,便于以后删除。
1#初始变量 2snakePosition=[100,100]#蛇头位置 3snakesegments=[100,100],[80,100],[60,100] 4raspberyPosition=[300,300]#树莓位置 5raspberySpawned=1#树莓 6direction=#39;right'#初始方向 7changedirection=direction 8score=0#初始分数
3.2 键盘输入判断蛇的运动
我们需要通过键盘输入的上下左右键或WASD来控制蛇的运动,并添加按下ESC退出游戏的功能。
1#检测pygame事件,如按键等
2foreventinpygame.event.get():
三ifevent.type==QUIT:
4pygame.quit()
5sys.exit()
6elifeventent.type==KEYDOWN:
7#判断键盘事件
8ifevent.key==K_RIGHTorevent.key==ord('d'):
9changedirection;right'
10ifevent.key==K_LEFTorevent.key==ord('a'):
11changedirection=#39;left'
12ifevent.key==K_UPorevent.key==ord('w'):
13changedirection=#39;up'
14ifevent.key==K_DOWNorevent.key==ord('s'):
15changeDirection='down'
16ifevent.key==K_ESCAPE:#按esc退出游戏
17pygame.event.post(pygame.event.Event(QUIT))贪吃蛇运动有一个特点:不能反方向运动。因此,我们需要增加限制。
1#判断是否输入相反的方向 2ifchangeDirection=;right'andnotdirection=='left': 3direction=changeDirection 4ifchangedirection='left'andnotdirection=='right': 5direction=changeDirection 6ifchangedirection='up'andnotdirection=='down': 7direction=changeDirection 8ifchangedirection='down'andnotdirection=='up': 9direction=changeDirection
下一步是根据键盘的输入将蛇头转弯,并将蛇头的当前位置添加到蛇身列表中
1#按方向移动蛇头坐标 2ifdirection='right': 3snakePosition[0]+=20 4ifdirection='left': 5snakePosition[0]=20 6ifdirection='up': 7snakePosition[1]-=20 8ifdirection='down': 9snakePosition[1]+=20 10 列表中添加了蛇头的位置 Segments12snake.insert(0,list(snakePosition))
3.3 判断是否吃树莓
如果蛇头与覆盆子的方块重叠,则确定吃覆盆子并清除覆盆子的数量;如果你不吃覆盆子,蛇身会跟着蛇头移动,蛇身的最后一节会被踢出名单。
1#判断是否吃了树莓 2ifsnakePosition[0]==raspberryPosition[0]andsnakePosition[1]==raspberryPosition[1]: 3raspberySpawned 4else: Segments5snake.pop()#每次将最后一个单位的蛇身踢出列表
3.4 再生树莓
当覆盆子数量为0时,重生覆盆子,分数增加。
1#如果你吃覆盆子,重生覆盆子 2ifraspberySpawned=: 3x=random.randrange(1,32) 4y=random.randrange(1,24) 5raspberyPosition=[int(x*20),int(y*20)] 6raspberySpawned 7score+=1
3.5 刷新显示层
每次蛇和树莓运动时,都会刷新显示层进行显示。有点像动画的“帧”。
