GDI绘图写的简单扫雷

由于没话多少时间,这个扫雷我只实现了主要功能(扫雷功能,递归实现)

废话不多说,直接上代码


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace saolei
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

Graphics gs;
Random rand;
List<Point> leiPoint;//存放雷的坐标
List<Point> isSearch;//存放已扫描过得坐标
private void Form1_Load(object sender, EventArgs e)
{
leiPoint = new List<Point>();
rand = new Random();
}

private void btnStart_Click(object sender, EventArgs e)
{
setLei();
isSearch = new List<Point>();//实例化扫描过得雷区
gs = pnlLei.CreateGraphics();//创建画图对象
gs.Clear(this.pnlLei.BackColor);//清除所有
for (int i = 0; i < 400; i+=20)//循环绘制地图
for (int j = 0; j < 400; j+=20)
gs.FillRectangle(new SolidBrush(Color.Gray), i - 1, j-1, 19, 19);

foreach (Point p in leiPoint)//额外绘制地雷(可以注释掉)
gs.FillRectangle(new SolidBrush(Color.Purple), p.X-2, p.Y-2, 19, 19);

}

//设置雷的方法
private void setLei()
{
for (int i = 0; i < 20; i++)//循环生成20的地雷
{
int x = rand.Next(0, 20);
int y = rand.Next(0, 20);
foreach (Point p in leiPoint)
{
if (p == new Point(x, y))
{
i--;
} continue;
}
leiPoint.Add(new Point(x * 20 + 1, y * 20 + 1));
}
}

//private Color getColor()
//{
// return Color.FromArgb(rand.Next(1, 255), rand.Next(1, 255), rand.Next(1, 255));
//}

private void pnlLei_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)//判断鼠标是否使用左键单击的panel控件
{
if (!isOk(e.Location.X, e.Location.Y))//判断是否是扫描过得雷区
{
isSearch.Add(new Point(e.Location.X, e.Location.Y));//加入扫描雷区
int x = e.Location.X / 20 * 20 + 1;//将鼠标单击的坐标X调成最接近的哪一个雷区的坐标
int y = e.Location.Y / 20 * 20 + 1;//将鼠标单击的坐标Y调成最接近的哪一个雷区的坐标
if (x > 390 || x < -2) return;//判断是否超出X轴界限(结束递归)
if (y > 390 || y < -2) return;//判断是否超出Y轴界限(结束递归)
int count = getLeiCount(x, y);//获取周围雷的个数
if (count > 0)//判断是否有雷(结束递归)
{
gs.DrawString(count.ToString(), new Font("楷体", 10),//绘制雷的个数
new SolidBrush(Color.Red), x + 4, y + 4);
return;
}
gs.FillRectangle(new SolidBrush(Color.Blue), x - 2, y - 2, 19, 19);
pnlLei_MouseClick(sender, new MouseEventArgs(e.Button, 1, x + 20, y, 0));//递归调用本次单击事件(向右扫描雷区)
pnlLei_MouseClick(sender, new MouseEventArgs(e.Button, 1, x - 20, y, 0));//递归调用本次单击事件(向左扫描雷区)
pnlLei_MouseClick(sender, new MouseEventArgs(e.Button, 1, x, y + 20, 0));//递归调用本次单击事件(向下扫描雷区)
pnlLei_MouseClick(sender, new MouseEventArgs(e.Button, 1, x, y - 20, 0));//递归调用本次单击事件(向上扫描雷区)

}

}
}

//后去周围8个方向雷的个数
private int getLeiCount(int x, int y)
{
int leiCount = 0;

foreach (Point p in leiPoint)
if (p.X >= x - 20 && p.Y >= y - 20 && p.X <= x + 20 && p.Y <= y + 20)//循环判断周边是否有雷
leiCount++;

return leiCount;
}

//判断是否是已经扫描过得雷区
private bool isOk(int x, int y)
{
foreach (Point p in isSearch)
if (p == new Point(x, y))
return true;
return false;
}
}
}

很多不足之处,望各位博友多指教

