C#控制扫雷播放 BadApple
BadApple已经被播放在各种地方,用扫雷实现一次。

快速开始
第一步
首先我们知道视频是一帧一帧的播放的,我们就需要先把badapple视频提取成一帧一帧的图片。方法有很多,我推荐用ffmepg
来实现。下载构建好的windows版本的ffmepg。下载完成后有三个exe文件。我们只需要用到ffmepg.exe这个。然后再下载badapple的视频(链接: https://pan.baidu.com/s/1qXXo0C8 密码: buvr)。都准备好后,把ffmepg.exe和badapple.mkv这两个文件放到同一个文件夹中。
我们把扫雷的格子弄到最大,大小是2430。所以我们等等生成的图片的分辨率也应该为2430。每个像素点对应扫雷上面的一个旗子。

在文件夹空白处按住Shitf键再按鼠标右键选择打开命令行或者powershell。
然后输入ffmpeg -i badapple.mkv -s 30X24 b%d.jpg
回车

第二步
我们知道badapple是黑白的视频,但是它并不是有纯黑色or白色构成的。我们就要取出每一张图片的每一个像素的rgb值,然后计算出灰度值。应为扫雷只有有旗子和无旗子两种状态。所以我们要将灰度值平均分两份。超过中间值就插旗子。这样就可以实现图片的效果。我们打开vs2017新建一个控制台应用程序。引用System.Darwing
。首先我们先定义一个计算灰度值并返回插旗子或者不插旗子的方法。
1 | private bool IsFlag(int r, int g, int b)//一个像素点的RGB数据 |
接着我们按顺序循环读取文件夹里面的每一张图片,并且计算出每张图片的灰度判断是否要插旗子。
1 | static void Main(string[] args) |
接着,我们要定义一个数组,来记录整个扫雷是否有插旗子。创建一个24*30的二维数组来记录。true代表有旗子,false代表无旗子:
1 | stati bool[,] flaginfo = new bool[24,30]; |
我们再定义一个鼠标右键点击的方法(使用windwosAPI
):
1 | [System.Runtime.InteropServices.DllImport("user32")] |
我们还要获取扫雷窗口的位置(窗口左上角的坐标),等会调用
1 | public struct RECT //定义一个结构接收坐标 |
在main方法中加入
1 | string fullPath = "扫雷"; |
然后我们就可以更新界面了:
1 | private static void Upflaginfo(int x,int y,bool info)//更新界面 |
把这个方法在有无旗帜的地方调用就可以。
现在我们已经可以实现动画在扫雷上面播放了,但是还有一个问题,动画播放的速度不是固定的,如果配上背景音乐的化肯定会不同步。我们从一开始就计时,通过30帧的帧率,就可以算出来当前需要显示的图片。
最后
所有代码:
1 | using System; |
需要背景音乐的就在程序开始的地方加上去就好了~