设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间09 现在时间09 缓存数据 现在不玩命,将来命玩你;现在不努力,未来不给力。今天,早安!

现在不玩命,将来命玩你;现在不努力,未来不给力。今天,早安!

查看: 1393|回复: 2

教你一步步利用python实现贪吃蛇游戏

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:15
  • 打卡月天数:0
  • 打卡总奖励:182
  • 最近打卡:2025-04-20 07:04:01
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
283
主题
221
精华
0
金钱
941
积分
544
注册时间
2023-1-26
最后登录
2025-5-31

发表于 2023-6-2 13:43:14 | 显示全部楼层 |阅读模式
0 引言

前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Python(蛇)玩Snake(贪吃蛇),那再合适不过了🤣🤣🤣
先通过下面这个效果图来感受下吧!
144440n63rh2111nm6zh6h.jpg

1 环境

操作系统:Windows
Python版本:3.7.3
2 需求分析

我们先来回顾下贪吃蛇中的游戏元素及游戏规则。
首先呢,需要有贪吃蛇、有食物;需要能控制贪吃蛇来上下移动获取食物;贪吃蛇在吃取食物后,自身长度增加,同时食物消失并随机生成新的食物;如果贪吃蛇触碰到四周墙壁或是触碰到自己身体时,则游戏结束。
游戏规则就是这么简单,接下来我们借助一个第三方库pygame来实现它。
  1. Pygame是一个利用SDL库的游戏库, 是一组用来开发游戏软件的 Python 程序模块。
  2. SDL(Simple DirectMedia Layer)是一个跨平台库,支持访问计算机多媒体硬件(声音、视频、输入等),SDL非常强大,但美中不足的是它是基于 C 语言的。
  3. PyGame是 SDL 库的 Python 包装器(wrapper),Pygame 在SDL库的基础上提供了各种接口,从而使用用户能够使用python语言创建各种各样的游戏或多媒体程序。
复制代码
它的安装方法很简单,如下:
  1. pip install pygame
复制代码
想要了解更多pygame功能的朋友也可以查阅官方的文档。
3 代码实现

首先导入我们要用到的模块,除了第三方库pygame外,我们还会用到一些Python内置的模块如sys、random、time等,一并导入即可。
  1. import pygame, sys, random, time
  2. # 从pygame模块导入常用的函数和常量
  3. from pygame.locals import *  
复制代码
3.1 一些全局参数的初始化

接下来,我们需要声明一些全局参数。如初始化pygame、定义游戏窗口的大小、窗口的标题、定义全局的颜色变量等信息。
  1. # 初始化Pygame库
  2. pygame.init()
  3. # 初始化一个游戏界面窗口
  4. DISPLAY = pygame.display.set_mode((640, 480))
  5. # 设置游戏窗口的标题
  6. pygame.display.set_caption('人人都是Pythonista - Snake')
  7. # 定义一个变量来控制游戏速度
  8. FPSCLOCK = pygame.time.Clock()
  9. # 初始化游戏界面内使用的字体
  10. BASICFONT = pygame.font.SysFont("SIMYOU.TTF", 80)

  11. # 定义颜色变量
  12. BLACK = pygame.Color(0, 0, 0)
  13. WHITE = pygame.Color(255, 255, 255)
  14. RED = pygame.Color(255, 0, 0)
  15. GREY = pygame.Color(150, 150, 150)
复制代码
3.2 初始化贪吃蛇及食物

游戏中需要有贪吃蛇及食物,我们给定一个初始值。我们将整个界面看成许多20*20的小方块,每个小方块代表一个标准小格子,贪吃蛇的长度就可以用几个标准小格子表示。我们将贪吃蛇身体用列表的形式存储,方便之后的删减。
'''初始化贪吃蛇及食物'''
  1. # 贪吃蛇的的初始位置
  2. snake_Head = [100,100]
  3. # 初始化贪吃蛇的长度 (注:这里以20*20为一个标准小格子)
  4. snake_Body = [[80,100],[60,100],[40,100]]
  5. # 指定蛇初始前进的方向,向右
  6. direction = "right"

  7. # 给定第一枚食物的位置
  8. food_Position = [300,300]
  9. # 食物标记:0代表食物已被吃掉;1代表未被吃掉。
  10. food_flag = 1
复制代码
3.3 实现贪吃蛇的上下左右移动