时间: 2024-08-02 11:57:17

GDI绘图写的简单扫雷的相关文章

MFC GDI绘图基础

一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Windows操作系统中,动态链接库C:/WINDOWS/system32/gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面功能.在Visual C++6.0中的头文件C:/Program Files

Windows GDI绘图基础知识

一.Windows可以画直线.椭圆线(椭圆圆周上的曲线)和贝塞尔曲线.////////////7 个画线函式是:(1)画直线LineTo    BOOL LineTo(HDC hdc,int nXEnd,int nYEnd);结合MoveToEx函数使用BOOL MoveToEx(HDC hdc,int X,int Y,LPPOINT lpPoint);Point记录了旧的坐标点(先前的当前位置).///注意:GetCurrentPositionEx (hdc, &pt) ;获得当前位置. (2

GDI+ 绘图闪烁解决方法

闲着没事,准备做一个类似于TeeChart的自定义控件,结果第一步的绘图就把我给难倒了,虽然早就知道GDI绘图的闪烁问题很坑,但是却没有想到如此之坑,折腾了两天,才找到解决方法. 首先在窗体加载的时候,加入双缓存,说实话以前一直没觉得这个双缓存有什么用,不过这次总算是有了点儿效果. DoubleBuffered = true; SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlSt

MFC中的GDI绘图&lt;转&gt;

一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Windows操作系统中,动态链接库C:\WINDOWS\system32\gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面功能.在Visual C++6.0中的头文件C:\Program Files

GDI绘图中的映射模式CDC::SetMapMode()

原文链接:http://blog.csdn.net/charlessimonyi/article/details/8264572 在GDI绘图前,一般要设置映射模式.映射模式是什么呢?它是逻辑长度单位与实际长度单位的一中转换关系,比如我要画一个长为800单位,宽为600单位的矩形,那么在不同的映射模式下,一个单位可能相当于一个像素,也可能相当于一毫米,也可能相当于一微米.也就是说在有的映射模式下,我们指定的800单位的长度相当于800像素,在有的映射模式下,我们指定的800单位的长度相当于800

MFC中的GDI绘图(2)

二.MFC中GDI绘图 GDI绘图包括以下步骤:获取设备环境,设置坐标映射,创建绘图工具,调用DC绘图函数绘图. 1.获取设备环境 (1)在SDK编程中,获取设备环境的方法有两种: <1>通过API函数BeginPaint.应用程序响应WM_PAINT消息进行图形刷新时主要通过BeginPaint函数获取设备环境,在消息处理函数返回前调用API函数EndPaint释放设备环境. 函数原型为:WINUSERAPI HDC WINAPI BeginPaint( HWND hWnd,LPPAINTS

MFC中的GDI绘图(4)

3.创建绘图工具并选入DC 有了画布,要绘图我们必须有画笔画刷.在Windows中有HPEN.HBRUSH等GDI对象,MFC对GDI对象进行了很好的封装,提供了封装GDI对象的类,如CPen.CBrush.CFont.CBitmap和CPalette等,这些类都是GDI对象类CGdiObject的派生类. 一般先创建画笔(刷),然后调用CDC::SelectObject函数将画笔(刷)选入设备环境最为当前绘图工具,绘图完毕恢复设备环境以前的画笔(刷)对象,最后调用CGdiObject::Del

分享一个近期写的简单版的网页采集器

分享一个近期写的简单版的网页采集器 功能特点: 1.可通过配置,保存采集规则. 2.可通过采集规则,进行数据采集. 3.可分页,分关键字,进行采集. 4.可保存数据至数据库,文本中. ........... 功能还比较简单,喜欢深入的可以继续深入下去,暂时还没有登录的功能,因为登录功能涉及到的范围比较广,待日后慢慢研究后再开发. 我先上个图让大家一睹为快吧: 首先看看页面,我们要采集这个网站的文章 接下来,首先是查找分页,获得分页里面的文章链接,接着查找内容页需要采集的字段,生成规则,进行采集.

linux设备驱动第三篇:写一个简单的字符设备驱动

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [plain] vie