本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理
本文来自腾讯云,作者:Python小二
贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中。
尽管贪吃蛇的历史相对比较久远,但它却有着十分顽强的生命力,保持经久不衰,其中很重要的原因便是游戏厂家不断的对其进行更新迭代。现在,这款游戏无论是游戏场景、规则等都变得十分丰富。
接下来,我们看一下如何通过 Python 简单的实现这款小游戏。
规则
- 要有游戏主界面、贪吃蛇、食物;
- 能够控制贪吃蛇移动并获取食物;
- 贪吃蛇吃了食物后,增加自身长度、分数,食物消失并随机生成新的食物;
- 贪吃蛇触碰到周围边界或自己身体时,游戏结束。
环境
- 操作系统:Windows
- Python 版本:3.6
- 涉及模块:sys、random、pygame
实现
首先,安装第三方库 pygame,使用 pip install pygame 即可。
➢ 游戏主界面
SCREEN_X = 500<span> SCREEN_Y </span>= 500<span> screen_size </span>=<span> (SCREEN_X, SCREEN_Y) screen </span>=<span> pygame.display.set_mode(screen_size) pygame.display.set_caption(</span><span>"</span><span>贪吃蛇</span><span>"</span>)
www#gaodaima.com来源gaodai$ma#com搞$$代**码)网搞代码
➢ 贪吃蛇
初始化
<span>def</span> <span>__init__</span><span>(self): self.dirction </span>=<span> pygame.K_RIGHT self.body </span>= []
移动
<span>def</span><span> addNode(self): left, top </span>=<span> (0, 0) </span><span>if</span><span> self.body: left, top </span>=<span> (self.body[0].left, self.body[0].top) node </span>= pygame.Rect(left, top, 20, 20<span>) </span><span>if</span> self.dirction ==<span> pygame.K_LEFT: node.left </span>-= 20 <span>elif</span> self.dirction ==<span> pygame.K_RIGHT: node.left </span>+= 20 <span>elif</span> self.dirction ==<span> pygame.K_UP: node.top </span>-= 20 <span>elif</span> self.dirction ==<span> pygame.K_DOWN: node.top </span>+= 20<span> self.body.insert(0, node) </span><span>def</span><span> delNode(self): self.body.pop()</span>
改变方向
<span>def</span><span> changeDirection(self, curkey): LR </span>=<span> [pygame.K_LEFT, pygame.K_RIGHT] UD </span>=<span> [pygame.K_UP, pygame.K_DOWN] </span><span>if</span> curkey <span>in</span> LR +<span> UD: </span><span>if</span> (curkey <span>in</span> LR) <span>and</span> (self.dirction <span>in</span><span> LR): </span><span>return</span> <span>if</span> (curkey <span>in</span> UD) <span>and</span> (self.dirction <span>in</span><span> UD): </span><span>return</span><span> self.dirction </span>= curkey
死亡判断
<span>def</span><span> isDead(self): </span><span>#</span><span> 撞墙</span> <span>if</span> self.body[0].x <span>not</span> <span>in</span><span> range(SCREEN_X): </span><span>return</span><span> True </span><span>if</span> self.body[0].y <span>not</span> <span>in</span><span> range(SCREEN_Y): </span><span>return</span><span> True </span><span>#</span><span> 撞自己</span> <span>if</span> self.body[0] <span>in</span> self.body[1<span>:]: </span><span>return</span><span> True </span><span>return</span> False
<code class="prism language-python"><span class="token keyword"><span class="token function"><span class="token punctuation"><span class="token punctuation"><span class="token punctuation"><span class="token comment"><span class="token keyword"><span class="token punctuation"><span class="token punctuation"><span class="token number"><span class="token punctuation"><span class="token punctuation"><span class="token operator"><span class="token keyword"><span class="token builtin"><span class="token punctuation"><span class="token punctuation"><span class="token punctuation"><span class="token keyword"><span class="token boolean"><span class="token keyword"><span class="token punctuation"><span class="token punctuation"><span class="token number"><span class="token punctuation"><span class="token punctuation"><span class="token operator"><span class="token keyword"><span class="token builtin"><span class="token punctuation"><span class="token punctuation"><span class="token punctuation"><span class="token keyword"><span class="token boolean"><span class="token comment"><span class="token keyword"><span class="token punctuation"><span class="token punctuation"><span class="token number"><span class="token punctuation"><span class="token keyword"><span class="token punctuation"><span class="token punctuation"><span class="token number"><span class="token punctuation"><span class="token punctuation"><span class="token punctuation"><span class="token keyword"><span class="token boolean"><span class="token keyword"><span class="token boolean"> ➢ 食物 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
投放食物
<span>def</span><span> set(self): </span><span>if</span> self.rect.x == -20<span>: allpos </span>=<span> [] </span><span>for</span> pos <span>in</span> range(20, SCREEN_X - 20, 20<span>): allpos.append(pos) self.rect.left </span>=<span> random.choice(allpos) self.rect.top </span>=<span> random.choice(allpos) </span><span>print</span>(self.rect)
吃掉食物
<span>def</span><span> remove(self): self.rect.x </span>= -20
➢ 文字显示
显示方法
<span>def</span> show_text(screen, pos, text, color, font_bold=False, font_size=30, font_italic=<span>False): </span><span>#</span><span> 设置文字大小</span> cur_font = pygame.font.SysFont(<span>"</span><span>宋体</span><span>"</span><span>, font_size) </span><span>#</span><span> 加粗</span> <span> cur_font.set_bold(font_bold) </span><span>#</span><span> 斜体</span> <span> cur_font.set_italic(font_italic) </span><span>#</span><span> 设置内容</span> text_fmt = cur_font.render(text, 1<span>, color) </span><span>#</span><span> 绘制文字</span> screen.blit(text_fmt, pos)
显示分数
show_text(screen, (50, 400), <span>"</span><span>scores: </span><span>"</span> + str(scores), (103, 213, 213))
显示死亡提示
show_text(screen, (150, 50), <span>"</span><span>GAME OVER</span><span>"</span>, (227, 29, 18), False, 50<span>) show_text(screen, (</span>140, 100), <span>"</span><span>Press space to try again</span><span>"</span>, (0, 0, 22), False, 30)
➢ 吃到食物
当贪吃蛇吃掉食物,增加蛇身长度、分数,食物消失,重新投放食物。
<span>if</span> food.rect ==<span> snake.body[0]: scores </span>+= 1<span> food.remove() snake.addNode() </span><span>#</span><span> 投放食物</span> food.set()
➢ 最终效果
打包
打包使用 pyinstaller,