查看: 155|回复: 1

HTA+VBScript构建五子棋交互界面:动态棋盘生成与落子交互

[复制链接]
发表于 4 小时前 | 显示全部楼层 |阅读模式
HTA(HTML Application)是微软提供的一种允许将HTML、脚本语言(VBScript/JScript)和ActiveX组件打包成独立应用程序的技术。本文基于一个经典的HTA五子棋界面实例,拆解其核心实现:如何利用VBScript动态生成19×19棋盘,并实现鼠标悬停预览与点击落子交互。无需任何框架,仅用纯前端脚本即可快速制作一个可用的五子棋界面原型。

一、HTA应用配置
创建文件保存为 .hta 后缀,通过 <HTA:APPLICATION> 标签定义窗口行为,例如:
  1. <HTA:APPLICATION
  2.   ID="MyhyliApp"
  3.   APPLICATIONNAME="五子棋界面 - zh159"
  4.   BORDER="thin"
  5.   BORDERSTYLE=""
  6.   VERSION="1.0"
  7.   SCROLL="no"
  8.   ICON="C:\WINDOWS\System32\wuauclt.exe"
  9.   INNERBORDER="no"
  10.   CONTEXTMENU="no"
  11.   CAPTION="yes"
  12.   MAXIMIZEBUTTON="no"
  13.   MINIMIZEBUTTON="yes"
  14.   SHOWINTASKBAR="yes"
  15.   SINGLEINSTANCE="yes"
  16.   SYSMENU="yes"
  17.   WINDOWSTATE="normal"
  18.   NAVIGABLE="yes"
  19. />
复制代码
关键参数说明:SCROLL="no" 禁用滚动条;CAPTION="yes" 保留标题栏;MAXIMIZEBUTTON="no" 禁止最大化;SINGLEINSTANCE="yes" 保证只运行一个实例。ICON可以指定任意EXE路径,此处使用了系统自带的wuauclt.exe。

