用Python做贪吃蛇小游戏
简介
贪吃蛇游戏是一款经典的益智游戏,既简单又耐玩。该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长。
引言
贪吃蛇小游的设计过程,以及这个系列专题的整体架构
游戏预览
游戏开始界面
游戏进行界面
游戏结束界面
结构图
代码框架图
代码讲解
整个程序由于是调用了大量的pygame里面的库函数
main主函数-开始工作
主要承担一些游戏窗口的初始化工作,以及调用相关函数运行游戏。代码如下:
#主函数
def main():
pygame.init() # 模块初始化
snake_speed_clock = pygame.time.Clock() # 利用pygame的time模块创建Pygame时钟对象
screen = pygame.display.set_mode((windows_width, windows_height)) #利用pygame显示模块设置模式窗口宽度窗口高度
screen.fill(white)
pygame.display.set_caption("Python 贪吃蛇小游戏") #设置标题
show_start_info(screen) #欢迎信息
while True:
running_game(screen, snake_speed_clock)
show_gameover_info(screen)
基于以上代码,咱们来做几点讲解:
-
pygame.time.Clock()
利用pygame的time模块创建Pygame时钟对象,控制帧速率。pygame.time.Clock()会控制每个循环多长时间运行一次。 -
pygame.display.set_mode((windows_width, windows_height))
生成windows窗口,pygame.display.set_mode(resolution=(0,0),flags=0,depth=0)。返回的是一个surface对象(surface对象是用于表示图像的图像,只要指定尺寸,就可以利用),resolution可以控制生成windows窗口的大小,flags代表的是扩展选项, -
pygame.surface.fill(color)。对surface对象填充某一种颜色,在这里表现为窗口背景颜色的填充。
然后就运行我们游戏三个函数了
- show_start_info(screen)
显示欢迎信息,最终效果表现为:
接着死循环。因为我们的游戏设置是,当GameOver以后,我们可以按任意键重新开始游戏,或者退出。因此最后不断循环判断用户是否想重新开始游戏。
-
游戏主体running_game(screen, snake_speed_clock)
贪吃蛇运行的主体函数。整个程序的精髓所在。 -
show_gameover_info(screen)
贪吃蛇死了,显示GameOver,表现为:
show_start_info()欢迎进入游戏
代码如下:
#开始信息显示
def show_start_info(screen):
font = pygame.font.Font('myfont.ttf', 40)
tip = font.render('按任意键开始游戏~~~', True, (65, 105, 225))
gamestart = pygame.image.load('gamestart.png')
screen.blit(gamestart, (140, 30))
screen.blit(tip, (240, 550))
pygame.display.update()
while True: #键盘监听事件
for event in pygame.event.get(): # event handling loop
if event.type == QUIT:
terminate() #终止程序
elif event.type == KEYDOWN:
if (event.key == K_ESCAPE): #终止程序
terminate() #终止程序
else:
return #结束此函数, 开始游戏
-
字体显示
先创建一个Font对象,用自己的字体。有了Font对象以后, 就可以用render方法来写字了,然后通过blit方法blit到屏幕上。 -
图像加载
用 pygame.image.load()加载图像获得对象,在用blit方法刷到屏幕上。做完以上事件以后,要update一下刷新一下屏幕。 -
监听键盘
按任意键继续或者ESC退出……
running_game-让我们开始游戏吧
running_game(screen, snake_speed_clock)是游戏主要功能,也是最精髓的一部分
代码如下:
#游戏运行主体
def running_game(screen,snake_speed_clock):
startx = random.randint(3, map_width - 8) #蛇开始游戏的位置
starty = random.randint(3, map_height - 8)
snake_coords = [{
'x': startx, 'y': starty}, #初始贪吃蛇
{
'x': startx - 1, 'y': starty},
{
'x': startx - 2, 'y': starty}]
direction = RIGHT # 开始时向右移动
food = get_random_location() #食物随机位置
while True:
for event in pygame.event.get():
if event.type == QUIT:
terminate()
elif event.type == KEYDOWN:
if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:
direction = LEFT
elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:
direction = RIGHT
elif (event.key == K_UP or event.key == K_w) and direction != DOWN:
direction = UP
elif (event.key == K_DOWN or event.key == K_s) and direction != UP:
direction = DOWN
elif event.key == K_ESCAPE:
terminate()
move_snake(direction, snake_coords) #移动蛇
ret = snake_is_alive(snake_coords)
if not ret:
break #蛇死了. 游戏结束
snake_is_eat_food(snake_coords