20 stable releases

1.4.7 Sep 29, 2023
1.4.2 Dec 29, 2022
1.4.1 Oct 12, 2022
1.3.11 May 5, 2022
1.2.7 Dec 26, 2021

#190 in Algorithms

Download history 21/week @ 2024-02-11 11/week @ 2024-02-25 2/week @ 2024-03-10 88/week @ 2024-03-31

88 downloads per month

MIT license

345KB
7.5K SLoC

扫雷算法工具箱

一,ms_toollib:史上首款综合性扫雷算法工具

二、evf:史上第二款开源的扫雷录像格式

从avf到rmv,扫雷录像的文件格式在技术上已经成熟,逐渐定型,Arbiter、Viennasweeper等专业复刻版本可以轻松地记录并播放它们自己产生的录像。但这种“软件中心”的模式是封闭的,这些格式的文件只能自产自销,新的软件永远不能产生这些格式的文件。按照thefinerminer的说法,这些复刻版本都是突然出现然后消失的。目前,由于开发人员退圈,对这些文件的解析均依赖逆向,开发人员无法安全、自由地在各种格式之间转换。为了克服这个问题,一方面,freesweeper首次实现了在一款软件上播放多种格式,本文将这种特性称为“跨格式”。另一方面,freesweeper也能将其他格式的录像文件转换成rawvf格式。同时具备这两种特性无疑是未来发展的方向。然而,rawvf格式是是已占用磁盘空间为代价换取人类易读的。

特点:

  • 对于计算机,编码、解码方便。不同于RAWVF格式,开发人员否认计算机易读和人类易读可以兼顾。
  • 遵循柯克霍夫原则,格式不设计混淆。使用校验码。
  • 相比目前最流行的avf格式,evf是高精度的。精度保留至毫秒。
  • 字符串采用utf-8编码,可以编码任何语言、文字、符号。
  • 方格尺寸可调,为屏幕显示的真实尺寸。
  • 最早从游戏开始前、影响游戏的右键开始记录录像。
  • 具有易读、无歧义的白皮书(文档),还有一个勤劳的作者。没有不为人知的细节、没有后门。

