用户名: 密码: 验证码:           网站地图  高级搜索  RSS订阅  收藏本站
您的位置:主页 > 程序编程 > Delphi >

Delphi自编扫雷程序详解

[ 来源:yesky | 作者:LittleFan | 更新日期:2008-3-19 13:10:48 | 人气: | 评论 0 条 ]
  看了很多杂志上有很多关于编程的文章,作者似乎都只热衷于给出长长的源代码,然后稍加一点的注释。就我自己读这些文章的感受就是没有实质的东西,读者很难感受到作者的编程思路,有时候爱好好就按源程序输一遍,而往往结果都会这儿出错那儿不行,从而就这样失去了爱好。所以这类文章很难帮助读者提高编程能力。

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

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

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

如图: 256 * 16 = 16 * (16 * 16 ) 文章来源于www.jc567.cn

图 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中的索引值,如要在窗体上画出下图 jc567.cn



在窗体的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 ; //当前位置的状态

007网络教程网




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

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

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

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

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

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

N: Integer = 9;

CurrentI , CurrentJ : Integer;

  窗体的创建和初始化过程

① FormCreate

初始化两个动态数组,其值均设为0 文章来源于www.hot007.com

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事件里执行。

  布雷过程 (雷数答应用户输入)

Procedure BombPosition(BombNum:Integer=10); //默认雷数为10

var i,j,b:integer;

Begin

b:=0;

Randomize;

While b<>BombNum do

Begin

i:=random(M); //产生两个随机数
jc567.cn

j:=random(N);

☆  If BombFlag[i][j]<>-1 then //假如该位置不是雷,则定为雷

Begin

BombFlag:=-1;

b:=b 1;
共2页: 上一页 1 [2] 下一页
Tags:Delphi自编扫雷程序详解
您的评论
用户名: 新注册) 密码: 匿名评论 [所有评论]

·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为