年前无意看到一个用Python写的小桌面程序,可以自动玩扫雷的游戏,觉得挺有意思,决定用C#也做一个。【真实情况是:我知道Python最近比较火,非常适合搞爬虫、大数据、机器学习之类的,但现在连桌面程序都用Python做了吗?还给不给.NET程序员活路了?简直不能忍!】
春节期间正好有闲就搞了一下,先下载了一个第三方的扫雷游戏,实现功能以后觉得下载的这个扫雷游戏分辨率太低了,也不好看,所以又自己做了一个扫雷游戏,凑成一套。
源码下载地址:https://github.com/seabluescn/AutoMineSweeper
需要提前说明的是,这两个程序是独立的,之间没有任何接口与联系,自动扫雷的程序通过读取屏幕信息获取游戏状态,并模拟鼠标操作来进行游戏。下面就几个相关技术点和大家分享一下。
[DllImport("user32.dll")] private static extern int GetWindowRect(IntPtr hwnd, out Rect lpRect); private Rect GetWindowRect() { Process[] processes = Process.GetProcesses(); Process process = null; for (int i = 0; i < processes.Length - 1; i++) { process = processes[i]; if (process.MainWindowTitle == "MineSweeper") { break; } } Rect rect = new Rect(); GetWindowRect(process.MainWindowHandle, out rect); return rect; }
Rect rect = GetWindowRect(); int left = rect.Left; int top = rect.Top; int centerleft = 21; //偏移 int centertop = 93; int centerwidth = 300; int centerheight = 300; Bitmap bitmapCenter = new Bitmap(centerwidth, centerheight); using (Graphics graphics = Graphics.FromImage(bitmapCenter)) { graphics.CopyFromScreen(left + centerleft, top + centertop, 0, 0, new Size(centerwidth, centerheight)); this.pictureBox1.Image?.Dispose(); this.pictureBox1.Image = bitmapCenter; }
截图后,根据图片上固定位置的颜色信息判断该位置的状态,最终形成一个数组。
[DllImport("user32")] private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); const int MOUSEEVENTF_MOVE = 0x0001; //移动鼠标 const int MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键按下 const int MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标左键抬起 const int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键按下 const int MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标右键抬起 const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键按下 const int MOUSEEVENTF_MIDDLEUP = 0x0040; //模拟鼠标中键抬起 const int MOUSEEVENTF_ABSOLUTE = 0x8000; //标示是否采用绝对坐标 int clickPointX = X * 65535 / Screen.PrimaryScreen.Bounds.Width; int clickPointY = Y * 65535 / Screen.PrimaryScreen.Bounds.Height; //移动鼠标 mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, clickPointX, clickPointY, 0, 0); //左键点击 mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); //右键点击 mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
获得游戏状态后,需要判断下一步操作,是点开某个位置还是右键标记某个位置,算法循环遍历所有方块,一共三步:
基础算法1:对于已经翻开的块,中心数字和周围已经标记的雷数一致,其周围所有未知位置都不是雷,左键点开
基础算法2:对于已经翻开的块,中心数字=未知位置数量+周围已经标记的雷数 :其周围所有未知位置均为雷,右键标记
先计算所有已翻开的块,其周围未知块含雷的数量之和。
算法1:对于已经翻开的块,如果周围未知块超过2个,其中有一个未知块:中心数字-雷==其他位置块组合雷数总和:该未知块必不是雷
算法2:对于已经翻开的块,如果周围未知块超过2个,其中有一个未知块:数字-雷-其他位置块组合雷数=1:该未知块必是雷
对所有未知的点,计算一下周围雷的概率,选择概率最小的点开。
经测试,程序对目标状态的识别率为100%,智能程度还不错,比一般人玩的好,无聊时可以看它玩一天。
以上就是c# 实现自动扫雷的详细内容,更多关于c# 扫雷的资料请关注小牛知识库其它相关文章!
本文向大家介绍C语言实现扫雷游戏(可以自动展开),包括了C语言实现扫雷游戏(可以自动展开)的使用技巧和注意事项,需要的朋友参考一下 前言 本篇博客主要介绍如何使用C语言实现扫雷游戏。 一、游戏规则 在一张ROW行COL列的地图上存在MINE_COUNT个地雷。玩家输入坐标翻开格子,若没有踩雷,则计算此格子周围8个格子的地雷总数,并将此格子的星号用数字代替。若数字为0,则继续递归计算与此格子相邻的4
本文向大家介绍如何基于Python实现自动扫雷,包括了如何基于Python实现自动扫雷的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了如何基于Python实现自动扫雷,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。 一
本文向大家介绍C#自动实现的属性,包括了C#自动实现的属性的使用技巧和注意事项,需要的朋友参考一下 示例 自动实现的属性在C#3中引入。 自动实现的属性用空的getter和setter(访问器)声明: 当在代码中写入自动实现的属性时,编译器会创建一个私有的匿名字段,该字段只能通过属性的访问器进行访问。 上面的自动实现的属性语句等效于编写以下冗长的代码: 自动实现的属性的访问器中不能包含任何逻辑,例
本文向大家介绍C语言实现扫雷游戏,包括了C语言实现扫雷游戏的使用技巧和注意事项,需要的朋友参考一下 本文将介绍如何用C语言多文件编程实现扫雷 该示例扫雷程序可实现以下几个功能: 自定义雷数 踩雷后会将所有雷显示出来 地图大小易修改 Mine_clearance.h Mine_clearance.c main.c 显示效果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教
本文向大家介绍C语言实现扫雷程序,包括了C语言实现扫雷程序的使用技巧和注意事项,需要的朋友参考一下 使用C语言实现简单的扫雷程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现。 game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的扫雷程序,我们需要创建两个二维数组,一个保存我们随机生成的雷
本文向大家介绍C++代码实现扫雷游戏,包括了C++代码实现扫雷游戏的使用技巧和注意事项,需要的朋友参考一下 前言 提示:本文是基于easyX图形库实现的,还有部分功能可以添加,仅适合新手参考。 提示:以下是本篇文章正文内容,下面案例可供参考 一、扫雷游戏模式 在确定大小的矩形雷区中随机布置一定数量的地雷,玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。 游戏的基本操作包括左键单击和右键