目录
0 弁言
1 环境
2 需求剖析
3 代码实现
4 后记
0 弁言前几天,星球有人提到饕餮蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!
而用Python(蛇)玩Snake(饕餮蛇),那再得当不过了
先通过下面这个效果图来感想熏染下吧!
1 环境
操作系统:Windows
Python版本:3.7.3
2 需求剖析我们先来回顾下饕餮蛇中的游戏元素及游戏规则。
首先呢,须要有饕餮蛇、有食品;须要能掌握饕餮蛇来高下移动获取食品;饕餮蛇在吃取食品后,自身长度增加,同时食品消逝并随机天生新的食品;如果饕餮蛇触碰到四周墙壁或是触碰到自己身体时,则游戏结束。
游戏规则便是这么大略,接下来我们借助一个第三方库pygame来实现它。
Pygame是一个利用SDL库的游戏库, 是一组用来开拓游戏软件的 Python 程序模块。SDL(Simple DirectMedia Layer)是一个跨平台库,支持访问打算机多媒体硬件(声音、视频、输入等),SDL非常强大,但美中不敷的是它是基于 C 措辞的。 PyGame是 SDL 库的 Python 包装器(wrapper),Pygame 在SDL库的根本上供应了各种接口,从而利用用户能够利用python措辞创建各种各样的游戏或多媒体程序。
它的安装方法很大略,如下:
pip install pygame
想要理解更多pygame功能的朋友也可以查阅官方的文档。
3 代码实现首先导入我们要用到的模块,除了第三方库pygame外,我们还会用到一些Python内置的模块如sys、random、time等,一并导入即可。
import pygame, sys, random, time# 从pygame模块导入常用的函数和常量from pygame.locals import
3.1 一些全局参数的初始化
接下来,我们须要声明一些全局参数。如初始化pygame、定义游戏窗口的大小、窗口的标题、定义全局的颜色变量等信息。
# 初始化Pygame库pygame.init()# 初始化一个游戏界面窗口DISPLAY = pygame.display.set_mode((640, 480))# 设置游戏窗口的标题pygame.display.set_caption('大家都是Pythonista - Snake')# 定义一个变量来掌握游戏速率FPSCLOCK = pygame.time.Clock()# 初始化游戏界面内利用的字体BASICFONT = pygame.font.SysFont(\"大众SIMYOU.TTF\"大众, 80)# 定义颜色变量BLACK = pygame.Color(0, 0, 0)WHITE = pygame.Color(255, 255, 255)RED = pygame.Color(255, 0, 0)GREY = pygame.Color(150, 150, 150)
3.2 初始化饕餮蛇及食品
游戏中须要有饕餮蛇及食品,我们给定一个初始值。我们将全体界面算作许多2020的小方块,每个小方块代表一个标准小格子,饕餮蛇的长度就可以用几个标准小格子表示。我们将饕餮蛇身体用列表的形式存储,方便之后的删减。
'''初始化饕餮蛇及食品'''# 饕餮蛇的的初始位置snake_Head = [100,100]# 初始化饕餮蛇的长度 (注:这里以2020为一个标准小格子)snake_Body = [[80,100],[60,100],[40,100]]# 指定蛇初始提高的方向,向右direction = \"大众right\"大众# 给定第一枚食品的位置food_Position = [300,300]# 食品标记:0代表食品已被吃掉;1代表未被吃掉。food_flag = 1
3.3 实现饕餮蛇的高下旁边移动
我们须要掌握饕餮蛇的高下旁边的移动,这里通过监听键盘输入来实现。利用键盘中的高下旁边键或WASD键来掌握饕餮蛇的运动。
# 检测按键等Pygame事宜for event in pygame.event.get(): if event.type == QUIT: # 吸收到退失事宜后,退出程序 pygame.quit() sys.exit() # 判断键盘事宜,用 方向键 或 wsad 来表示高下旁边 elif event.type == KEYDOWN: if (event.key == K_UP or event.key == K_w) and direction != DOWN: direction = UP if (event.key == K_DOWN or event.key == K_s) and direction != UP: direction = DOWN if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT: direction = LEFT if (event.key == K_RIGHT or event.key == K_d) and direction != LEFT: direction = RIGHT
接下来便是将蛇提高方向按照键盘的输入进行转弯操作,并将蛇的头部当前的位置加入到蛇身的列表中。
# 根据键盘的输入,改变蛇的头部,进行转弯操作if direction == LEFT: snake_Head[0] -= 20if direction == RIGHT: snake_Head[0] += 20if direction == UP: snake_Head[1] -= 20if direction == DOWN: snake_Head[1] += 20# 将蛇的头部当前的位置加入到蛇身的列表中snake_Body.insert(0, list(snake_Head))
3.4 判断是否吃到食品
如果蛇头与食品的位置重合,则剖断吃到食品,将食品数量清零;而没吃到食品的话,蛇身就会随着蛇头运动,蛇身的末了一节将被踢出列表。
# 判断是否吃掉食品if snake_Head[0]==food_Position[0] and snake_Head[1]==food_Position[1]: food_flag = 0else: snake_Body.pop()
3.5 重新天生食品
当游戏界面中的食品数量为0时,须要重新天生食品。利用random函数来天生随机位置
# 天生新的食品if food_flag == 0: # 随机天生x, y x = random.randrange(1,32) y = random.randrange(1,24) food_Position = [int(x20),int(y20)] food_flag = 1
3.6 绘制饕餮蛇、食品、分数等信息
定义饕餮蛇的绘制函数
# 绘制饕餮蛇def drawSnake(snake_Body): for i in snake_Body: pygame.draw.rect(DISPLAY, WHITE, Rect(i[0], i[1], 20, 20))
定义食品的绘制函数
# 绘制食品的位置def drawFood(food_Position): pygame.draw.rect(DISPLAY, RED, Rect(food_Position[0], food_Position[1], 20, 20))
定义分数的绘制函数
# 打印出当前得分def drawScore(score): # 设置分数的显示颜色 score_Surf = BASICFONT.render('%s' %(score), True, GREY) # 设置分数的位置 score_Rect = score_Surf.get_rect() score_Rect.midtop = (320, 240) # 绑定以上设置到句柄 DISPLAY.blit(score_Surf, score_Rect)
这些都定义好之后,我们须要在游戏主逻辑中调用它们,并刷新Pygame的显示层,饕餮蛇与食品的每一次移动,都会进行刷新显示层的操作来显示。末了我们可以设定一个速率值来合理掌握游戏实行的速率。
DISPLAY.fill(BLACK)# 画出饕餮蛇drawSnake(snake_Body)# 画出食品的位置drawFood(food_Position)# 打印出玩家的分数drawScore(len(snake_Body) - 3)# 刷新Pygame的显示层,饕餮蛇与食品的每一次移动,都会进行刷新显示层的操作来显示。pygame.display.flip()# 掌握游戏速率FPSCLOCK.tick(7)
3.7 定义游戏结束的画面并判断游戏是否结束
定义函数,用于展示游戏结束的画面并退出程序
# 游戏结束并退出def GameOver(): # 设置GameOver的显示颜色 GameOver_Surf = BASICFONT.render('Game Over!', True, GREY) # 设置GameOver的位置 GameOver_Rect = GameOver_Surf.get_rect() GameOver_Rect.midtop = (320, 10) # 绑定以上设置到句柄 DISPLAY.blit(GameOver_Surf, GameOver_Rect) pygame.display.flip() # 等待3秒 time.sleep(3) # 退出游戏 pygame.quit() # 退出程序 sys.exit()
在游戏主逻辑中加入判断,游戏是否结束
'''游戏结束的判断'''# 饕餮蛇触碰到边界if snake_Head[0]<0 or snake_Head[0]>620: GameOver()if snake_Head[1]<0 or snake_Head[1]>460: GameOver()# 饕餮蛇触碰到自己for i in snake_Body[1:]: if snake_Head[0]==i[0] and snake_Head[1]==i[1]: GameOver()
4 后记本文利用Pygame模块实现了最大略的饕餮蛇版本。当然还有很多须要优化的地方,比如随机天生食品时如何避免涌如今饕餮蛇的自身上、通过饕餮蛇的长度来自动掌握游戏速率等等。
更高等一点的有如何通过AI自动玩饕餮蛇、饕餮蛇的双人对战等,期待大家利用Python可以把饕餮蛇玩出一个新的高度!
私信我「饕餮蛇」获取本文全套完全代码!