首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> Delphi教程
扫雷外挂的设计与实现(五)_delphi教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

如前所述,算法层的实现,不外乎两种操作:1。如果一个方块的数值等于周围未挖开的方块数目,则把周围所有方块标记为雷;2。如果一个方块的数值等于周围已经标记为雷的方块个数,则在该块上同时单击左右键。实际上,这只是最简单的两种判断(简单到甚至不该称之为“判断”,而只是例行公事而已),而比这更复杂的分析判断还可以有很多,但现在我们追求的是程序的简单易懂,而且,就这两种最简单的判断,已经可以达到很好的效果了,在实际中它们绝对占到了扫雷所用时间的一大多半。更高级的判断,在扫雷外挂的0.2版本里也已经实现了,但在此处若要加以叙述,不免还要大幅增加篇幅。

就来看这个最简单的算法:

=================================================================

//根据Cells中的数据进行判断,把适当的操作填入Operations中
procedure AnalyzeCells;
var
  i, j: Integer;
  neighborCount: Integer;      //保存一个方块周围未挖开的方块的数目
begin
  //首先清空输出缓冲区
  for i:=0 to AreaWidth-1 do
  for j:=0 to AreaHeight-1 do
    Operations[i, j] := opNone;
  //扫描输入缓冲区,执行两种最简单的判断
  for i:=0 to AreaWidth-1 do
  for j:=0 to AreaHeight-1 do
  begin
    //取得一个方块周围未挖开的方块的数目
    neighborCount := CountNeighbors(i, j, [csUnknown, csPossible]);
    //只有1~8的数字,并且周围存在未挖开的方块,这样的方块才有分析价值
    if (Cells[i, j]>cs0) and (Cells[i, j]<=cs8) and (neighborCount > 0) then
      //第一种情况
      if neighborCount = Ord(Cells[i, j])-CountNeighbors(i, j, [csMarked]) then
        MarkAllNeighbors(i, j)
      //第二种情况
      else if Ord(Cells[i, j]) = CountNeighbors(i, j, [csMarked]) then
        Operations[i, j] := opBothClick;
  end;
end;


//将指定方块周围8个方块中,未挖开的,包括已标记问号的,都标记为雷。
procedure MarkAllNeighbors(const x, y: Integer);
var
  i,j: Integer;
begin
  //扫描以某个坐标为中心的9个方块
  for i:=x-1 to x+1 do
  for j:=y-1 to y+1 do
  begin
    //去除中心块,并避免数组越界
    if ((i=x) and (j=y)) or (i<0) or (i>=AreaWidth) or (j<0) or (j>=AreaHeight) then
      Continue;
    //未挖开的空白则单击右键,未挖开的标问号的,则双击右键
    if Cells[i, j] = csUnknown then
        Operations[i, j] := opRightClick
    else if Cells[i, j] = csPossible then
        Operations[i, j] := opRightDoubleClick;
  end;
end;


//取得指定方块周围8个方块中等于任一个指定状态的方块的个数。
function CountNeighbors(const x, y: Integer; const targetStates: TCellStates): Integer;
var
  i,j: Integer;
begin
  result := 0;
  //扫描以某个坐标为中心的9个方块
  for i:=x-1 to x+1 do
  for j:=y-1 to y+1 do
  begin
    //去除中心块,并避免数组越界
    if ((i=x) and (j=y)) or (i<0) or (i>=AreaWidth) or (j<0) or (j>=AreaHeight) then
      Continue;
    //计数指定状态的方块
    if Cells[i, j] in targetStates then
      Inc(result);
  end;
end;
=================================================================

其中,由于枚举TCellState的常量位置的安排,Ord函数对cs0~cs8所取得的值正是0~8,即等于该方块的数值。这个算法可以算是中规中矩,没什么取巧的地方,因此应该不那么难懂。不错,至此扫雷外挂已经完全实现完毕。把上述所有函数和全局内容放在一个单元(可以是一个窗体)里,设好TTimer控件的间隔,就可以很理想的工作了。在外挂类程序的开发中,本例用到的也许是最“笨”的一种方法,但对于平面方格类游戏,其原理具有通用性。它不需对游戏底层数据、协议之类有什么了解,只需要了解游戏的屏幕图形就可以了。本例对于Windows窗口相关的某些API,也是一个较好的熟悉机会,对于初学者会有其意义。这个例子本身并不是最完善的,了解了思想,每个人自可以做出更加完善的程序。比如,应用钩子,这会大幅度减少该程序占用的系统资源。

几天时间终于写完了这堆文章,希望能给适当的人带来适当的收益。欢迎交流,信箱:euth@163.com



文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·ListBox控件基本功能-.NET教程,组件控件开发
·用window.location.href实现刷新另个框架页面-.NET教程,Asp.Net开发
·JSP+STRUTS+EJB+DAO+HIBERNATE实例-JSP教程,Jsp/Servlet
·.NET中的设计模式四:命令模式-.NET教程,Asp.Net开发
·数字转英文(货币)大写-.NET教程,数据库应用
·用户控件用户登录判断-ASP教程,客户端相关
·计数器的另一用法:自动切换首页图片-ASP教程,ASP应用
·漫谈Java数据库存取技术-JSP教程,Java技巧及代码
·正则表达式-.NET教程,Asp.Net开发
·即时通讯靠免费短信能赚10亿?
最新文章
·让flash动画适应任何分辨率的网页_flash教程
·新手必看之网站的定位篇_站长心得
·1000ip的效益也能大于一万ip_网赚技巧
·google adsense课堂:西联快汇知识_网赚技巧
·googleadsense的无效点击_google推广
·google adsense高价关键字[排行榜]_google推广
·google搜索引擎的十大应用_google推广
·windows vista下如何关闭远程控制_windows vista
·修改配置 让windows vista系统实现自动登录_windows vista
·整齐划一 将整个网页保存在一个文件中_站长心得
相关主题
  • 扫雷外挂的设计与实现(四)_delphi教程
  • 扫雷外挂的设计与实现(三)_delphi教程
  • 扫雷外挂的设计与实现(二)_delphi教程
  • 扫雷外挂的设计与实现(一)_delphi教程
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