(图片下载自视觉中国)

作者 | 上海小胖

来源 | Python专栏(ID:xpchuiit)


目录

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 *   # 从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)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  初始化贪吃蛇及食物

游戏中需要有贪吃蛇及食物,我们给定一个初始值。我们将整个界面看成许多20*20的小方块,每个小方块代表一个标准小格子,贪吃蛇的长度就可以用几个标准小格子表示。我们将贪吃蛇身体用列表的形式存储,方便之后的删减。

'''初始化贪吃蛇及食物'''# 贪吃蛇的的初始位置snake_Head = [100,100]# 初始化贪吃蛇的长度 (注:这里以20*20为一个标准小格子)snake_Body = [[80,100],[60,100],[40,100]]# 指定蛇初始前进的方向,向右direction = "right"# 给定第一枚食物的位置food_Position = [300,300]# 食物标记:0代表食物已被吃掉;1代表未被吃掉。food_flag = 1# 贪吃蛇的的初始位置snake_Head = [100,100]# 初始化贪吃蛇的长度 (注:这里以20*20为一个标准小格子)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 = RIGHTfor 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))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()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(x*20),int(y*20)]    food_flag = 1if food_flag == 0:    # 随机生成x, y    x = random.randrange(1,32)    y = random.randrange(1,24)    food_Position = [int(x*20),int(y*20)]    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)# 画出贪吃蛇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()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可以把贪吃蛇玩出一个新的高度!???

「贪吃蛇」完整代码

https://github.com/MiracleYoung/You-are-Pythonista/tree/master/PythonExercise/Tool/PYGame_Snake

(*本文仅代表作者观点,转载请联系 原作者。)

精彩推荐

比写代码更重要的是抓住下一个技术风口。6月AI技术福利,亚马逊、微软、BTA、滴滴、字节跳动、美团等一线公司大牛带你一起探索机器学习、数据分析、自然语言处理、知识图谱等热门技术领域的未来方向以及落地实践。

限免即将结束,速领~

推荐阅读:

  • 我发现一个新的软件,用自然语言编程!非常酷!

  • 香港的房价真的那么贵吗?用数据挖掘真相!

  • 阿里巴巴杨群:高并发场景下Python的性能挑战

  • 媲美Pandas?Python的Datatable包怎么用?

  • 通俗易懂!使用Excel和TF实现Transformer!

  • 从0到1:Web开发绕不开的WSGI到底是什么?

  • 24式,加速你的Python

  • Python从入门到精通,这篇文章为你列出了25个关键技术点(附代码)

  • 500行Python代码打造刷脸考勤系统

你点的每个“在看”,我都认真当成了喜欢

一步步教你怎么用Python写贪吃蛇游戏相关推荐

  1. python写的游戏怎么给别人玩-一步步教你怎么用python写贪吃蛇游戏

    目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Pytho ...

  2. 如何用python写游戏_一步步教你怎么用python写贪吃蛇游戏

    目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Pytho ...

  3. 一步步教你怎么用python写贪吃蛇游戏!

    目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Pytho ...

  4. python制作贪吃蛇游戏_用Python写贪吃蛇游戏的代码实例

    这篇文章主要为大家详细介绍了Python贪吃蛇游戏的编写代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间 ...

  5. 【课件】使用Python写贪吃蛇游戏(pygame)

    使用Python写贪吃蛇游戏(pygame) 课件地址:https://blog.csdn.net/a772304419/article/details/130087202 本地路径: cd /D/W ...

  6. 手机版python3h如何自制游戏_教你如何用 Python 写一个小游戏

    教你如何用 Python 写一个小游戏 引言 最近 python 语言大火, 除了在科学计算领域 python 有用武之地之外, 在游戏后台等方面, python 也大放异彩, 本篇博文将按照正规的项 ...

  7. 如何用python开发一个贪吃蛇游戏_教你一步步利用python实现贪吃蛇游戏

    教你一步步利用python实现贪吃蛇游戏 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  教你一步步利用python实现贪吃蛇游戏.txt ] (友情提示:右键点 ...

  8. python编写贪吃蛇游戏下载,python实现简单的贪吃蛇游戏

    本文实例为大家分享了python实现贪吃蛇游戏的具体代码,加入按钮.难度.音乐.得分功能,供大家参考,具体内容如下 贪吃蛇小游戏,可以显示出得分,又背景音乐,难度选择和开始重启按钮设置. 游戏实现效果 ...

  9. python设计贪吃蛇游戏论文_用Python写一个贪吃蛇AI,让程序自己玩游戏

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

最新文章

  1. Python 3 文件和字符编码
  2. (0032) iOS 开发之Block 的基础用法及注意事项1
  3. CountDownLatch闭锁
  4. MySQL条件查询介绍
  5. 优先级队列应用-称检测点查询
  6. 5/7 SELECT语句:过滤(LIKE使用通配符)
  7. python 12306 车次数据获取
  8. 16位调色板和32位调色板_使调色板可访问
  9. php 获取文件给用户下载,php 下载文件/直接下载数据内容
  10. linux扩大lvm_Linux下lvm在线扩容步骤
  11. Android LitePal库详解
  12. GPS原始信号数据解析
  13. 华为云会议的前世今生
  14. 计算机房要保持清洁 卫生,国家机房数据安全管理制度
  15. 防沉迷系统?游戏运营商笑了!
  16. Java 的垃圾回收
  17. C++运算符重载(类内、外重载)
  18. 最终幻想java中文版_【个人翻译系列】java版FF2(最终幻想二代)英文剧情(第九期)...
  19. mega盘要_[MEGA DEAL]支付您想要的:2018机器学习套件(99%折扣)
  20. 移动聊天工具Kakao要开网络银行 牌照有望下月到手

热门文章

  1. 【Unity3D】3D游戏学习
  2. Linux中less和more的区别
  3. 通过网络链接显示网页中的图片
  4. 轻轻松松磁盘整理巧用UltimateDefrag软件
  5. 好用的磁碟重組工具 - UltimateDefrag
  6. Kinect for Windows SDK开发入门
  7. Agfa HealthCare releases next generation of its gold-standard
  8. 【直击DTCC】安全行业的搜索引擎?白帽汇引爆新鲜感
  9. 2019杭州西溪龙舟文化节在西安大明宫举行
  10. 分数问题的各种语言描述