所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

Python游戏开发教程|零基础自学Pygame|实战制作贪吃蛇游戏

Python游戏开发教程|零基础自学Pygame|实战制作贪吃蛇游戏 一

文章目录CloseOpen

准备工作:从安装到Pygame入门,避坑指南都在这

先说个大实话,很多人学编程卡第一步就卡在环境搭建上。我见过有学员对着“安装Python”的教程捣鼓2小时,结果因为没勾选“Add Python to PATH”导致后面装不了库,急得差点把电脑砸了。其实真没那么复杂,我把自己 的“傻瓜式步骤”分享给你,按这个来保准一次成功。

首先是装Python,去Python官网下3.8以上的版本(别下最新的测试版,稳定最重要),安装时记得把界面最下面“Add Python to PATH”那个小方框勾上——这步能帮你省去后面一大堆命令行配置的麻烦。装完后按Win+R输入cmd,敲“python version”,如果能显示版本号(比如Python 3.9.7)就说明成了。我那个朋友当时就是漏了勾选,后来我让他重新装的时候盯着那个复选框,10分钟就搞定了。

接着装Pygame,还是在cmd里敲“pip install pygame”。这里可能会遇到“pip不是内部命令”的问题,别慌,大概率是前面PATH没配好,你去控制面板找到Python的安装路径(默认在C:Users你的用户名AppDataLocalProgramsPythonPython39Scripts),把这个路径加到系统环境变量里就行。要是网速慢,可以用国内镜像源,敲“pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame”,清华大学的源速度快得很。装完后验证一下:在IDLE里输入“import pygame”,没报错就说明Pygame能用了。

知道你可能会问:为啥非要用Pygame?就不能用别的库吗?其实游戏开发库不少,比如Pyglet、Arcade,但Pygame胜在“老而稳”——2000年就出来了,教程多到你看不完,而且对电脑配置要求低,我那台用了6年的笔记本跑起来都不卡。Pygame官方文档里专门提到,它的设计理念就是“让初学者能用最少的代码做出可见的效果”,这正是我们需要的。

学会画第一个图形,你就成功了一半。打开IDLE新建个文件,先敲这几行代码:

import pygame

pygame.init() # 初始化Pygame

screen = pygame.display.set_mode((800, 600)) # 创建800x600的窗口

pygame.display.set_caption("我的第一个游戏窗口") # 窗口标题

red = (255, 0, 0) # 红色的RGB值

running = True

while running:

for event in pygame.event.get():

if event.type == pygame.QUIT: # 点击关闭按钮时退出

running = False

screen.fill((255, 255, 255)) # 白色背景

pygame.draw.rect(screen, red, (400, 300, 50, 50)) # 画红色正方形,位置(400,300),大小50x50

pygame.display.flip() # 更新画面

pygame.quit()

运行后你会看到一个白色窗口,中间有个红色方块——这就是游戏开发的“Hello World”。这里有个细节要注意:pygame.display.flip()必须放在循环里,不然画面不会更新,你画的东西根本看不见。我之前教那个朋友时,他漏了这句,结果窗口一片白,还以为代码写错了,急得直挠头,后来加上这句,方块突然出现的时候,他眼睛都亮了。

为了让你后面开发贪吃蛇更顺手,我整理了个Pygame核心函数速查表,这些函数后面几乎每个功能都会用到,不用死记,用多了自然就熟了:

函数名 作用 使用场景 注意事项
pygame.init() 初始化Pygame所有模块 程序开头必须调用 不调用会导致后续功能无法使用
pygame.display.set_mode() 创建游戏窗口 设置窗口大小、是否全屏 参数是元组,如(800,600)表示宽800高600
pygame.event.get() 获取用户输入事件 检测键盘、鼠标操作 必须放在游戏循环里,否则无法响应输入
pygame.draw.rect() 绘制矩形 画蛇身、食物、障碍物 参数依次是:窗口、颜色、(x,y,宽,高)
pygame.time.Clock() 控制游戏帧率 让蛇移动速度稳定 用clock.tick(10)设置每秒10帧,数值越大速度越快

你可能会说:“这些函数看着简单,真用起来会不会还是晕?”其实我刚开始学的时候也这样,比如分不清fill()flip()的区别,后来发现fill()是填充背景色,flip()是刷新画面,就像画画时先铺白纸(fill),再把画好的东西展示出来(flip),这么一想就好理解多了。

实战开发贪吃蛇:从蛇身移动到碰撞检测,一步步让游戏“活”起来

现在进入最有意思的部分——做贪吃蛇!别担心,我们拆成5个小步骤,每个步骤只实现一个功能,做完一个测试一个,保证你每步都有成就感。我当时带那个朋友就是这么干的,他每完成一步就截图发朋友圈,三天下来收获了20多个赞,学习动力直接拉满。

第一步:画出蛇身和食物,给游戏搭个“舞台”

