【VB6】如何用纯VB代码写个五子棋程序?(一)
(本文适合VB初学者)
打开VB——新建标准EXE项目
完成这些最基本的之后点确定
我是打算写一个双人五子棋软件
所以界面程序需要全屏/自由大小
在这里我先做一个可接受大小的窗体
这样就可以安排布局了
改个名字显得更专业一点
VB里面承载绘图的控件主要有窗体和picturebox
它们两个可以用line函数画直线/方块,Circle函数画圆
对于一个五子棋软件已经够用了
而我们一般不选用窗体作为画板是因为窗体会被其它控件遮挡,且灵活性低。
所以这里最佳用作棋盘的控件是picturebox
这里我们修改一下棋盘的大小成正方形,顺便修改一下棋盘控件的名字
在我所想的双人五子棋软件中,要实现非死控制形式的黑白棋落子交替,因此需要实现一个类似棋盒的需求,程序通过判断上次触碰的棋盒颜色来判断落子颜色
简单来说就是需要两个棋盒
棋盒需要有哪些功能呢?
1、要有能力让使用者区分黑白两类棋子
2、要可以接受点击事件
3、要可以改变位置
能实现这些功能的控件蛮多的,例如按钮控件(commandButton)、picturebox、label、text……
这里我们选取picturebox,因为这个控件可以加载图片
也就说我们可以从网上下载棋盒的图片并用它表现出来
同理,它也可以表现棋盘的图片
但是这里我们就都暂时不找了
为了开发速度
但是我们如果有需求,就可以立马鸟枪换炮。这就是编程中一个很重要的远见意识
可以看到,我将其命名为了棋盒
但是细心的同学可能发现
棋盒后面为啥多了个"(0)"?
这是因为这两个棋盒本质上是一类东西
也就意味着它们很多方法是共通的
那不如干脆把它们当成一个控件的两个分身来看待
index属性是将控件当做一个数组来看待
很多同学可能还不知道数组是啥
VB里面数组的声明是:
dim a(10)
使用数组前必须申明,否则会编译错误
dim a(10)
这样定义之后
相当于同时定义了如下变量:
a(0)
a(1)
...
a(10)
双击棋盒控件,在代码编辑界面可看到棋盒的点击事件后面包含了一个叫index的参数
棋盒的鼠标移动事件也包含index参数
index参数是啥?
聪明的同学应该联想到了什么……没错,它就是控件Index属性的数字,及该控件在数组中的编号
也就是说,我可以写一个事件的处理方法,就可以处理所有具有相同性质的控件操作
而区分这些控件的关键就是index参数
这里,黑棋盒Index=0,白棋盒index=1.这是因为数组默认从0起算
界面弄得差不多了,接下来就是逻辑部分了
五子棋五子棋,肯定要有棋盘才能下棋对吧
所以第一件事就是绘制一个棋盘出来
那我们什么时候需要绘制棋盘呢?
下一局棋的时候就需要对吧
所以程序一打开就应当有一个绘制好的棋盘了
因此我们在程序启动事件内写绘制棋盘的代码逻辑
双击窗体空白处
我们将获得程序的窗体创建事件
这个事件内写的代码将在窗体加载时执行
绘制棋盘,我能想到的算法如下:
1、直线与直线相交
2、一个个方块相叠
3、用图片
这里我们选取算法1,因为最简单,只需要画15+15根线就可以绘制好五子棋棋盘了
而方块需要绘制15*15个
图片的话网上没有合适的(我反正是信了)
在画画之前还有一个重要工作,就是建立直角坐标系
为啥不建立(0,0)-(14,14)这刚好15+15根线啊
因为上下左右各空一点出来可以使棋盘更美观的同时,有地方后面让程序显示棋盘的坐标
坐标系建立了接下来就要画线了
这里我们使用for结构来构建15+15线的绘制
这样我们需要的棋盘应该就会在程序运行时画好了
F5运行程序,咦为什么图像没有出现呢?
(运行前我已经把棋盘背景色修改成屎黄色了)
这是因为autoredraw属性为false的缘故
所有带有绘制函数的控件基本上都带有这个属性
它的作用简单来说就是保持绘制内容,不让它消失。
所以这里我们要设置成true
再次运行程序
嗯,一个棋盘就画好了
是不是很简单- -
接下来就是完成落子的功能了
棋子有哪些属性?颜色、大小、位置
颜色无非黑白,大小肯定是比一格略小,就直径0.8吧
位置的话肯定是由鼠标点击的棋盘位置来确定的
click事件只能感知是否点击控件而无法告诉我们点击位置
因此我们放弃它,而选用mousedown(鼠标点击)事件
接下来我们就在我们点击的位置生成一颗黑棋好了
运行程序点击棋盘任意位置
获得了一个空心黑圆
那如何画出一个实心圆呢?别急,控件有专门的属性来控制
再画个圆就ok了
回到我们的需求
根据我们选择的棋盒颜色来判断落子的颜色对吧
所以我们要用一个变量来储存我们现在到底是选择的哪个棋盒
还记得棋盒的本质区别吗?
index属性!
首先,我们申明一个窗体级变量来存颜色。颜色的本质聪明的同学通过rgb函数的本质应该想到是数值了
可以看到,棋盒的click事件我也准备好了,万事具备只差东风:触发点击棋盒事件时将被点击的棋盒的标识记忆下来
记忆下来之后,我们只需要在落子前做一个棋盒判断选择相应落子色的逻辑,就可以实现我们根据点击的棋盒来确定落子颜色的需求了
这里有一点比较妙的是
我们把棋盒的颜色设置成了黑白两色,那我们可以直接用我们记下的棋盒标识直接把棋盒的颜色取给落子呀!
这样就不要做判断逻辑了!
我先写一个用判断逻辑来做的实现:
效果如下:
第二种逻辑:
可以看到,语句更简洁高效
而且本质上根据棋盒颜色决定棋子颜色的性质也更适合扩展:例如粉色的棋盒就可以下出粉色的棋子
第二种逻辑的表现也是满足需求的
现在我们的软件已经满足了可以展现一场对局的棋子布局了
那我要悔棋怎么办啊?
那我要再开一局怎么办啊?
我要棋子落得更整齐应该怎么办啊?
我想让程序告诉我哪方胜利该怎么办啊?
我想双方交换棋盒颜色该怎么办啊?
且看下回分解