时间:2025-09-10 08:02:17
文章末尾有源代码
在开始我们的2D益智游戏开发旅程之前,请确保您的开发环境建立了良好的建筑。我们将使用Python作为主要的编程语言,该语言以其简洁且易于阅读的语法而闻名,并在世界各地拥有庞大的开发人员社区。同时,我们将使用PyGame库,该库为Python提供丰富的功能,从而使我们可以轻松地在游戏开发中实现基本功能,例如图形绘图,用户输入处理和声音效果播放。这是2D游戏开发的好助手。
有多种版本的Python。目前,Python 3是主流,因此建议使用Python 3.6及以上。 Python 3在性能,语法功能和库支持方面具有显着优势,许多新的库和工具优先考虑Python 3。您可以访问官方Python网站,并根据操作系统下载相应的安装程序包。在安装过程中,请记住检查“将python添加到路径”选项,该选项将在系统环境变量中添加Python,以促进命令行上的Python命令的后续使用。
安装Python后,下一步是安装PyGame库。 Pygame库的安装非常简单,可以通过Python的软件包管理工具PIP完成。打开命令提示符(Windows)或终端(MAC和Linux),然后输入以下命令:
如果您的网络连接速度很慢,您还可以使用家庭镜像来源来加快下载速度,例如使用Tsinghua University的镜像来源:
安装完成后,您可以通过以下命令测试安装是否成功:
如果一切正常,您将看到一个小型外星拍摄游戏窗口,这表明Pygame库已成功安装,并且您的开发环境已准备就绪。
Pygame是一个开源Python库,专为2D游戏开发而设计,并建立在Simple DirectMedia Layer(SDL)上,这是一个跨平台开发库,可低级访问音频,键盘,鼠标,鼠标,操纵杆和图形硬件。 Pygame将SDL的功能封装在Python界面中,允许开发人员使用Python的简明语法和功能强大的库生态系统快速创建2D游戏和多媒体应用程序。
简单易用:Pygame的API设计简单明了,很容易开始使用某些Python基础的开发人员开始使用。例如,初始化pygame仅需要一行代码pygame.init(),而创建游戏窗口也只需要pygame.display.set_mode((width,heightth)),其中宽度和高度是窗口的宽度和高度。
功能丰富:涵盖2D游戏开发所需的所有方面,从基本的图形绘图(例如pygame.draw. ret rect到绘制矩形,pygame.draw.circle到绘制圆圈),图像加载和显示(pygame.image.image.load)处理(聆听键盘和鼠标事件),甚至提供基本的碰撞检测功能(PyGame.Sprite.Collide.Collet_Rect以检测矩形碰撞),满足大多数2D游戏的开发需求。
跨平台支持:它可以在Windows,Mac OS,Linux等多个主流操作系统上运行,这意味着开发人员只需要编写一次代码即可在不同平台上部署游戏,从而大大节省了开发时间和能源。
display 模块:负责管理游戏窗口的显示,例如创建Windows(SET_MODE),设置窗口标题(set_caption)和更新窗口显示(翻转或更新)。例如,以下代码创建一个800600像素游戏窗口,并设置标题“ 2D益智游戏”:
image 模块:用于加载,保存和处理图像。负载功能用于从文件加载图像并返回表面对象。开发人员可以在此对象上执行各种操作,例如缩放,旋转等。例如,加载一个称为“ Puzzle.png”的图像:
sprite 模块:包含一些用于管理游戏对象的类,例如Sprite和组类。 Sprite类是游戏中可见对象的基类。开发人员可以通过继承来创建各种游戏角色或元素。组类是一个容器,用于管理多个精灵对象,以易于批处理操作,例如绘图,更新,碰撞检测等。例如,创建一个简单的Sprite子类:
mixer 模块:提供音频播放功能,并支持以多种格式播放音频文件,例如WAV,MP3等。可以通过声音类播放短声效果,可以通过音乐模块播放背景音乐。例如,播放一段背景音乐:
pygame.mixer.music.play(-1)-1表示循环播放
event 模块:用于处理游戏中的各种事件,例如键盘键,鼠标点击,窗口关闭等。通过GET功能获取所有事件,然后根据事件类型进行相应处理。例如,处理窗口关闭事件:
凭借其简单,易用性,丰富的功能和跨平台优势,Pygame已成为Python开发人员开发2D游戏的首选库。通过熟悉和应用这些常用的模块,我们可以逐步构建具有完整功能并友好界面的2D益智游戏。
一旦我们准备好开发环境并对Pygame库有一定的了解,我们就可以开始构建游戏框架。游戏框架是整个游戏的基础架构,该游戏负责管理游戏的核心功能,例如初始化,窗口显示,事件处理和游戏循环。一个好的游戏框架可以使后续开发更加有序地工作。
在使用Pygame的任何功能之前,您必须先初始化它们。初始化过程将检查pygame库是否正常可用并完成一系列内部设置,包括初始化各种子模块,例如显示模块,音频模块等。Pygame.init()的简单代码可以完成所有PYGAME模块的初始化。例如:
如果在初始化过程中存在问题,则Pygame会引发异常,并且开发人员可以根据异常信息进行故障排除和修复。例如,如果缺少某些依赖库,则可能会导致初始化失败,并且此时需要安装相应的依赖库。
游戏窗口是玩家与游戏互动的主要接口。我们需要设置窗口大小,标题和其他属性。使用pygame.display.set_mode()函数来创建指定大小的游戏窗口,该窗口接受元组作为参数,元组中的两个元素分别表示窗口的宽度和高度。例如,创建一个宽度为800像素和高度为600像素的窗口:
set_mode()函数返回一个表面对象,该对象代表游戏窗口的表面,我们可以将来在此表面上绘制各种图形,图像和文本。 pygame.display.set_caption()函数可以设置窗口的标题,以便玩家可以一目了然地知道游戏的名称或主题。例如:
此外,我们还可以设置窗口图标以使游戏更个性化。使用pygame.display.set_icon()函数以作为图标传递在表面对象中。该表面对象通常是通过pygame.image.load()函数加载的图像。例如:
通过上述步骤,我们已经完成了游戏框架的初始构建,并且准备好具有指定尺寸,标题和图标的游戏窗口。在此基础上,我们可以进一步添加游戏的各种功能,例如加载游戏资源,处理用户输入,绘图游戏屏幕等。
建立游戏框架后,是时候在游戏中添加丰富的材料了。在益智游戏中,最重要的材料是拼图图片。我们需要加载高质量的图片并将其分成小块,这将成为玩家在游戏中运行的难题元素。
在Pygame的图像模块中使用负载功能来加载拼图图像。假设我们有一个称为“ Puzzle_image.jpg”的图像,并将其放在与Python脚本相同的目录中,并加载代码如下:
加载图片后,您需要将其分成几个小块。在这里,我们使用Python的图像处理库PIL(Python Imaging库)来协助完成细分操作。如果未安装PIL库,则可以使用PIP Install Pillow命令,PIP安装枕头命令是PIL库的分支,该分支提供更广泛的图像支持和更好的兼容性。
以下代码显示了如何将图像拆分为指定数量的小块:
在split_image函数中,首先获得图像的宽度和高度,然后根据指定数量的行和列计算每个小部分的宽度和高度。通过嵌套环计算每个小块的边界坐标(左,上,右,下),使用裁剪方法从原始图片中裁剪小块,然后将其添加到零件列表中。最后,返回包含所有小块的列表。
分段完成后,列表中的每个元素都是pil图像对象,我们需要将它们转换回Pygame的表面对象以供游戏中使用。转换代码如下:
该代码遍历列表。对于每个PIL的图像对象,使用Tobytes方法将其转换为字节数据,并将图像的大小和模式结合在一起,通过pygame.image.image.fromstring函数创建相应的PyGame Surface对象,并将其添加到Pygame_pieces列表中。目前,Pygame_pieces列表包含所有可用于游戏的拼图片,为随后的拼图游戏逻辑奠定了基础。
为了实现拼图零件的布局和管理,我们需要创建一个拼图类拼图件,该拼图是从pygame.sprite.sprite类继承的,这对于利用Pygame的Sprite Management功能很方便。每个拼图对象都包含其自己的图像和位置信息。我们使用二维列表来管理所有拼图的位置,以便定位和操纵很方便。例如:
在上面的代码中,拼图类别的构造函数接受了拼图件的图像及其初始x,y在窗口中的坐标。通过循环,我们根据拼图的行数和列来计算每个拼图的位置,并创建相应的拼图对象,该对象被添加到Puzzzle_pieces列表中。同时,每个拼图件都放置在二维列表的相应位置,以便我们完成拼图件的初始化和布局管理,为后续的游戏操作奠定了基础。
为了增加乐趣和具有挑战性的游戏,我们需要随机破坏拼图的顺序。在这里,您可以在python内置的随机模块中使用洗牌函数来实现它。洗牌功能可以随机破坏列表中元素的顺序。但是,直接破坏拼图列表将在拼图片的位置信息中引起混乱,因此,我们正在扰乱的是木板二维列表中拼图件的索引顺序。例如:
首先,将二维板列表缩小到一维列表flat_board中,这有助于使用洗牌功能进行中断操作。在被干扰后,一维列表中的拼图片段又恢复了二维板列表。目前,拼图零件的顺序被随机破坏。玩家面临着一个无序的难题,需要通过随后的操作来恢复。
实施玩家通过鼠标或键盘移动拼图件是游戏交互的核心部分。让我们以鼠标操作为例。当玩家点击拼图时,他需要确定是否可以移动拼图片,也就是说,它是否与空白区域相邻。如果相邻,您可以将拼图片移至空区域。在这里,我们需要收听鼠标点击事件,并将拼图片的位置信息组合在一起,以实现运动逻辑。例如:
在游戏循环中,通过pygame.event.get()获取所有活动。当检测到鼠标按下事件pygame.mousebuttondown时,获得了鼠标click鼠标_x和鼠标_y的坐标。然后在板列表上迭代,并检查哪个难题的矩形区域与鼠标点击位置相交。如果找到相交的拼图片,请查找空白块的位置。通过计算单击拼图件和空白块之间的行和列差,确定它们是否相邻(行和列的差异为1,这意味着相邻)。如果相邻,则将其在董事会列表中的位置交换以实现拼图的运动。
确定玩家是否完成难题是游戏的关键逻辑之一。我们可以通过检查是否按初始顺序排列拼图来确定游戏是否赢得了胜利。初始化拼图片时,每个拼图件在板列表中都有一个初始位置,并且当所有拼图零件返回初始位置时,游戏都会赢得胜利。例如:
在is_game_over函数中,通过双循环遍历板列表。使用索引变量索引来跟踪拼图零件的预期顺序。对于每个位置上的拼图零件,请检查它们是否是预期的拼图件(如果位置不是空的)。如果发现任何位置的拼图与在遍历过程中的预期不一致,则返回错误,表明游戏未完成。只有当所有拼图符合预期的顺序时,返回true,这表明玩家成功完成了难题,并且游戏是胜利的。
根据上一篇文章,我们已经完成了益智游戏的基本逻辑,但是游戏界面仍然相对简单。现在,让我们进一步优化游戏界面,以使其更加美丽和吸引人。
使用PyGame绘制游戏接口时,我们可以在pygame中使用各种功能。绘制模块绘制形状,例如矩形,圆圈等,或使用pygame.surface对象的闪电方法来绘制图像。在益智游戏中,我们需要绘制拼图和背景。首先,定义绘制背景的函数,例如设置坚固的背景或加载背景图像:
在游戏循环中调用此功能,以确保在每个图纸之前正确设置背景:
为了绘制拼图件,我们可以穿越板列表,并将每个拼图绘制到相应的位置。在拼图类中,已经定义了每个拼图的图像和位置信息,并且可以使用screen.blit()方法完成图形。例如:
还要在游戏循环中调用此功能:
这样,游戏界面将显示带有背景和拼图件的图片。如果您想将边界添加到拼图中以使它们看起来更清晰,则可以使用pygame.draw.Rect函数在绘制拼图时绘制矩形边框。例如:
通过上述方法,我们可以逐渐改进游戏界面的绘制,以使其更美丽和易于操作。
为了增强玩家的游戏体验,我们需要在游戏中添加一些交互式反馈,以便玩家在操作时可以立即获得响应。
首先,有鼠标悬停效应。当鼠标徘徊在拼图片上时,更改拼图的外观,让玩家知道当前的鼠标在哪里。我们可以通过聆听Mousemotion事件来实现此效果。在拼图类中添加一个属性,以指示鼠标是否在拼图片上徘徊,然后在事件处理中更新此属性。例如:
在游戏循环的事件处理部分中,添加对Mousemotion事件的处理:
然后,当绘制难题时,请根据悬停属性(例如更改颜色或透明度)更改拼图片段的方式。这是更改颜色的示例:
除了鼠标悬停效果外,添加点击声音效果还可以大大提高游戏的交互性。使用Pygame的搅拌机模块播放声音效果。首先加载点击声音效果文件,然后在鼠标点击拼图的事件处理中播放声音效果。假设我们有一个称为“ click.wav”的声音文件:
将声音播放代码添加到鼠标点击事件处理:
通过添加诸如鼠标悬停效果和点击声音之类的交互式反馈,玩家在玩益智游戏时可以获得更丰富,更有趣的体验,从而增强了游戏的吸引力和乐趣。
为了使每个人都更清楚地了解整个益智游戏的实现,下面给出了完整的Python代码,并详细评论了关键部分。
模块导入:pygame库是在游戏开发的开头导入的,PIL库中的图像模块用于图像处理,并且随机模块用于破坏拼图片的顺序。
拼图块类定义:拼图类别从pygame.sprite.sprite继承,该类用于管理拼图的图像,位置和鼠标悬停状态。
图片分割函数:split_image函数使用pil库将大图拆分为指定的行和列。
绘制函数:draw_background功能用于填充游戏背景颜色,draw_puzzle_pieces功能用于绘制拼图片,并在鼠标悬停时添加特殊效果。
游戏胜利判断函数:IS_GAME_OVER函数通过检查拼图件是否按初始顺序排列来确定游戏是否成功。
主程序部分:初始化Pygame和混音器模块,设置游戏窗口,加载拼图图片并执行细分和转换。初始化拼图的布局并破坏顺序。在游戏循环中,处理了各种事件,包括鼠标点击,动作和窗口关闭。根据活动更新游戏状态,例如移动拼图片,判断游戏胜利等。最后,在每个帧中绘制背景和拼图片并更新显示屏。当游戏结束或用户关闭窗口时退出Pygame。
首先,请确保安装了Pyinstaller。如果尚未安装,则可以通过PIP安装。打开命令提示符(Windows)或终端(MAC和Linux),然后输入以下命令:
在安装过程中,PIP将自动下载和安装Pyinstaller及其依赖项。安装完成后,您可以通过Pyinstaller version命令检查安装是否成功。如果成功安装了它,将显示Pyinstaller的版本编号。
假设您的拼图游戏代码文件命名为Puzzzle_game.py,并且所有相关资源文件(例如图像,声音效果等)都与代码文件相同的目录。在命令行上,切换到puzzzle_game.py所在的目录,然后输入package命令:
这里的参数如下:
HONEFILE:这意味着将所有文件打包到一个单独的可执行文件中,这很方便地发行。用户只需要运行此文件即可启动游戏。
- 窗口:在Windows系统上,此参数用于创建一个窗口模式可执行文件。命令行窗口将不会在运行时显示,从而使游戏启动更加简洁和友好。如果在Mac或Linux系统上,则可以省略此参数。
执行软件包命令后,Pyinstaller将开始分析您的代码,收集所有因库和资源文件,并将其包装到可执行文件中。此过程可能需要一些时间,具体取决于您的游戏代码的复杂性以及您依赖多少依赖性。在包装过程中,Pyinstaller将在命令行上输出一些信息,以显示包装的进度和状态。
包装后,将在Puzzzle_game.py所在的目录中生成两个新文件夹:构建和区域。构建文件夹在包装过程中包含临时文件,通常不需要注意。 DIST文件夹将存储我们最终需要的可执行文件。在Windows系统上,可执行文件具有.exe的扩展名,例如puzzle_game.exe;在Mac系统上,可执行文件没有扩展名,但可以直接运行。在Linux系统上,可执行文件也没有扩展名,并且需要在运行之前给出执行权限。
找到可执行文件后,双击将其运行以测试游戏是否可以正常运行。确保可以正常使用游戏的所有功能,并且可以正确加载图像和声音效果之类的资源。如果您在测试过程中发现问题,则需要返回到修复代码然后重新包装。
自2025年春节以来,AI突然变得流行。 During this period, I also followed the trend and tried many AI tools, including DeepSeek, Doubao, Tongyi Qianwen, Wenxin Yiyan, KIMI, Tencent Yuanbao, ima, Trae, etc. mainly testing the functions of these AI tools in writing articles, drawing, making videos, programming, etc.
接下来,我将谈论我使用AI工具编写小型游戏的经验。
我想制作的游戏是一款名为《牛蛋棋》的民间国际象棋游戏。我想知道是否有任何读者玩过此游戏,如下图所示:
图1:游戏初始接口
这张照片显示了我如何完成它。游戏的规则是双方轮流下棋。当对手的3件被迫移至底部3个位置时,一侧将获胜。如果一侧无法移动但不在底部的3点,则另一侧需要主动放弃空位(难度)。
我尝试了几种AI工具,然后重复尝试后,我终于选择了Bean Buns。 Doubao工具中有一个“ AI编程”。我个人认为这很好。我使用HTML5语言编写代码并在编写代码时预览效果。实际上,trae也可以,效果更加直观。但是,由于TRAE需要安装和配置,因此我终于选择了可以直接在浏览器中操作的豆面包。
当我第一次制作这款游戏时,我认为Doubao具有很高的理解和智能,因此我描述了棋盘结构和游戏规则,并让它为我生成所有代码。结果,我发现我高估了它并测试了其他几种AI工具,但我无法理解我的意图。与此相比,Doubao仍然更容易理解。
然后,我试图分解任务,然后首先让豆子bun绘制棋盘。结果,我发现它的理解仍然存在很大的差距,并且无法根据您的描述正确绘制它。没有办法,再次分解任务并指导它以一点一点。
起初,我将其描述为“删除场网的底部水平线”的棋盘结构,但是我发现它无法理解,然后在完成了很多次之后,我终于完成了它。然后我告诉它,国际象棋位置是每个线段段的终点和相交点,但是重复了很多次,但是我仍然无法正确定位并绘制国际象棋位置。
没有办法,改变主意,推翻棋盘并从头开始。我要求Doubao为我绘制9个点,这些点分布在“ 3*3”点矩阵结构中。出乎意料的是,Doubao成功地为我绘制了它。接下来,我要求他为每个点分配一个ID,然后将相关点与行连接起来,最后获得了正确的棋盘。
图2:游戏中
接下来,我逐渐引导Doubao绘制红色和蓝色的国际象棋,告诉它,下棋的规则,获胜和输的判断,进入困境后的操作等。当然,我在此过程中经历了许多沟通和调整,例如每个国际棋盘的相邻逻辑关系。一开始,我告诉Doubao国际象棋棋子,只能沿线移动,但它可能无法理解这句话的含义。后来,我清楚地指出,下面的3点的国际象棋只能向上移动并且无法水平移动,因此它编写了正确的相邻逻辑关系代码。
图3:困境(一个国际象棋无需去,但不在底部3个国际象棋位置,另一个国际象棋位置必须让步)
在正确测试了所有这些代码之后,我们将逐步指导它添加设置区域,添加第一个广播按钮,启动游戏和重置按钮,美化接口等等。
图4:游戏结束界面
总而言之,AI编程目前正在迅速发展。许多由Doubao代表的AI工具已经可以理解简单的自然语言,从而使编程新手可以编译简单的程序。但是,它仍然需要在以下方面进行改进和改进:
其次,无法识别用户的手册代码修改。基于第一个原因,有时它非常急于AI,因此它可以手动调整某个代码或某个参数。但是,当AI下次重构代码时,您的手动修改代码将通过它更改。
朋友,您是否也有使用AI编写迷你程序的想法?欢迎沟通!
您仍然很无聊地学习Python,您想放弃吗?挽救生命的工件在这里! 10个超级经典游戏项目
,Snake,Super Mary,Tank War .在演奏时写代码,您可以轻松地掌握编程,而没有基础!
贪吃蛇:使用Pygame库使小蛇“ Live”!
通过控制箭头钥匙并延长墙游戏来吃食物。在实现蛇的身体运动和食物产生的过程中,可以轻松掌握循环并协调计算!超级玛丽:复制童年时代顶级砖和吃蘑菇的乐趣
呢使用Python来绘制马里奥跳跃和攻击怪物的动漫,学会处理角色碰撞检测和水平逻辑,并充满成就!坦克大战:控制您的坦克并与敌人作战!
它涉及启动,地图加载,多坦克战斗,深入了解类和对象的编程思维,并直接掌握复杂的游戏开发!
每个项目都配备了超详细源码和评论!例如,蛇的核心代码:
Python
遵循代码,轻松学习事件监控和指导控制,这比评判教科书快10倍!
从简单的消除算法到坦克战斗中的多线程战,10个项目涵盖了基本的Python语法,图形库应用程序和游戏逻辑设计。学习后,您不仅可以自己复制经典游戏,还可以直接在工作中添加突出显示技能!
用户评论
终于找到这个帖子了!我一直都在想学习编写小游戏的代码,看了你的文章感觉很有启发。我要开始尝试写一个简单的小球游戏!
有9位网友表示赞同!
我曾经也试过编写的代码,但总是卡在一些具体的细节上,不知道该怎么解决。希望你的文章能给我一些思路,让我能够顺利完成自己的小游戏。
有7位网友表示赞同!
这篇文章非常详细,对于初学者来说简直是宝典啊!特别是你提供的那些实际案例,真的很实用!
有18位网友表示赞同!
我觉得编程语言的选择很重要,哪个语言最适合编写小游戏?文章里没有提到这一点,我有点犹豫不知道该怎么选。
有8位网友表示赞同!
说实话,我觉得这篇文章有点过于基础了,对于已经有一定的编程经验的人来说,内容还不如深入一些的好!
有8位网友表示赞同!
我想问一下,编写小游戏的思路是从哪里来灵感?我的想法总是打不住的,找不到好的方向去编下去。有没有什么建议呢?
有8位网友表示赞同!
我以前只玩过别人制作的小游戏,从来没想过自己能去做。看到你的文章后,我突然充满了一些期待和挑战!
有14位网友表示赞同!
写小游戏代码确实比我想象的难很多,总是遇到各种各样的问题,感觉我离目标越来越远了。
有20位网友表示赞同!
感觉这篇文写的太简单啦,对于想要深入学习的小伙伴来说意义不大!
有12位网友表示赞同!
我试着按照文章里的步骤编写代码,但总会出现一些错误,不知道该怎么调试?有什么解决方法吗?
有20位网友表示赞同!
写的不错,很有帮助!我最近想做一款益智类的休闲小游戏,文中提到的脚本语言很适合我的需求。我会好好学习,争取把游戏开发出来!
有16位网友表示赞同!
看了文章后感觉编写小游戏的代码真的很有成就感啊!我要马上去实践一下看看!
有18位网友表示赞同!
我觉得编程新手可以从简单的例子入手,慢慢积累经验。不要一开始就试图制作非常复杂的程序。
有9位网友表示赞同!
"编写小游戏代码"是这个时代学习的最实用的技能之一!以后肯定会有越来越多的人参与到游戏中来,学习一个相关技术真的很值得。
有9位网友表示赞同!
你分享的案例很好理解,能帮助我更加清楚地理解如何使用编程语言制作小游戏。真希望能多看到一些更具体的教程和实例!
有7位网友表示赞同!
我终于明白了如何在代码中控制游戏角色的动作了!谢谢作者分享经验!
有17位网友表示赞同!
我一直想学习编程,但是却不知道从哪里开始。看到你的文章后,让我看到了一个很好的入门路径!
有15位网友表示赞同!
虽然我不是高手,但我还是对编写小游戏的代码很有兴趣。我会努力学习,希望有一天可以开发出自己的游戏!
有12位网友表示赞同!