SBI y 发表于 2022-12-19 14:30:57

志童道合 | pygame小游戏系列:扫雷

本帖最后由 SBI y 于 2022-12-19 22:23 编辑

       志“童”道合项目开始了,讲一下我小学和现在的小游戏吧。
       这篇帖子讲windows扫雷小游戏。

目录
       1、背景
       2、任务解析
         | 1、游戏玩法
         | 2、核心要点
       3、制作
         | 1、初始化
         | 2、绘制游戏
         | 3、事件处理和主循环
         | 4、界面
       4、优化、结语


       列个提纲,好写帖子些。

背景
       午后学校微机室,闷热、慵懒。无精打采的可怜的孩子们神情疲惫,心思不在“word”,“excel”,“flash”上,翻着“开始”貌似寻求着什么。
       忽然,他看到了什么:一个小小的扫雷,重新燃起了他的希望……
       于是,扫雷再次火热于同学们的鼠标下。


       哈哈哈其实就是开小差没事儿干玩扫雷而已。说实话,在微机室断网的情况下,Windows自带的游戏中,纸牌什么我们是玩不懂的,就只有扫雷这么一个内容简单,玩法不俗不腻,让人能迅速发觉它的乐趣。真是不可多得,也再一次化解同学们的无聊危机。


      可恶的是我家电脑上没有扫雷{:7_217:},气死我了。既然没有,python写一个!


任务解析
    扫雷玩法
       一片雷区里是一个矩形的正方形阵列,每个正方形格子下可能有雷,其他格子则是数字,表示周围一圈八个格子里的雷数。我们需要根据这个,点开 数字格,推出附近的雷。只要把除了雷以外的格子都点开,或者把雷都标记出来,游戏胜利;点到了雷,游戏失败。
    核心要点
       1、算出数字格里的数字;2、点到空格(0),显示周围一圈的格子。这两个部分稍难一些,用遍历就好了,2也可以用递归。

制作                  
       作品早就做好了,不想看教程可以直接在下载附件。一个文件夹,里面是扫雷的脚本、图片、声音,我还用图形化编了一个扫雷也在里面,不过用的方法很笨,主要还是看代码版的扫雷脚本。

      为了缩减帖子长度,大部分的讲解和注释都在代码里,帖子只有我大概的思路
游戏初始化
   我打算这个程序主要由pygame库来实现主体的游戏部分,pyautogui做界面,好处是mind+已经把它们图形化了,不会可以照着自学。其他还需要time库,math库和random库来辅助。
       扫雷有一个一个格子,我们要定义格子宽,以及屏幕宽有多少个格子,长有多少个。我们需要几个列表来分别存储每个格子的位置、类别(数字或 雷)、状态(无、翻开、标记、怀疑)。我们还需要一个变量记录游戏状态,一个变量为字体来显示数字和文字。还有位移量,要点1和2要用;炸弹图片,声音用变量记录;数字颜色存在一个列表里。


      这是每次程序开始时的初始化,接下来是每局游戏的初始化:


绘制游戏
       先要设置窗口、标题等,格子由横竖线画。被按下的格子则在它的位置那里画一个深一点的方,写上数字;标记写个m,表示mark(mark有标记的意思);怀疑画个问号。每种数字颜色不同,0则为空。

事件处理和主循环
      先是主循环,有大循环,包括每轮游戏和游戏后的界面部分;大循环里有小循环,是游戏主体。
      加上主循环后,大体的程序结构出来了,这是程序结构:
            程序开始时初始化
            大循环开始:
               |每轮游戏初始化
               |小循环开始:
                     |绘制游戏
                     |事件处理
               |结束界面
            程序结束
      灰色部分是以后要做的,墨绿色是已经做了的,剩下的是这个环节做的。

      这是大循环

      这是小循环
      把前面的代码和这两个while循环整理一下,变成上面的程序结构。
      是时候处理事件了:
      众所周知,一个游戏需要和玩家进行交互,就需要处理玩家所带来的事件:
      玩过扫雷的都知道,左键点击没有状态的格子是翻开,右键没有状态的格子是插旗(标记),右键插了旗的格子就会变成问号(疑惑),再右键问号就又会没有特殊状态。


      游戏自身也会发生一些事,我们需要判断胜负:

      这些都做完以后,也按照上面的程序结构整理一下,这两部分都属于事件处理部分,实在不会(说实话我不信有人不会除非你还没开始学python代码化的编程)可以照附件里的那个扫雷.py文件做。
      现在游戏已经相当完整了,但还需要界面部分