贪吃蛇的核心就是“蛇吃食物变长”,所以得先让蛇和食物出现在屏幕上。蛇身其实就是一堆连在一起的矩形,我们可以用列表存每个矩形的坐标,比如snake = [(200, 200), (180, 200), (160, 200)],每个元组代表一节蛇身的位置(x,y),这样蛇一开始就是3节。食物简单点,随机在屏幕上生成一个坐标,但要注意别让它出现在蛇身上——我之前见过有人没做这个检测,结果食物直接刷在蛇头上,游戏一开始就“吃”到食物,蛇突然变长一节,特别诡异。

代码这块你可以这么写:先定义蛇的初始位置和颜色(比如深绿色),食物用红色,然后在游戏循环里用pygame.draw.rect()把它们画出来。记得每次循环都要先用screen.fill()清屏,不然蛇移动后会留下“残影”。我那个朋友第一次画蛇的时候就忘了清屏,结果蛇移动起来像拖着一条长长的尾巴,他还以为是“特效”,直到我让他加上screen.fill((255,255,255)),屏幕瞬间干净了,他才恍然大悟:“原来之前是bug啊!”

第二步:让蛇动起来,键盘控制方向

蛇会动才叫游戏嘛!让蛇移动的原理其实很简单:每次循环给蛇头加一个移动距离(比如20像素,和蛇身一节的长度一样),然后删掉蛇尾的一节,这样看起来就像蛇在“爬”。比如蛇向右移动时,新蛇头坐标就是(snake[0][0]+20, snake[0][1]),然后snake.insert(0, 新坐标),再snake.pop()删掉最后一节。方向控制用键盘的上下左右键,通过pygame.event.get()检测按键事件,比如按右键就把移动方向设为(20, 0),按上键设为(0, -20)

这里有个坑要注意:蛇不能直接180度掉头。比如蛇正在向右走,突然按左键让它向左,就会直接撞到自己身体,游戏结束——这不符合真实贪吃蛇的逻辑。解决办法是记录当前方向,比如正在向右时,只允许按上或下键,不允许按左键。我那个朋友一开始没加这个限制,玩的时候疯狂按方向键,结果蛇原地“打结”,气得他说“这蛇怕不是个傻子”,后来加上方向判断后,游戏体验立马正常了。

第三步:碰撞检测,让游戏有“规则”

游戏得有输有赢才好玩,所以要加碰撞检测:撞墙输、撞自己输、吃到食物加分变长。先说撞墙,屏幕宽度是800,高度600,蛇头坐标如果x(撞左墙)、x>800(撞右墙)、y(撞上墙)、y>600(撞下墙),就触发游戏结束。撞自己更简单,检查蛇头坐标是否出现在蛇身列表里(除了蛇头本身),如果在就结束。

吃到食物的检测也类似:如果蛇头坐标和食物坐标重合,就加分(比如score += 10),然后生成新食物,并且蛇身不删尾(这样就变长了)。这里有个小技巧:生成新食物时用random.randint()随机坐标,但要让x和y都是20的倍数(和蛇身一节的长度一致),不然食物可能和蛇身对不齐,看起来很别扭。我之前试过让食物坐标随机到(205, 305),结果蛇头明明对准了却吃不到,后来才发现是没对齐像素,改成就餐20的倍数后,“吃食物”的手感瞬间顺畅了。

第四步:加分和游戏结束,让体验更完整

最后加上分数显示和游戏结束界面。分数用pygame.font模块,先创建字体对象font = pygame.font.SysFont('SimHei', 30)(SimHei是黑体,确保中文正常显示),然后在循环里用screen.blit(font.render(f'分数: {score}', True, (0,0,0)), (10,10))把分数画在屏幕左上角。游戏结束时,可以弹出一个“Game Over! 按R重玩”的提示,检测到R键就重置蛇的位置、分数和方向,让游戏能重新开始。

这里分享个小经验:别用系统默认字体,可能会出现中文乱码。我那个朋友一开始用pygame.font.SysFont(None, 30),结果分数显示成一堆方框,后来换成“SimHei”字体,立马正常了。如果你不知道自己电脑有哪些字体,可以用pygame.font.get_fonts()打印所有可用字体名称,挑一个支持中文的就行。

到这里,一个能玩的贪吃蛇就基本完成了!你可以试着加些扩展功能,比如吃到金色食物加20分且加速,或者每得100分提高一次移动速度(用clock.tick()的参数控制,分数越高数值越大)。我那个朋友最后就加了个“背景随机变色”的功能,虽然没啥实际作用,但他自己玩的时候特别开心,还跟我说:“这游戏虽然简单,但毕竟是自己做的,玩起来感觉就是不一样!”

如果你按这些步骤做,遇到问题别慌,先检查代码有没有漏写pygame.init()display.flip(),再看看坐标计算有没有错——90%的bug都是这些小细节导致的。做好后记得把代码保存成.py文件,双击就能运行,你甚至可以发给朋友炫耀:“看,这是我用Python写的游戏!”要是你按这个方法试了,欢迎回来告诉我你的蛇最长吃到多少分,或者遇到了什么有趣的bug,咱们一起解决~


