自编扫雷程序详解(Delphi版)

2008-04-09 04:18:30来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  看了很多杂志上有很多关于编程的文章,作者似乎都只热衷于给出长长的源代码,然后稍加一点的注释。就我自己读这些文章的感受就是没有实质的东西,读者很难感受到作者的编程思路,有时候兴趣好就按源程序输一遍,而往往结果都会这儿出错那儿不行,从而就这样失去了兴趣。所以这类文章很难帮助读者提高编程能力。

  我所推崇的是作者能够写出它编程过程中的思路,其实按照这样的思路我们完全可以编写出自己的代码(只要不是完全不懂得编程的朋友),从而能按照自己所理解的思路加以修改和补充。写了这么多,应该到了写程序思路的时候了。

  有很多文章介绍过怎样写一个扫雷程序,但好像都用Button数组来做雷区的方格的,其实笔者经过实践,无论是VB还是Delphi都很难用Button数组来实现和Windows中的扫雷一样的界面和功能(除非自己再写一个能实现差不多功能的控件)。我的方法是直接在窗体上绘出Windows 扫雷程序中的Bmp。具体如下:

1、 利用ExeScope 工具(华军软件园可以下载)打开Windows中的扫雷程序,导出其中资源文件中的位图,另存到硬盘上,以备程序使用;

如图: 256 * 16 = 16 * (16 * 16 )

图 1

156* 23 = 12 * (13 * 23)

图 2

120 * 24 = 5 * (24 * 24)

图 3

2、 建一个Delphi工程,添加三个ImageList控件,按照上面的各个小图像的长和宽设好ImageList的Height 和Width,即:

ImageList1.Height = 16 ImageList1.Width=16

ImageList2.Height = 23 ImageList2.Width=13

ImageList3.Height = 24 ImageList3.Width=24

  然后双击ImageList1 ,点Add… 按钮找到图1 ,打开后出现提示选择Yes,然后选择Transparent Color 为cl3DLight,点OK完成;图2 与图3一样的步骤完成,我们所需的图像已准备完毕。

3、 绘图程序中主要用到的是ImageList的Draw方法:

Imagelist1.Draw( Canvas:Tcanvas,X:Integer,Y:Integer,

Index:Integer,[Enabled:Boolean=true] );

Canvas所要绘的图的载体;X,Y为图在载体中左顶点的位置;Index为图在ImageList中的索引值,如要在窗体上画出下图



在窗体的OnPaint事件写入以下代码:

procedure TForm1.FormPaint(Sender: TObject);

var i,j:integer;

begin

for i:=0 to 9 do

begin

for j:=0 to 9 do

imagelist1.draw(form1.canvas, i*16, j*16,0);

end;

end;

  知道了这一点,这个程序的思路就比较清晰了,扫雷的时候只要重新绘图就行了,看下面的具体实现:

  定义全局的二维动态数组和整型变量M、N,(允许用户自定义雷区大小M * N),CurrentI、CurrentJ(用户鼠标点击返回的当前位置):

BombFlag : Array of Array of Integer ; //雷的标志数组,

//-1表示雷

//0 – 8 表示该位置周围的雷数

CurrentFlag : Array of Array of Integer ; //当前位置的状态



//0表示原状,即初始化时的状态

//1表示该位置被标志为雷

//2表示该位置被标志为问号

//3表示该位置已被点开

//利用SetLength()函数来定义两个数组的大小

M: Integer = 9; //初始化默认雷区大小为9 * 9

N: Integer = 9;

CurrentI , CurrentJ : Integer;

  窗体的创建和初始化过程

① FormCreate

初始化两个动态数组,其值均设为0

procedure TForm1.FormCreate(Sender: TObject);

var i,j:integer;

Begin

SetLength(BombFlag,M,N);

SetLength(CurrentFlag,M,N);

For i:=0 to M-1 do

Begin

For j:=0 to N-1 do

Begin

BombFlag[I][j]:=0;

CurrentFlag[I][j]:=0;

End;

End;

End;

② Procedure Ini();

  初始化过程的代码就是上面介绍的在FormOnPaint事件里的代码,当然要用M,N来代替里面的两个数字9,而且也可定义两个常量来控制雷区位置,如下:

imagelist1.draw(form1.canvas, Left i*16,Right j*16, 0);

Ini() 过程在FormOnPaint事件里执行。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:让pc speaker美妙动听

下一篇:Delphi中ListBox控件的六种特效

IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设

网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源

网站联盟: 联盟新闻 联盟介绍 联盟点评 网赚技巧

行业资讯: 搜索引擎 网络游戏 电子商务 广告传媒

网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它

服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护

软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷

网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash

程序设计: Java技术 C/C++ VB delphi

网络知识: 网络协议 网络安全 网络管理 组网方案 Cisco技术

操作系统: Win2000 WinXP Win2003 Mac OS Linux FreeBSD

热门词条
最新资讯
热门关注
热门标签