「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
【涉及知识点】
控件数组;2. 顺序文件读写;3. 鼠标事件;4. 定时器控件。
【功能介绍】
围棋棋盘由19条纵线和19条横线正交形成网格,共有19×19=361个网格点。两位棋手各持黑色和白色圆形棋子轮流放到未被棋子占用的网格点上进行对弈。本程序完成一个模拟棋盘,并可向棋盘上放置棋子(落子)、从棋盘上去掉子(提子)。本程序可供两个人对弈。
【功能细分】
运行程序,如图所示的窗口,窗口主体部分是棋盘,棋盘上方的文本框中显示当前棋盘上已有的棋子数,棋盘下方是几个功能按钮。使用鼠标单击网格点,放置一粒黑子;右击网格点放置一粒白子。按住Ctrl键在棋盘上已有的黑子上单击会去掉这粒黑子;按住Ctrl键在棋盘上已有的白子上右击会去掉这粒白子。 单击“撤消最后一步”按钮,自动去掉最后一个放置的棋子,不论黑白且只能撤消一步(继续单击无用)。单击“移除黑子”、“移除白子”按钮分别清除所有的黑子和白子。 无论是落子、提子还是移除棋子,窗口顶部的文本框中总能实时地显示出棋盘上当前的黑子、白子数和总棋子数。 如果在操作时,单击到棋盘外边,程序会将棋子放置到离鼠标最近的边框网格点上。如果落子时所单击的网格点上已有子,或提子时所单击的网格点上没有子,则会显示提示消息框。
如果棋盘上已放满棋子,则显示Game Over消息框。
【具体实现】
棋盘上的线共有38条,可以在设计时使用直线控件“画”好,即在窗体上放置38个直线控件。但是调整、对齐的工作量大,会很繁琐。因此,使用控件数组是个好方法。
1在设计时,向窗体上放置一个直线Line控件,将其名称改为linH,其Index属性设置为0。这时,此控件成为linH控件数组中的第一个控件元素。在窗体的Load事件过程中,按计算好的位置和间距,使用循环语句加载其他18条水平线。纵向网格线可以使用另一个直线控件数组linV,采用相同的方法布置。棋盘网格布置好之后在程序运行过程中是不需要变化的,所以窗体的Load事件过程加载一次即可。
2.实现棋子的功能,肯定要用到控件数组,可用圆形Shape形状控件实现。下棋过程中,棋子是会增减的,数目不定。 在程序刚启动时加载361个控件数组元素,在程序运行过程中通过设置其可见性(VisibIe属性)来显示需要的棋子,颜色可以通过FillColor属性设置。第二种办法是运行过程中动态加载或卸载控件数组元素,显示几个棋子就有几个控件数组元素。
3.因为控件数组只能是一维数组,必须建立每个棋子与网格点的对应关系。如果棋子控件数组为shpChess(0 To 360),则某一具体格子shpChess(n)和棋盘网格点Board(i,j)之间的关系是: n=i+j*19 j=n\19; j=n Mod 19 其中,i是行号,j是列号。 在窗体的UnLoad事件过程中可将Board数组的元素值依次写到文件中,在窗体的Load事件过程,将其读入可恢复棋局。
4.用户操作棋子的功能是通过编写窗体的MouseDown事件实现的。根据事件过程的Shift参数是O还是2,可判断用户是否按下Ctrl键;根据Button参数是1还是2,可判断用户单击的是鼠标的左键还是右键。通过X,Y参数(即鼠标单击位置坐标),可折算出鼠标单击点离哪个棋盘格子(i,j)最近。
核心代码如下:
Private Sub Form_Load()
'窗体加载时,使用直线控件数组生成19*19的围棋盘
Dim i As Integer
Randomize
'生成横线
For i = 1 To 18
Load LinH(i)
Next
For i = 0 To 18
LinH(i).Visible = True
LinH(i).X1 = HDist
LinH(i).Y1 = VDist + Grid * i
LinH(i).Y2 = VDist + Grid * i
LinH(i).X2 = HDist + Grid * 18
Next
'生成竖线
For i = 1 To 18
Load LinV(i)
Next
For i = 0 To 18
LinV(i).Visible = True
LinV(i).Y1 = VDist
LinV(i).X1 = HDist + Grid * i
LinV(i).Y2 = VDist + Grid * 18
LinV(i).X2 = HDist + Grid * i
Next
'生成棋子
For i = 1 To 360
Load shpChess(i)
shpChess(i).FillStyle = 0
shpChess(i).FillColor = vbWhite
Next
For i = 0 To 360
shpChess(i).Top = (i \ 19) * Grid + VDist - 100
shpChess(i).Left = (i Mod 19) * Grid + HDist - 100
shpChess(i).Visible = True
Next
'读取已存的棋局
If Dir("save.txt") <> "" Then
Open "save.txt" For Input As #1
For i = 0 To 360
Input #1, Board(i Mod 19, i \ 19)
Next
Close
End If
Call CountChess
End Sub
有需要拿完整源码的话,请移步到公众号:诗一样的代码。既然进来了,肝文不易。小伙伴点个赞再走呗。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!