后缀:evf(eee555's minesweeper video format)v0.1

格式说明:

  1. 定长1字节:版本号,本白皮书所述版本为'\1'。

  2. 定长1字节:在高信任的场景下,降低解析的复杂度。

    定长1比特:是否扫完: 软件证明这局是完成的,即没有踩雷、时间等所有数值没有溢出。其余条件一概不保证。

    定长1比特:是否正式: 软件证明这局是正式的,一定扫完,包括没有用软件筛选3BV、没有看概率、是标准模式、时间等所有数值没有溢出。不一定包括是否满足排名网站对于3BV的额外限制。

    定长1比特:是否公平完成: 软件证明这局是公平完成的,一定扫完,比如没有用软件筛选3BV、没有看概率、时间等所有数值没有溢出。公平完成和正式的区别是,只有标准游戏模式可以是正式的,而upk、无猜等模式不正式,但可以是公平完成的。如果是正式的,则一定是公平完成的。

    定长1比特:1是NF,即right == 0;0为其他。

    剩余保留,且均为0;根据成绩统计应用开发者的要求添加。

  3. 定长1字节:行数

  4. 定长1字节:列数

  5. 定长2字节:雷数,大端法。

  6. 定长1字节:方格尺寸

  7. 定长2字节:游戏模式(符号及含义:0->标准、1->upk;2->cheat;3->Density(来自Viennasweeper软件)、4->win7、5->竞速无猜、6->强无猜、7->弱无猜、8->准无猜、9->强可猜、10->弱可猜,剩余保留,根据新复刻版本开发者的要求添加),大端法。

  8. 定长2字节:3BV数值,大端法。

  9. 定长3字节:用时,单位毫秒,大端法。

  10. 以'\0'结尾字符串:录像的来源。如来自元扫雷3.1,则为"元3.1"。排名网站需要检查录像的来源。

  11. 以'\0'结尾字符串:用户标识(用户希望排名网站/软件在最显眼的位置展示出该标识)

  12. 以'\0'结尾字符串:比赛标识(用户希望使用该录像参与某比赛的凭证,但不希望排名网站/软件展示该标识)

  13. 以'\0'结尾字符串:唯一性标识(用户希望区别于其他同名用户,例如昵称、雷网id、省份、邮箱、网名、座右铭,但不希望排名网站/软件展示该标识)

  14. 以'\0'结尾字符串:开始时间戳,推荐采用格林威治时间自1970年1月1日至当前时间的总微秒数。第一次在没有标雷的位置左键弹起的时间。

  15. 以'\0'结尾字符串:结束时间戳,推荐采用格林威治时间自1970年1月1日至当前时间的总微秒数。

  16. 以'\0'结尾字符串:国家名称或代码。推荐采用ISO 3166-1:2020标准国家代码的二位字母编码(大写)。

  17. 变长⌈行数×列数/8⌉字节:1代表是雷,0代表不是雷。第i × 列数 + j个比特,代表局面第i(从0开始)行、j(从0开始)列是否为雷。例如:下述3行、4列的局面(用*代表雷):
    [[1, 3, *, *],
    [3, *, *, *],
    [*, *, *, *]]就记录为00110111 11110000。

  18. 鼠标事件格式(循环结构):

    定长1字节:操作类型。1:"mv";2:"lc";3:"lr";4:"rc";5:"rr";6:"mc";7:"mr",8: "pf",9: "cc"剩余保留(除'\0'、'\255')。

    定长3字节:时间戳,单位毫秒。从第一次对局面有影响的左键或右键按下开始记录为0,此后递增。也就是说,第一次在没有标雷的位置左键弹起的时间戳不一定为0,且最后一个操作的时间戳大于等于实际用时。大端法。

    定长2字节:与左边线的距离,单位为像素。局面外的操作的坐标均记录为(行数×方格尺寸, 列数×方格尺寸)。大端法。

    定长2字节:与上边线的距离,单位为像素。局面外的操作的坐标均记录为(行数×方格尺寸, 列数×方格尺寸)。大端法。

  19. 定长1字节:'\0'表示有校验码(软件直接生成的录像);'\255'表示无校验码(例如是从avf等录像转译过来的)。

  20. 定长32字节:效验码,可有可无。

后缀:evf(eee555's minesweeper video format)v0.0

格式说明:

  1. 定长1字节:版本号,本白皮书所述版本为'\0'。

  2. 定长1字节:在高信任的场景下,降低解析的复杂度。

    定长1比特:是否扫完: 软件证明这局是完成的,即没有踩雷、时间等所有数值没有溢出。其余条件一概不保证。

    定长1比特:是否正式: 软件证明这局是正式的,一定扫完,包括没有用软件筛选3BV、没有看概率、是标准模式、时间等所有数值没有溢出。不一定包括是否满足排名网站对于3BV的额外限制。

    定长1比特:是否公平完成: 软件证明这局是公平完成的,一定扫完,比如没有用软件筛选3BV、没有看概率、时间等所有数值没有溢出。公平完成和正式的区别是,只有标准游戏模式可以是正式的,而upk、无猜等模式不正式,但可以是公平完成的。如果是正式的,则一定是公平完成的。

    剩余保留,根据成绩统计应用开发者的要求添加。

  3. 定长1字节:行数

  4. 定长1字节:列数

  5. 定长2字节:雷数,大端法。

  6. 定长1字节:方格尺寸

  7. 定长2字节:游戏模式(符号及含义:0->标准、1->upk;2->cheat;3->Density(来自Viennasweeper软件)、4->win7、5->竞速无猜、6->强无猜、7->弱无猜、8->准无猜、9->强可猜、10->弱可猜,剩余保留,根据新复刻版本开发者的要求添加),大端法。

  8. 定长2字节:3BV数值,大端法。

  9. 定长3字节:用时,单位毫秒,大端法。

  10. 以'\0'结尾字符串:录像的来源。如来自元扫雷3.1,则为"元3.1"。排名网站需要检查录像的来源。

  11. 以'\0'结尾字符串:用户标识(用户希望排名网站/软件在最显眼的位置展示出该标识)

  12. 以'\0'结尾字符串:比赛标识(用户希望使用该录像参与某比赛的凭证,但不希望排名网站/软件展示该标识)

  13. 以'\0'结尾字符串:唯一性标识(用户希望区别于其他同名用户,例如昵称、雷网id、省份、邮箱、网名、座右铭,但不希望排名网站/软件展示该标识)

  14. 以'\0'结尾字符串:开始时间戳,推荐采用格林威治时间自1970年1月1日至当前时间的总微秒数。第一次在没有标雷的位置左键弹起的时间。

  15. 以'\0'结尾字符串:结束时间戳,推荐采用格林威治时间自1970年1月1日至当前时间的总微秒数。

  16. 以'\0'结尾字符串:国家名称或代码。推荐采用ISO 3166-1:2020标准国家代码的二位字母编码(大写)。

  17. 变长⌈行数×列数/8⌉字节:1代表是雷,0代表不是雷。第i × 列数 + j个比特,代表局面第i(从0开始)行、j(从0开始)列是否为雷。例如:下述3行、4列的局面(用*代表雷):
    [[1, 3, *, *],
    [3, *, *, *],
    [*, *, *, *]]就记录为00110111 11110000。

  18. 鼠标事件格式(循环结构):

    定长1字节:操作类型。1:"mv";2:"lc";3:"lr";4:"rc";5:"rr";6:"mc";7:"mr",8: "pf",9: "cc"剩余保留(除'\0'、'\255')。

    定长3字节:时间戳,单位毫秒。从第一次对局面有影响的左键或右键按下开始记录为0,此后递增。也就是说,第一次在没有标雷的位置左键弹起的时间戳不一定为0,且最后一个操作的时间戳大于等于实际用时。大端法。

    定长2字节:与左边线的距离,单位为像素。局面外的操作的坐标均记录为(行数×方格尺寸, 列数×方格尺寸)。大端法。

    定长2字节:与上边线的距离,单位为像素。局面外的操作的坐标均记录为(行数×方格尺寸, 列数×方格尺寸)。大端法。

  19. 定长1字节:'\0'表示有校验码(软件直接生成的录像);'\255'表示无校验码(例如是从avf等录像转译过来的)。

  20. 定长32字节:效验码,可有可无。

Dependencies

~0.4–13MB
~123K SLoC