二、动态棋盘生成逻辑
棋盘共19行19列,对应传统五子棋规格。原文使用VBScript循环,借助字符串 "ABCDEFGHIJKLMNOPQRS"(19个字母)标记行列,通过MID函数取出坐标。核心技巧是使用多个条件判断,在边界位置绘制不同的制表符(┌ ┬ ┐ ├ ┼ ┤ └ ┴ ┘),内部格子统一使用“┼”。生成的每个TD都包含一个SPAN元素,初始显示“┼”。
  1. For i = 1 To Len(str)
  2.   with document
  3.     .write "<tr align='center'>"
  4.     For n = 1 To Len(str)
  5.       stri = MID(str,i,1)
  6.       strn = MID(str,n,1)
  7.       tdstr = "<td id='GUI_" & strn & stri & "' class='GUIwh'><span onclick='Test(this)' onMouseOver='innerText=""●"";style.color=""blue""' onMouseOut='innerText=""┼"";style.color=""""'>┼</span></td>"
  8.       s = "┼"
  9.       If (stri = "A" and strn = "A") Then .write Replace(tdstr,s,"┌")
  10.       ' … 其他边界判断省略 …
  11.     Next
  12.     .write "</tr>"
  13.   end with
  14. Next
复制代码
这种写法虽然繁琐但非常直观:通过行列首尾字母判断所在位置是否在边界,进而替换对应的制表符。对于不需要图形库的环境,这是纯文本绘制棋盘的最简方案。

三、交互事件与落子处理
每个SPAN绑定了三个事件:
onclick 触发 Test 函数(VBScript):
  1. Sub Test(this)
  2.   this.parentNode.style.cursor = "default"
  3.   this.parentNode.innerHtml = "●"
  4.   PC.style.display = "none"
  5. End Sub
复制代码
点击后将父节点(TD)内容替换为实心圆“●”,并隐藏右侧的“电脑先下”按钮。注意此版本只有界面,未实现AI或胜负判定,因此“电脑先下”按钮仅做展示。
onMouseOver 和 onMouseOut 实现鼠标悬停时显示蓝色圆点预览,移出恢复为“┼”。

四、窗口居中与标题动态更新
在页面底部添加VBScript代码,调整窗口大小并居中:
  1. width = 660
  2. height = 550
  3. window.resizeTo width, height
  4. ileft=(window.screen.width-width)/2
  5. itop=(window.screen.height-height)/2
  6. window.moveTo ileft,itop
复制代码
同时通过 setInterval 每秒更新一次文档标题,显示当前日期和星期:
  1. Sub Title
  2.   Document.title = "五子棋 - zh159 - " & FormatDateTime(Now, 1) & " " & WeekdayName(WeekDay(now)) & " " & FormatDateTime(Now, 3)
  3. End Sub
  4. Title:setInterval "Title()",500
复制代码
这一细节体现了HTA对系统时间与脚本的灵活调用能力。

五、适用场景与扩展建议
本示例适合作为HTA入门教学、VBScript动态生成表格的演示,或者快速搭建一个带棋盘的交互原型。如需完善为完整五子棋游戏,可在此基础上添加:
- 二维数组记录落子状态
- 胜负判定算法(连五检测)
- 简单AI(如评分法)
- 悔棋与重启功能
注意:HTA只能运行在Windows系统,且现代浏览器已不再支持ActiveX,因此仅适用于企业内部工具或旧系统维护场景。对于Web应用,建议改用Canvas+JavaScript实现。

附完整代码(保存为 .hta 运行):
  1. <html>
  2. <title>五子棋界面 - zh159</title>
  3. <hrad>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. <HTA:APPLICATION
  6. ID="MyhyliApp"
  7. APPLICATIONNAME="五子棋界面 - zh159"
  8. BORDER="thin"
  9. BORDERSTYLE=""
  10. VERSION="1.0"
  11. SCROLL="no"
  12. ICON="C:\WINDOWS\System32\wuauclt.exe"
  13. INNERBORDER="no"
  14. CONTEXTMENU="no"
  15. CAPTION="yes"
  16. MAXIMIZEBUTTON="no"
  17. MINIMIZEBUTTON="yes"
  18. SHOWINTASKBAR="yes"
  19. SINGLEINSTANCE="yes"
  20. SYSMENU="yes"
  21. WINDOWSTATE="normal"
  22. NAVIGABLE="yes"
  23. />
  24. </hrad>
  25. <script language="javascript"></script>
  26. <script language="VBScript"></script>
  27. <style>
  28. .GUIwh {width:24;height:24;cursor:hand;}
  29. </style>
  30. <body background="bg.gif" scroll="no" style="background: SteelBlue ;color:#ffffff;">
  31. <table align="center" width="630" border="1" cellspacing="0" cellpadding="10" borderColor="#ffffff" style="font: 13px 宋体;border-collapse:collapse;">
  32. <tr align="center">
  33. <td width="450" height="450">
  34. <table border="0" cellspacing="0" cellpadding="0" borderColor="#ffffff" style="font: 21px 宋体;border:2px solid #ffffff;">
  35. <script language="VBScript">
  36. str = "ABCDEFGHIJKLMNOPQRS"
  37. For i = 1 To Len(str)
  38. with document
  39. .write "<tr align='center'>"
  40. For n = 1 To Len(str)
  41. stri = MID(str,i,1)
  42. strn = MID(str,n,1)
  43. tdstr = "<td id='GUI_" & strn & stri & "' class='GUIwh'><span onclick='Test(this)' onMouseOver='innerText=""●"";style.color=""blue""' onMouseOut='innerText=""┼"";style.color=""""'>┼</span></td>"
  44. s = "┼"
  45. If (stri = "A" and strn = "A") Then .write Replace(tdstr,s,"┌")
  46. If stri = "A" Then If not (strn = "A" or strn = "S") Then .write Replace(tdstr,s,"┬")
  47. If (stri = "A" and strn = "S") Then .write Replace(tdstr,s,"┐")
  48. If not (stri = "A" or stri = "S") Then If strn = "A" Then .write Replace(tdstr,s,"├")
  49. If not (stri = "A" or stri = "S" or strn = "A" or strn = "S") Then .write tdstr
  50. If not (stri = "A" or stri = "S") Then If strn = "S" Then .write Replace(tdstr,s,"┤")
  51. If (stri = "S" and strn = "A") Then .write Replace(tdstr,s,"└")
  52. If stri = "S" Then If not (strn = "A" or strn = "S") Then .write Replace(tdstr,s,"┴")
  53. If (stri = "S" and strn = "S") Then .write Replace(tdstr,s,"┘")
  54. Next
  55. .write "</tr>"
  56. end with
  57. Next
  58. </script>
  59. </table>
  60. </td>
  61. <td>
  62. <span id="PC"><button>电脑先下</button><br><br>直接点击为玩家先下</span>
  63. </td>
  64. </tr>
  65. </table>
  66. </body>
  67. <script language="VBScript">
  68. width = 660
  69. height = 550
  70. window.resizeTo width, height
  71. ileft=(window.screen.width-width)/2
  72. itop=(window.screen.height-height)/2
  73. window.moveTo ileft,itop
  74. Sub Test(this)
  75. this.parentNode.style.cursor = "default"
  76. this.parentNode.innerHtml = "●"
  77. PC.style.display = "none"
  78. End Sub
  79. Sub Title
  80. Document.title = "五子棋 - zh159 - " & FormatDateTime(Now, 1) & " " & WeekdayName(WeekDay(now)) & " " & FormatDateTime(Now, 3)
  81. End Sub
  82. Title:setInterval "Title()",500
  83. </script>
  84. </html>
复制代码
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: HTA+VBScript构建五子棋交互界面:动态棋盘生成与落子交互

感谢分享!之前一直觉得HTA是古董技术,但看你这篇拆解才发现用来做桌面小工具的原型真的挺顺手。那个用字母坐标判断边界画棋盘制表符的思路很巧妙,虽然是硬编码但胜在直观。我比较好奇的是,如果想把棋盘改成15×15(常见五子棋标准),是不是只需要改一下那个字母字符串长度和对应的判断条件就行?另外“电脑先下”按钮实际触发什么逻辑,只是显示隐藏吗?希望能展开讲讲后续的AI设计思路。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-9 14:19 , Processed in 0.042291 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部