我们需要控制贪吃蛇的上下左右的移动,这里通过监听键盘输入来实现。利用键盘中的上下左右键或WASD键来控制贪吃蛇的运动。
  1. # 检测按键等Pygame事件
  2. for event in pygame.event.get():
  3.   if event.type == QUIT:
  4.     # 接收到退出事件后,退出程序
  5.     pygame.quit()
  6.     sys.exit()
  7.    
  8.   # 判断键盘事件,用 方向键 或 wsad 来表示上下左右
  9.   elif event.type == KEYDOWN:
  10.     if (event.key == K_UP or event.key == K_w) and direction != DOWN:
  11.       direction = UP
  12.     if (event.key == K_DOWN or event.key == K_s) and direction != UP:
  13.       direction = DOWN
  14.     if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:
  15.       direction = LEFT
  16.     if (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:
  17.       direction = RIGHT
复制代码
接下来就是将蛇前进方向按照键盘的输入进行转弯操作,并将蛇的头部当前的位置加入到蛇身的列表中。
  1. # 根据键盘的输入,改变蛇的头部,进行转弯操作
  2. if direction == LEFT:
  3.   snake_Head[0] -= 20
  4. if direction == RIGHT:
  5.   snake_Head[0] += 20
  6. if direction == UP:
  7.   snake_Head[1] -= 20
  8. if direction == DOWN:
  9.   snake_Head[1] += 20

  10. # 将蛇的头部当前的位置加入到蛇身的列表中
  11. snake_Body.insert(0, list(snake_Head))
复制代码
3.4 判断是否吃到食物

如果蛇头与食物的位置重合,则判定吃到食物,将食物数量清零;而没吃到食物的话,蛇身就会跟着蛇头运动,蛇身的最后一节将被踢出列表。
  1. # 判断是否吃掉食物
  2. if snake_Head[0]==food_Position[0] and snake_Head[1]==food_Position[1]:
  3.   food_flag = 0
  4. else:
  5.   snake_Body.pop()
复制代码
3.5 重新生成食物

当游戏界面中的食物数量为0时,需要重新生成食物。利用random函数来生成随机位置
  1. # 生成新的食物
  2. if food_flag == 0:
  3.   # 随机生成x, y
  4.   x = random.randrange(1,32)
  5.   y = random.randrange(1,24)
  6.   food_Position = [int(x*20),int(y*20)]
  7.   food_flag = 1
复制代码
3.6 绘制贪吃蛇、食物、分数等信息

定义贪吃蛇的绘制函数
  1. # 绘制贪吃蛇
  2. def drawSnake(snake_Body):
  3.   for i in snake_Body:
  4.     pygame.draw.rect(DISPLAY, WHITE, Rect(i[0], i[1], 20, 20))

  5. 定义食物的绘制函数
  6. # 绘制食物的位置
  7. def drawFood(food_Position):
  8.   pygame.draw.rect(DISPLAY, RED, Rect(food_Position[0], food_Position[1], 20, 20))

  9. 定义分数的绘制函数
  10. # 打印出当前得分
  11. def drawScore(score):
  12.   # 设置分数的显示颜色
  13.   score_Surf = BASICFONT.render('%s' %(score), True, GREY)
  14.   # 设置分数的位置
  15.   score_Rect = score_Surf.get_rect()
  16.   score_Rect.midtop = (320, 240)
  17.   # 绑定以上设置到句柄
  18.   DISPLAY.blit(score_Surf, score_Rect)
复制代码
这些都定义好之后,我们需要在游戏主逻辑中调用它们,并刷新Pygame的显示层,贪吃蛇与食物的每一次移动,都会进行刷新显示层的操作来显示。最后我们可以设定一个速度值来合理控制游戏执行的速度。
  1. DISPLAY.fill(BLACK)
  2. # 画出贪吃蛇
  3. drawSnake(snake_Body)
  4. # 画出食物的位置
  5. drawFood(food_Position)
  6. # 打印出玩家的分数
  7. drawScore(len(snake_Body) - 3)
  8. # 刷新Pygame的显示层,贪吃蛇与食物的每一次移动,都会进行刷新显示层的操作来显示。
  9. pygame.display.flip()
  10. # 控制游戏速度
  11. FPSCLOCK.tick(7)
复制代码
3.7 定义游戏结束的画面并判断游戏是否结束

定义函数,用于展示游戏结束的画面并退出程序
  1. # 游戏结束并退出
  2. def GameOver():
  3.   # 设置GameOver的显示颜色
  4.   GameOver_Surf = BASICFONT.render('Game Over!', True, GREY)
  5.   # 设置GameOver的位置
  6.   GameOver_Rect = GameOver_Surf.get_rect()
  7.   GameOver_Rect.midtop = (320, 10)
  8.   # 绑定以上设置到句柄
  9.   DISPLAY.blit(GameOver_Surf, GameOver_Rect)

  10.   pygame.display.flip()
  11.   # 等待3秒
  12.   time.sleep(3)
  13.   # 退出游戏
  14.   pygame.quit()
  15.   # 退出程序
  16.   sys.exit()
复制代码
在游戏主逻辑中加入判断,游戏是否结束
  1. '''游戏结束的判断'''
  2. # 贪吃蛇触碰到边界
  3. if snake_Head[0]<0 or snake_Head[0]>620:
  4.   GameOver()
  5. if snake_Head[1]<0 or snake_Head[1]>460:
  6.   GameOver()
  7. # 贪吃蛇触碰到自己
  8. for i in snake_Body[1:]:
  9.   if snake_Head[0]==i[0] and snake_Head[1]==i[1]:
  10.     GameOver()
复制代码
4 后记

本文利用Pygame模块实现了最简单的贪吃蛇版本。当然还有很多需要优化的地方,比如随机生成食物时如何避免出现在贪吃蛇的自身上、通过贪吃蛇的长度来自动控制游戏速度等等。更高级一点的有如何通过AI自动玩贪吃蛇、贪吃蛇的双人对战等,期待大家利用Python可以把贪吃蛇玩出一个新的高度!😎😎😎
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对晓枫资讯的支持。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2024-11-3
最后登录
2024-11-3

发表于 2025-2-17 10:08:23 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
16
积分
12
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2025-4-22 17:06:50 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

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