找回密码
 立即注册
查看: 425|回复: 1

Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带 ...

[复制链接]
发表于 2021-12-14 08:40 | 显示全部楼层 |阅读模式
开发工具

Python版本: 3.6.4
相关模块:
pygame模块;
以及一些Python自带的模块。
环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介

贪吃蛇的游戏规则应该不需要我多做介绍了吧T_T。写个贪吃蛇游戏其实还是很简单的。首先,我们进行一下游戏初始化:
pygame.init() screen = pygame.display.set_mode(cfg.SCREENSIZE) pygame.display.set_caption('Greedy Snake —— 微信公众号:Charles的皮卡丘') clock = pygame.time.Clock() 复制代码




然后定义一个贪吃蛇类:
'''贪吃蛇类''' class Snake(pygame.sprite.Sprite):   def __init__(self, cfg, **kwargs):     pygame.sprite.Sprite.__init__(self)     self.cfg = cfg     self.head_coord = [random.randint(5, cfg.GAME_MATRIX_SIZE[0]-6), random.randint(5, cfg.GAME_MATRIX_SIZE[1]-6)]     self.tail_coords = []     for i in range(1, 3):       self.tail_coords.append([self.head_coord[0]-i, self.head_coord[1]])     self.direction = 'right'     self.head_colors = [(0, 80, 255), (0, 255, 255)]     self.tail_colors = [(0, 155, 0), (0, 255, 0)] 复制代码

其中head_coord用来记录蛇头所在位置,而tail_coords是一个二维数组,用来记录所有蛇身的位置。一开始,贪吃蛇长为3,并且位置是随机生成的。用户通过↑↓←→键来控制贪吃蛇的行动:
# --按键检测 for event in pygame.event.get():   if event.type == pygame.QUIT:     pygame.quit()     sys.exit()   elif event.type == pygame.KEYDOWN:     if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:       snake.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key]) 复制代码

需要注意的是,贪吃蛇不能180°大拐弯,只能90°地拐弯。例如正在向左行动的贪吃蛇不能瞬间变成向右行动。具体而言,代码实现如下:
'''设置方向''' def setDirection(self, direction):   assert direction in ['up', 'down', 'right', 'left']   if direction == 'up':     if self.head_coord[1]-1 != self.tail_coords[0][1]:       self.direction = direction   elif direction == 'down':     if self.head_coord[1]+1 != self.tail_coords[0][1]:       self.direction = direction   elif direction == 'left':     if self.head_coord[0]-1 != self.tail_coords[0][0]:       self.direction = direction   elif direction == 'right':     if self.head_coord[0]+1 != self.tail_coords[0][0]:       self.direction = direction 复制代码

然后,我们需要随机生成一个食物,且需要保证该食物的位置不与贪吃蛇的位置相同:
'''食物类''' class Apple(pygame.sprite.Sprite):   def __init__(self, cfg, snake_coords, **kwargs):     pygame.sprite.Sprite.__init__(self)     self.cfg = cfg     while True:       self.coord = [random.randint(0, cfg.GAME_MATRIX_SIZE[0]-1), random.randint(0, cfg.GAME_MATRIX_SIZE[1]-1)]       if self.coord not in snake_coords:         break     self.color = (255, 0, 0)   '''画到屏幕上'''   def draw(self, screen):     cx, cy = int((self.coord[0] + 0.5) * self.cfg.BLOCK_SIZE), int((self.coord[1] + 0.5) * self.cfg.BLOCK_SIZE)     pygame.draw.circle(screen, self.color, (cx, cy), self.cfg.BLOCK_SIZE//2-2) # 随机生成一个食物 apple = Apple(cfg, snake.coords) 复制代码

在更新贪吃蛇的时候,如果它吃到了食物,则蛇身长加一,否则只是简单的按照给定的方向行动而不改变蛇身长度:
'''更新贪吃蛇''' def update(self, apple):   # 根据指定的方向运动   self.tail_coords.insert(0, copy.deepcopy(self.head_coord))   if self.direction == 'up':     self.head_coord[1] -= 1   elif self.direction == 'down':     self.head_coord[1] += 1   elif self.direction == 'left':     self.head_coord[0] -= 1   elif self.direction == 'right':     self.head_coord[0] += 1   # 判断是否吃到了食物   if self.head_coord == apple.coord:     return True   else:     self.tail_coords = self.tail_coords[:-1]     return False 复制代码

同时,当贪吃蛇吃到食物时,需要重新生成一个新的食物:
apple = Apple(cfg, snake.coords) 复制代码

最后,当贪吃蛇碰到墙壁或者蛇头碰到蛇身时,游戏结束:
'''判断游戏是否结束''' @property def isgameover(self):   if (self.head_coord[0] < 0) or (self.head_coord[1] < 0) or \      (self.head_coord[0] >= self.cfg.GAME_MATRIX_SIZE[0]) or \      (self.head_coord[1] >= self.cfg.GAME_MATRIX_SIZE[1]):     return True   if self.head_coord in self.tail_coords:     return True   return False 复制代码

并显示一下游戏结束界面:
endInterface(screen, cfg) 复制代码

效果展示需要项完整目源的也可以点赞关注




经典吃豆豆小游戏原理简介

效果展示




游戏简介:

玩家通过↑↓←→键控制游戏的主角吃豆人吃掉藏在迷宫内的所有豆子,并且不能被鬼魂抓到。
若能顺利吃完迷宫内的所有豆子并且不被鬼魂抓到,则游戏胜利,否则游戏失败。
逐步实现:
Step1:定义游戏精灵类
首先,让我们先来明确一下该游戏需要哪些游戏精灵类。
① 墙类



② 食物类(即豆豆)



③ 角色类
角色类包括吃豆人和鬼魂,鬼魂由电脑控制其运动轨迹,吃豆人由玩家控制其运动轨迹。
显然,其均需具备更新角色位置和改变角色运动方向的能力,其源代码如下:


Step2:设计游戏地图
利用Step1中定义的游戏精灵类,我们就可以开始设计游戏地图了。由于时间有限,我只写了一个关卡的游戏地图,有兴趣的小伙伴可以在此基础上进行扩展(在我的源代码基础上进行扩展是很方便滴~)。游戏地图的设计包括以下四方面内容:
① 创建墙



② 创建门(一开始关幽灵用的)
image.gif
③ 创建角色



④ 创建食物
因为食物不能和墙、门以及角色的位置重叠,所以为了方便设计游戏地图,要先创建完墙、门以及角色后再创建食物:



Step3:设计游戏主循环
接下来开始设计游戏主循环。首先是初始化:




然后定义主函数:



其中startLevelGame函数用于开始某一关游戏,其源代码如下:



showText函数用于在游戏结束或关卡切换时在游戏界面中显示提示性文字,其源代码如下:


文章到这里就结束了,感谢你的观看,记得点赞关注下篇文章分享消消乐小游戏为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,需要项目源的也可以点赞关注回馈每一个读者,希望能帮到你。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-12-14 08:47 | 显示全部楼层
求源码[可怜]
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-15 04:09 , Processed in 0.137136 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表