你是不是遇到过这种情况:蛇明明一头撞墙上了,结果还跟没事似的往前冲;或者自己咬到自己身体,游戏居然还在继续跑?这其实就是碰撞检测没做好,游戏根本不知道“哦,蛇出事了,该结束了”。我之前帮朋友调代码时就碰到过,他写了蛇移动和吃食物的功能,却忘了加结束判断,结果蛇能穿墙、能自己打结,玩起来跟“幽灵蛇”似的,后来加上检测逻辑,立马就正常了。

解决办法其实很简单,咱们分两步走。第一步,先在代码开头定义个变量,比如 game_over = False,这就像给游戏装个“开关”,一开始是关着的(游戏正常运行)。第二步,在游戏循环里加判断条件,什么时候把这个开关打开呢?比如蛇撞墙的时候——假设你窗口宽800、高600,那蛇头的x坐标小于0(撞左墙)、大于800(撞右墙),或者y坐标小于0(撞上墙)、大于600(撞下墙),这些情况就把 game_over = True。还有撞自己身体,蛇身是用列表存的,比如 snake = [头, 第二节, 第三节...],那只要蛇头(snake[0])的坐标出现在蛇身其他部分(snake[1:])里,也把 game_over 设为True。

光打开开关还不够,得让游戏“听开关的话”。你之前让蛇移动的代码(比如更新蛇头坐标、删蛇尾),要套个 if not game_over: 的条件——意思就是“只要游戏没结束,蛇就动;结束了就不动”。然后在循环里加个判断,如果 game_over 是True,就用字体渲染个“Game Over! 按R重玩”的文字显示在屏幕中央,这样玩家就知道游戏结束了。对了,记得检测下键盘事件,按R键的时候把 game_over 设回False,蛇的位置、分数也重置一下,这样就能重新开始了。我那个朋友当时漏了重置蛇的位置,结果按R重玩,蛇直接从撞墙的地方继续跑,又秒撞一次,后来加上 snake = [(200,200), (180,200), (160,200)] 这种初始坐标重置,才算彻底解决问题。


安装Pygame时提示“pip不是内部命令”怎么办?

这通常是因为安装Python时没有勾选“Add Python to PATH”导致的。你可以先找到Python的安装路径(默认在C:Users你的用户名AppDataLocalProgramsPythonPython39Scripts),将该路径添加到系统环境变量的“Path”中;或者重新安装Python,安装时务必勾选界面底部的“Add Python to PATH”选项,之后再用“pip install pygame”命令即可正常安装。

为什么蛇移动时屏幕上会留下残影?

这是因为没有在每次循环中清屏导致的。Pygame绘制图形时,需要在每次更新画面(比如蛇移动后)先用“screen.fill(背景色)”清除上一帧的内容,否则之前绘制的蛇身会保留在屏幕上,看起来像留下残影。记得在循环中绘制蛇和食物之前,添加“screen.fill((255, 255, 255))”(白色背景)这样的清屏代码。

游戏里的分数文字显示乱码或方框,怎么解决?

这是因为使用了不支持中文的字体。Pygame默认字体可能不包含中文字符,你可以在创建字体对象时指定支持中文的字体,比如“SimHei”(黑体)或“Microsoft YaHei”(微软雅黑)。例如用“font = pygame.font.SysFont(‘SimHei’, 30)”创建字体,就能正常显示中文分数了。如果不确定系统有哪些字体,可用“print(pygame.font.get_fonts())”查看所有可用字体名称。

蛇撞到墙或自己身体后,游戏没有结束还在继续运行,怎么办?

这说明碰撞检测逻辑没有生效。你需要在游戏循环中添加判断:当蛇头坐标超出屏幕范围(比如x窗口宽度、y窗口高度)时,或蛇头坐标出现在蛇身列表(除蛇头外的其他元素)中时,将游戏状态设为结束(比如设置“game_over = True”),并在循环中检测到“game_over”为True时停止蛇的移动,显示结束提示。

如何给贪吃蛇游戏添加背景音乐或吃食物的音效?

可以用Pygame的mixer模块实现。先导入“pygame.mixer”,初始化后加载音频文件:“pygame.mixer.music.load(‘bgm.mp3’)”(背景音乐),用“pygame.mixer.music.play(-1)”循环播放;吃食物的音效可以用“eat_sound = pygame.mixer.Sound(‘eat.wav’)”,在检测到蛇吃到食物时调用“eat_sound.play()”即可。注意音频文件需放在代码同一目录,支持mp3、wav等格式。

原文链接:https://www.mayiym.com/39213.html,转载请注明出处。
0
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录

微信扫一扫关注
如已关注,请回复“登录”二字获取验证码