一、先展示python贪吃蛇效果
二、操作说明
按键 | 功能 |
---|---|
UP | 向上移动 |
DOWN | 向下移动 |
LEFT | 向左移动 |
RIGHT | 向右移动 |
空格 | 暂停/继续 |
F1 | 加速 |
F2 | 减速 |
F3 | 开启/关闭无敌模式 |
ESC | 退出游戏 |
三、游戏说明
本教程使用python实现了一个简易的贪吃蛇游戏,为了让更多人能体会到python给我们带来的方便和乐趣,本教程源代码包含了详细的注释,同时也采用了更简单和易于理解的方式来实现贪吃蛇游戏.
游戏开始时,会生成 一个 位置随机长度为5的蛇 (蛇头红色,蛇身绿色),一个 位置随机的食物 (红色),和一堵 位置随机的长度最大为5的墙 (黑色).
游戏运行过程中,可以通过 方向键 控制蛇移动来吃掉食物,每吃掉一个食物蛇身长度加1,每吃掉 10 个食物游戏速度加快一个等级,并且增加一堵位置随机长度最大为5的墙,以增加游戏难度.
蛇移动过程中咬到自身或撞到墙就会死亡,游戏自动退出.当然,也可以开启 无敌模式 ,让小蛇尽情的畅游.
四、源码详解
本游戏的源码共分为三个模块: game模块 , window模块 , snake模块.
1、window模块
本模块用于实现游戏界面的绘制和窗口事件的检测.
本模块提供了 clear(清屏) , update(刷新) , rect(画矩形) , circle(画圆) , event(事件检测) 等接口.
本模块的功能主要使用pygame模块实现,是对pygame的进一步封装.
clear
用指定颜色填充背景,并且绘制游戏地图方格,游戏地图是一个由横向40个方格,纵向20个方格组成的方阵
'''
用背景色填充屏幕(清屏)
'''
def clear(self):
color = self._color_sub(self.COLOR_WHITE, self.gw_bgcol)
self._game_window.fill(self.gw_bgcol)
for x in range(self.maxx()+1):
pygame.draw.line(self._game_window, color, (x*self.pnt_size, 0), (x*self.pnt_size, self.gw_height), 1)
for y in range(self.maxy()+1):
pygame.draw.line(self._game_window, color, (0, y * self.pnt_size), (self.gw_width, y*self.pnt_size), 1)
update
pygame的update,刷新屏幕
'''
刷新屏幕
'''
def update(self):
pygame.display.update()
rect
往地图上的指定位置的小方格中画一个矩形,这里使用的坐标不是屏幕坐标,而是小方格在地图中的坐标( _rect是对pygame的draw.rect的封装,使用的是屏幕坐标 )
'''
在屏幕指定位置画一个正方形(相对坐标)
Parameters
:param x: 正方形左上角的x坐标
:param y: 正方形左上角的y坐标
:param color: 圆形填充颜色
'''
def rect(self, x, y, *color):
pntcol = self.pnt_col
if len(color) != 0:
pntcol = color[0]
if x < 0 or x > self.maxx() or y < 0 or y > self.maxy():
return
self._rect(x*self.pnt_size, y*self.pnt_size, pntcol)
circle
往地图上的指定位置的小方格中画一个圆形,这里使用的坐标不是屏幕坐标,而是小方格在地图中的坐标( _circle是对pygame的draw.circle的封装,使用的是屏幕坐标 )
'''
在屏幕指定位置画一个圆形(相对坐标)
Parameters
:param x: 圆形外接正方形左上角的x坐标
:param y: 圆形外接正方形左上角的y坐标
:param color: 圆形填充颜色
'''
def circle(self, x, y, *color):
pntcol = self.pnt_col
if len(color) != 0:
pntcol = color[0]
if x < 0 or x > self.maxx() or y < 0 or y > self.maxy():
return
x = x*self.pnt_size
y = y*self.pnt_size
self._circle(x, y, x+self.pnt_size, y+self.pnt_size, pntcol)
event
检按键按下的事件,是对pygame的event的封装,把按键按下的状态封装成事件
'''
屏幕事件
'''
def event(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
return<