2867| 15
|
志童道合 | pygame小游戏系列:扫雷 |
本帖最后由 SBI y 于 2022-12-19 22:23 编辑 志“童”道合项目开始了,讲一下我小学和现在的小游戏吧。 这篇帖子讲windows扫雷小游戏。 目录 1、背景 2、任务解析 | 1、游戏玩法 | 2、核心要点 3、制作 | 1、初始化 | 2、绘制游戏 | 3、事件处理和主循环 | 4、界面 4、优化、结语 列个提纲,好写帖子些。 背景 午后学校微机室,闷热、慵懒。无精打采的可怜的孩子们神情疲惫,心思不在“word”,“excel”,“flash”上,翻着“开始”貌似寻求着什么。 忽然,他看到了什么:一个小小的扫雷,重新燃起了他的希望…… 于是,扫雷再次火热于同学们的鼠标下。 哈哈哈其实就是开小差没事儿干玩扫雷而已。说实话,在微机室断网的情况下,Windows自带的游戏中,纸牌什么我们是玩不懂的,就只有扫雷这么一个内容简单,玩法不俗不腻,让人能迅速发觉它的乐趣。真是不可多得,也再一次化解同学们的无聊危机。 可恶的是我家电脑上没有扫雷,气死我了。既然没有,python写一个! 任务解析 扫雷玩法 一片雷区里是一个矩形的正方形阵列,每个正方形格子下可能有雷,其他格子则是数字,表示周围一圈八个格子里的雷数。我们需要根据这个,点开 数字格,推出附近的雷。只要把除了雷以外的格子都点开,或者把雷都标记出来,游戏胜利;点到了雷,游戏失败。 核心要点 1、算出数字格里的数字;2、点到空格(0),显示周围一圈的格子。这两个部分稍难一些,用遍历就好了,2也可以用递归。 制作 作品早就做好了,不想看教程可以直接在下载附件。一个文件夹,里面是扫雷的脚本、图片、声音,我还用图形化编了一个扫雷也在里面,不过用的方法很笨,主要还是看代码版的扫雷脚本。 扫雷.zip 为了缩减帖子长度,大部分的讲解和注释都在代码里,帖子只有我大概的思路 游戏初始化 我打算这个程序主要由pygame库来实现主体的游戏部分,pyautogui做界面,好处是mind+已经把它们图形化了,不会可以照着自学。其他还需要time库,math库和random库来辅助。 扫雷有一个一个格子,我们要定义格子宽,以及屏幕宽有多少个格子,长有多少个。我们需要几个列表来分别存储每个格子的位置、类别(数字或 雷)、状态(无、翻开、标记、怀疑)。我们还需要一个变量记录游戏状态,一个变量为字体来显示数字和文字。还有位移量,要点1和2要用;炸弹图片,声音用变量记录;数字颜色存在一个列表里。 这是每次程序开始时的初始化,接下来是每局游戏的初始化: 绘制游戏 先要设置窗口、标题等,格子由横竖线画。被按下的格子则在它的位置那里画一个深一点的方,写上数字;标记写个m,表示mark(mark有标记的意思);怀疑画个问号。每种数字颜色不同,0则为空。 事件处理和主循环 先是主循环,有大循环,包括每轮游戏和游戏后的界面部分;大循环里有小循环,是游戏主体。 加上主循环后,大体的程序结构出来了,这是程序结构: 程序开始时初始化 大循环开始: |每轮游戏初始化 |小循环开始: |绘制游戏 |事件处理 |结束界面 程序结束 灰色部分是以后要做的,墨绿色是已经做了的,剩下的是这个环节做的。 这是大循环 这是小循环 把前面的代码和这两个while循环整理一下,变成上面的程序结构。 是时候处理事件了: 众所周知,一个游戏需要和玩家进行交互,就需要处理玩家所带来的事件: 玩过扫雷的都知道,左键点击没有状态的格子是翻开,右键没有状态的格子是插旗(标记),右键插了旗的格子就会变成问号(疑惑),再右键问号就又会没有特殊状态。 游戏自身也会发生一些事,我们需要判断胜负: 这些都做完以后,也按照上面的程序结构整理一下,这两部分都属于事件处理部分,实在不会(说实话我不信有人不会除非你还没开始学python代码化的编程)可以照附件里的那个扫雷.py文件做。 现在游戏已经相当完整了,但还需要界面部分 界面 我们这个环节就要做结束的提醒界面。 界面pyautogui做的,其实用Easygui和tkinter是一样的效果,只不过pyautogui在mind+上有图形化积木,方便那些比我还小的又想学习这个项目的小白可以对照学习。 胜利和失败有不同的提示文本,但按钮选项都是“再来一局”和“退出游戏”,只需要根据胜利/失败改变显示的消息,再根据玩家按下的按钮改变游戏状态态(3:新一轮游戏;或0:结束程序)。 对了还有失败特效,一个一个炸弹通过遍历画出来。 优化、结语 到这里,游戏是完成了。 看看多少行?130完成,不错,又精又简,还效果不错。 不过time库还没有用上,那个声音文件也没有用上。 剩下就是要优化的部分了: 失败效果遍历画出雷时,可以加上等待一个随机秒数做出连锁反应的效果,也可以加上声音。 做一个计时器记录玩家的用时,也是一个不错的想法。 不过我比较懒,剩下的优化有意者帮帮忙做一下吧。 小结没什么好说,中间碰到的问题也很少。 我觉得一个好的程序,一定要精简,但效果也不能打折扣。好的游戏,主要在玩法上令人着迷,才能使它留在童年的记忆里。希望这个小程序可以让你再一次找到从前玩扫雷时的感觉。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed