c# 实现自动扫雷

年前无意看到一个用Python写的小桌面程序,可以自动玩扫雷的游戏,觉得挺有意思,决定用C#也做一个。【真实情况是:我知道Python最近比较火,非常适合搞爬虫、大数据、机器学习之类的,但现在连桌面程序都用Python做了吗?还给不给.NET程序员活路了?简直不能忍!】

春节期间正好有闲就搞了一下,先下载了一个第三方的扫雷游戏,实现功能以后觉得下载的这个扫雷游戏分辨率太低了,也不好看,所以又自己做了一个扫雷游戏,凑成一套。

源码下载地址:https://github.com/seabluescn/AutoMineSweeper

需要提前说明的是,这两个程序是独立的,之间没有任何接口与联系,自动扫雷的程序通过读取屏幕信息获取游戏状态,并模拟鼠标操作来进行游戏。下面就几个相关技术点和大家分享一下。

1、获取应用程序窗口

[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;
    }

2、屏幕截图

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;
      }

截图后,根据图片上固定位置的颜色信息判断该位置的状态,最终形成一个数组。

3、模拟鼠标点击

[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);

4、游戏算法

获得游戏状态后,需要判断下一步操作,是点开某个位置还是右键标记某个位置,算法循环遍历所有方块,一共三步:

1)基础算法

基础算法1:对于已经翻开的块,中心数字和周围已经标记的雷数一致,其周围所有未知位置都不是雷,左键点开

基础算法2:对于已经翻开的块,中心数字=未知位置数量+周围已经标记的雷数 :其周围所有未知位置均为雷,右键标记

2)高一级算法

先计算所有已翻开的块,其周围未知块含雷的数量之和。

算法1:对于已经翻开的块,如果周围未知块超过2个,其中有一个未知块:中心数字-雷==其他位置块组合雷数总和:该未知块必不是雷

算法2:对于已经翻开的块,如果周围未知块超过2个,其中有一个未知块:数字-雷-其他位置块组合雷数=1:该未知块必是雷

3)实在没有找到合适的点,只能随机点开

对所有未知的点,计算一下周围雷的概率,选择概率最小的点开。

经测试,程序对目标状态的识别率为100%,智能程度还不错,比一般人玩的好,无聊时可以看它玩一天。

以上就是c# 实现自动扫雷的详细内容,更多关于c# 扫雷的资料请关注我们其它相关文章!

(0)

相关推荐

  • 利用C#编写扫雷游戏(附源码)

    前言 翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来.当然现在看来,里面有很多的不足之处,但因博主现在已经工作,没有时间再去优化.这个项目就是利用C#编写一个Windows系统下的扫雷小游戏. 首先讲下扫雷小游戏的玩法: (1)扫雷就是要把所有非地雷的格子揭开即胜利:踩到地雷格子就算失败. (2)当点开的格子不是地雷区域的时候,该格子会显示一个数字,该数字表示的含义就是该格子周边有多少个地雷. (3)同时点开的如果非地雷的格子,周边连贯的非地雷区域都会自动被

  • C#带你玩扫雷(附源码)

    扫雷游戏,大家都应该玩过吧!其实规则也很简单,可是我们想自己实现一个扫雷,我们应该怎么做呢? Step1: 知晓游戏原理 扫雷就是要把所有非地雷的格子揭开即胜利:踩到地雷格子就算失败.游戏主区域由很多个方格组成.使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字:方格中数字则表示其周围的8个方格隐藏了几颗雷:如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开:如果其周围还有空白格,则会引发连锁反应:在你认为有雷的格子上,点击右键即可标记雷:如果一个已打开格子周围所有的雷已

  • 详解从零开始---用C#制作扫雷游戏

    学C#的原因其实挺简单的,因为一直对游戏挺感兴趣,查了下比较流行的游戏引擎Unity的主要开发语言是C#,所以就决定从C#入手,学学面向对象的编程方法. 以前基本都做的是嵌入式开发,做嵌入式久了,基本上只用C语言,C语言面向过程的特性在嵌入式编程这种资源极度受限的情况确实十分有利,但这种方式在面对大型软件的开发的时候就很难胜任了.编程的模式其实是一种思维习惯,习惯久了以后,想改变确实是一个艰难的过程··· 说起C#,其实在大学的时候学过一个学期,说来惭愧那时候倒也没把它当一门面向对象的语言(其实

  • Python自动扫雷实现方法

    本文实例讲述了Python自动扫雷实现方法.分享给大家供大家参考.具体如下: #pyWinmineCrack.py # coding: utf-8 import win32gui import win32process import win32con import win32api from ctypes import * #雷区最大行列数 MAX_ROWS = 24 MAX_COLUMNS = 30 #雷区格子在窗体上的起始坐标及每个格子的宽度 MINE_BEGIN_X = 0xC MINE_

  • python实战教程之自动扫雷

    前言 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 1.扫雷游戏 我是win10,没有默认的扫雷,所以去扫雷网下载 http://www.saolei.net/BBS/ 2.python 3 我的版本是 python 3.6.1 3.python的第三方库 win32api,win32gui,win32con,Pillow,numpy,opencv 可通过 pip install --upgrade Some

  • 如何基于Python实现自动扫雷

    这篇文章主要介绍了如何基于Python实现自动扫雷,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: win32api win32gui win32con Pillow numpy opencv 可通过 pip install --upgrade Som

  • 利用Python实现自动扫雷小脚本

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 1.扫雷游戏 我是win10,没有默认的扫雷,所以去扫雷网下载 http://www.saolei.net/BBS/ 2.python 3 我的版本是 python 3.6.1 3.python的第三方库 win32api,win32gui,win32con,Pillow,numpy,opencv 可通过 pip install --upgrade SomePac

  • c# 实现自动扫雷

    年前无意看到一个用Python写的小桌面程序,可以自动玩扫雷的游戏,觉得挺有意思,决定用C#也做一个.[真实情况是:我知道Python最近比较火,非常适合搞爬虫.大数据.机器学习之类的,但现在连桌面程序都用Python做了吗?还给不给.NET程序员活路了?简直不能忍!] 春节期间正好有闲就搞了一下,先下载了一个第三方的扫雷游戏,实现功能以后觉得下载的这个扫雷游戏分辨率太低了,也不好看,所以又自己做了一个扫雷游戏,凑成一套. 源码下载地址:https://github.com/seabluescn

  • 基于Python实现自动扫雷详解

    目录 准备 实现思路 窗体截取 雷块分割 雷块识别 扫雷算法实现 用Python+OpenCV实现了自动扫雷,突破世界记录,我们先来看一下效果吧. 中级 - 0.74秒 3BV/S=60.81 相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一.世界综合排名第二的郭蔚嘉的顶顶大名.扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求.快速的反应能力.刷新纪录的快感,这

  • Python实现简单扫雷游戏

    本文实例为大家分享了Python实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 #coding: utf-8 __note__ = """ * 扫雷小游戏 * 需要python3.x以上 * 需要安装PyQt5 * pip install PyQt5 """   import sys   try:     import PyQt5 except ImportError:     import tkinter     from tkinter

  • C语言实现扫雷游戏(可以自动展开)

    前言 本篇博客主要介绍如何使用C语言实现扫雷游戏. 一.游戏规则 在一张ROW行COL列的地图上存在MINE_COUNT个地雷.玩家输入坐标翻开格子,若没有踩雷,则计算此格子周围8个格子的地雷总数,并将此格子的星号用数字代替.若数字为0,则继续递归计算与此格子相邻的4个格子周围的地雷情况(即自动展开).若踩雷,则游戏结束.当地图上的数字与星号之和等于格子总数时,判定为玩家胜利.宏定义如下: #define ROW 9 #define COL 9 #define MINE_COUNT 10 二.游

  • JavaScript制作windows经典扫雷小游戏

    代码其实很简单,这里就不多废话了 <html> <head> <meta http-equiv="Content-Language" content="zh-cn"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>扫雷-JavaScript Mine Sweeper

随机推荐