基于Python制作的贪吃蛇小游戏

基于 Python 制作的贪吃蛇小游戏 导语 因为公众号下一期打算发利用强化学习玩贪吃蛇小游戏(T_T 不小心剧透了),但是我翻了一下自己发的小游戏系列的文章

本文包含相关资料包-----> 点击直达获取<-------

基于 Python 制作的贪吃蛇小游戏

导语

因为公众号下一期打算发利用强化学习玩贪吃蛇小游戏(T_T 不小心剧透了),但是我翻了一下自己发的小游戏系列的文章,竟然从来没水过写贪吃蛇的文章。于是随手写了一个,先过来分享一下,虽然我知道这玩意已经烂大街了,有种每学一门新语言大家都会先写个贪吃蛇热热身的感觉。不过游戏本身不是重点,后面那期才是,所以这篇文章我也没放头条发,毕竟只是为后面那期做个铺垫。T_T

废话不多说,让我们愉快地开始吧~

开发工具

Python 版本: 3.6.4

相关模块:

pygame 模块;

以及一些 Python 自带的模块。

环境搭建

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

先睹为快

在 cmd 窗口运行如下命令即可:

python Game24.py

效果如下:

原理简介

贪吃蛇的游戏规则应该不需要我多做介绍了吧 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)

就是这么简单,大功告成啦。完整源代码详见相关文件。

参考文献

  • 基于.NET平台的游戏门户系统设计与实现(电子科技大学·余胜鹏)
  • 促进计算思维发展的教学游戏设计与开发(山东师范大学·宗伟伟)
  • 基于.NET平台的ETF终端设计与实现(吉林大学·刘健)
  • 网络游戏虚拟物品交易系统设计与实现(吉林大学·李云峰)
  • 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐)
  • 豆玩手机游戏平台的设计与实现(吉林大学·李天明)
  • 基于微服务的游戏鉴赏互动系统设计与实现(华中科技大学·孙宝)
  • 3D云游戏平台的设计与实现(北京交通大学·闫璐)
  • 基于网络爬虫的电影集成搜索系统设计与实现(江西农业大学·江沛)
  • 基于Nutch的漏洞垂直搜索引擎(北京邮电大学·刘凤灵)
  • 基于.NET平台的游戏门户系统设计与实现(电子科技大学·余胜鹏)
  • 基于SSH框架的电子宠物系统设计与实现(吉林大学·王丽丽)
  • 手机游戏跨平台开发框架的设计与实现(北京工业大学·郑琳)
  • 移动游戏快速开发平台设计与实现(电子科技大学·赵懋骏)
  • 基于网络爬虫的电影集成搜索系统设计与实现(江西农业大学·江沛)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设项目助手 ,原文地址:https://m.bishedaima.com/yuanma/36067.html

相关推荐

发表回复

登录后才能评论