界面
      我们这个环节就要做结束的提醒界面。
      界面pyautogui做的,其实用Easygui和tkinter是一样的效果,只不过pyautogui在mind+上有图形化积木,方便那些比我还小的又想学习这个项目的小白可以对照学习。
      胜利和失败有不同的提示文本,但按钮选项都是“再来一局”和“退出游戏”,只需要根据胜利/失败改变显示的消息,再根据玩家按下的按钮改变游戏状态态(3:新一轮游戏;或0:结束程序)。
      对了还有失败特效,一个一个炸弹通过遍历画出来。


优化、结语
      到这里,游戏是完成了。
      看看多少行?130完成,不错,又精又简,还效果不错{:5_122:}。
      不过time库还没有用上,那个声音文件也没有用上。
      剩下就是要优化的部分了:
      失败效果遍历画出雷时,可以加上等待一个随机秒数做出连锁反应的效果,也可以加上声音。
      做一个计时器记录玩家的用时,也是一个不错的想法。
      不过我比较懒,剩下的优化有意者帮帮忙做一下吧。


      小结没什么好说,中间碰到的问题也很少。
      我觉得一个好的程序,一定要精简,但效果也不能打折扣。好的游戏,主要在玩法上令人着迷,才能使它留在童年的记忆里。希望这个小程序可以让你再一次找到从前玩扫雷时的感觉。



SBI y 发表于 2022-12-19 14:34:06

制作有点累,不允许白嫖帖子!!!
看了帖子要回复,留下你的宝贵意见或者支持一下,实在不行发个6也可以,绝对不允许白嫖!!!

Doughnut 发表于 2022-12-19 14:38:24

很不错哎!{:6_209:}

SBI y 发表于 2022-12-19 14:46:05

Doughnut 发表于 2022-12-19 14:38
很不错哎!

谢谢鼓励!{:7_219:}

陈玉玮 发表于 2022-12-19 15:23:40

666,给你评个分,赏个脸给我也评一个呗

SBI y 发表于 2022-12-20 11:41:17

求助:怎么把视频在帖子里面放出来呀,主要是不知道视频地址怎么搞。我录了演示效果,可是放不上去{:5_121:}

Doughnut 发表于 2022-12-20 14:52:32

SBI y 发表于 2022-12-20 11:41
求助:怎么把视频在帖子里面放出来呀,主要是不知道视频地址怎么搞。我录了演示效果,可是放不上去{:5_121: ...

可以先上传到b站或优酷,然后回到社区编辑区选择视频,在地址那粘贴b站和优酷的链接哦

Forgotten 发表于 2022-12-20 16:57:55

没有图片吗?

SBI y 发表于 2022-12-21 07:59:10

Forgotten 发表于 2022-12-20 16:57
没有图片吗?

怎么回事,我看到有图片啊?那些右上角打了社区水印的不就是

SBI y 发表于 2022-12-22 16:45:38

搞好了,看看效果:{:7_219:}https://www.bilibili.com/video/BV1cd4y1e7FP/

帅猫 发表于 2022-12-23 22:02:55

......不介意的话,换VSCode吧,支持的语言多,还带各种插件和骚操作

SBI y 发表于 2022-12-23 22:16:28

帅猫 发表于 2022-12-23 22:02
......不介意的话,换VSCode吧,支持的语言多,还带各种插件和骚操作

我还只是个萌新诶~
说实话这些插件和骚操作我也不会呀
还是先把最基础的代码学扎实了,写点小的程序熟悉了,再看看这些编辑器
基本功还没打起来其实也没有太大必要搞这些辅助性的玩意儿
主要就是觉得我现在用的这个编辑器比较好看
等以后技术强硬起来了会看看的
{:5_140:}

赤星三春牛! 发表于 2022-12-24 10:52:42

厉害厉害

赤星三春牛! 发表于 2022-12-24 10:53:50

不错啊!{:6_213:}

星辰之子 发表于 2023-8-31 15:19:02

不错啊,现在还有挺多人玩这个的

星辰之子 发表于 2023-8-31 15:20:56

为什么会有那么多分支结构
页: [1]
查看完整版本: 志童道合 | pygame小游戏系列:扫雷