【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事件我也准备好了,万事具备只差东风:触发点击棋盒事件时将被点击的棋盒的标识记忆下来
记忆下来之后,我们只需要在落子前做一个棋盒判断选择相应落子色的逻辑,就可以实现我们根据点击的棋盒来确定落子颜色的需求了
这里有一点比较妙的是
我们把棋盒的颜色设置成了黑白两色,那我们可以直接用我们记下的棋盒标识直接把棋盒的颜色取给落子呀!
这样就不要做判断逻辑了!
我先写一个用判断逻辑来做的实现:
效果如下:
第二种逻辑:
可以看到,语句更简洁高效
而且本质上根据棋盒颜色决定棋子颜色的性质也更适合扩展:例如粉色的棋盒就可以下出粉色的棋子
第二种逻辑的表现也是满足需求的
现在我们的软件已经满足了可以展现一场对局的棋子布局了
那我要悔棋怎么办啊?
那我要再开一局怎么办啊?
我要棋子落得更整齐应该怎么办啊?
我想让程序告诉我哪方胜利该怎么办啊?
我想双方交换棋盒颜色该怎么办啊?
且看下回分解
【VB6】如何用纯VB代码写个五子棋程序?(一)相关推荐
- 【VB6】如何用纯VB代码写个五子棋程序?(二)
由于后面的过程中,哈里也是遇到了一些坑,因此完全按照当时开发时候的逻辑,可能篇幅太长.因此就直接把最后选择的算法做介绍吧. 上回书说道: ·那我要悔棋怎么办啊? ·那我要再开一局怎么办啊? ·我要棋子 ...
- 纯VB代码取得硬盘的物理序列号
纯VB代码取得硬盘的物理序列号 网上有很多获取硬盘序列号的代码,但大部分都只能取得逻辑分区的序列号,而不能取得硬盘的物理序列号.我们知道,逻辑分区的序列号是FORMAT时产生的,重新FORMA ...
- 真香!如何用300行代码写完一个Spring基本框架?
Spring是一个非侵入性(non-invasive)框架,其目标是使应用程序代码对框架的依赖最小化,应用代码可以在没有Spring或者其他容器的情况下运行. 看spring的源码,学习spring, ...
- 如何用纯前端去写购物车_索尼商城购物车
这里以Sony商城的购物车为例,购物车用纯前端的技术来写的,并且是存在了localstorage里,由于没有存在数据库里,购物车的操作基本是在前端页面操作的! 用jquery写的javascript, ...
- 如何用76行代码写一个AI微信机器人......
本期博客主要介绍如何使用 微信SDK 和 AI聊天接口 ,实现 微信机器人功能. 准备 电脑需要安装Go环境,这个可以直接参考菜鸟教程:Go 语言环境安装,知道CSDN的同学基本能在半小时内装好吧- ...
- 教你如何用纯CSS代码实现垂直居中
目录 方法1:设定行高 ( line-height ) 方法2:绝对定位 方法3:利用 transform 方法4:使用表格或假装表格 方法5:使用 Flexbox 十种水平垂直居中方案 : 在编辑一 ...
- 公司员工信息纯HTML代码写表格table
代码如下: border 为边框的厚度为1px(像素) rules 为合并相邻之间表格的边框 cellpadding:代表单元格边框到内容之间的距离(留白) cellspacing:用来指定表格各单 ...
- 纯CSS代码写出各种不规则的形状图形
做网页设计时经常要用到各种形状的图形,对于规则的图形很简单,但是对于不规则的图形,一般我们都是用图片来切图实现.不过今天新起点博客给大家分享几十种看似简单却又非常强大的纯CSS绘制的图形,里面有最简单 ...
- 纯css3代码写下拉菜单效果
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- 编写高质量的VB代码
简介: 本文描述了如何通过一些技术手段来提高VB代码的执行效率.这些手段可以分为两个大的部分:编码技术和编译优化技术.在编码技术中介绍了如何通过使用高效的数据类型.减少外部引用等编程手段来提高代码执行 ...
最新文章
- 视频目标检测--Flow-Guided Feature Aggregation for Video Object Detection
- mac 搭建python+selenium+chromedriver环境
- matlab 函数 向量参数,Scipy integrate(quad,quadration,nquad)不能集成向量参数化函数?等效函数(MATLAB works)...
- python pip升级 指向不同python版本
- bat贪吃蛇游戏代码_C语言写个贪吃蛇游戏
- c++ vector 实战(基本使用)
- VS如何更改项目类型?
- Allegro转Altium(brd2alg)
- http://www.shengshiyouxi.com
- 无论发生了什么生活_无论如何,一个开放团队的经理会做什么?
- Sass-学习笔记【进阶篇】
- ssis 抽取mysql 实验_SSIS探索之SSIS增量抽取数据
- java 集合底层_java集合底层实现总结
- 机器学习(2): K-means (k均值) 聚类算法 小结
- AtCoder Beginner Contest 178 C
- 【线段树】超市促销 rqnoj572
- Windows删除文件夹提示“文件夹被某一程序占用”,删除失败
- OJ sdust Java记录
- 用C语言实现打开一个网页
- 人工智能的应用实例介绍,人工智能有哪些应用领域?