由于后面的过程中,哈里也是遇到了一些坑,因此完全按照当时开发时候的逻辑,可能篇幅太长。因此就直接把最后选择的算法做介绍吧。

上回书说道:

·那我要悔棋怎么办啊?

·那我要再开一局怎么办啊?

·我要棋子落得更整齐应该怎么办啊?

·我想让程序告诉我哪方胜利该怎么办啊?

·我想双方交换棋盒颜色该怎么办啊?

就拿悔棋来说吧,我们自然五子棋最重要的核心,与别的五子棋最大的不同就是模仿真实的下棋过程。因此,每个棋子,我们可以拖动它们到新的位置上去或者放回棋盒重新选位置落子这两种自然的悔棋方式。

那如何才能够移动棋子或者将棋子返回棋盒呢?传统的做法是记录每棋子落的每一步,然后撤销最后一步就是悔棋了。

而我们这里,将每一颗棋子当作一个对象来看待。

什么是对象?对象通俗的说就是一个由许多属性共同描述的物体。比如棋子,它的属性有颜色、大小、位置(二维平面中是横坐标x,与纵坐标y共同确定的)。

VB里面怎么快速而简单的建立一个对象呢?

type 类型名属性A属性B...(依此类推)
end type

大家可以想象,如果棋子是一个对象的话,我们改变棋子的位置属性,那么是不是它在棋盘上的位置就实际改变了呢。

好,接下来就是哈里编写的棋子的属性(这个声明哈里是放在Module(模块)里面的,如果放窗体里,需要把public改成private):

这里我们没有设置棋子的大小了,因为棋子都是一样大,到时候我们设置一个常量来表示就可以了。哈里设置的属性中,因为棋子的位置是棋盘上的任意位置,因此越精确的记录棋子的位置就是我们的需求,因此表示横坐标x和纵坐标y的变量我都声明为单精度小数,这样比long(长整型)或integer(整型)表示得更精确。c是颜色,因为棋盘上只有黑白两种颜色,因此甚至boolean(布尔型)都能表示,这里用integer的原因是因为,第一章里面我们已经说了,用棋盒的颜色来表示棋子的颜色,这里的c其实是存放的棋盒的index值。棋盒(c).backcolor就可以获得棋子的颜色了。

棋子有了,棋局我们怎么表示呢?

哈里用的是一个动态数组来表示的,每下一颗棋子,数组就生成一个新元素来表示新棋子。声明如下:

棋子在什么时候最终生成呢?当然是我们落子的时候。

于是落子时候的过程应当是这样的:

棋局数组的初始化(redim 棋局(0))哈里是放在每一局棋开始的时候的。如果不初始化就直接执行 ubound() 函数(获得数组大限),是会报错的。这个过程是放在棋盘的MouseDown事件(鼠标按键点下事件)中的。

这里我们会遇到一个问题,就是如果鼠标落下的位置已经有棋子了,如果没有检测机制,我们下的棋子就有可能重叠在一起,因此这里我们还要想办法让棋子间不相容。而且,在这里我们还需要注意的一点是:明确性。什么是明确性呢?就是在棋盘上任意竖线和横线交叉的地方,有且只能有一颗棋子。为什么要这样呢?因为这样才能方便程序判断胜负和后面的让棋子自动变得更整齐的时候不至于两颗棋子重叠在一起。

一个比较通用的检测棋盘上某点(x,y)上是否有棋子的函数如下:

这里的0.4是我们棋子的半径。因为我们棋盘每一小格的边长是1,因此棋子半径0.4的话,两颗棋子之间会有0.2的间隙,不会给人太密集的感觉。

这个函数的作用并不是完全为检测落点是否有棋子准备的,它的作用其实是假如我要拖动一颗棋子的时候,判断我手指摁在棋盘上的位置有没有棋子准备的。

好哒,这里引入了一个“摁住的棋子”这个概念。

为什么这里要用long呢?因为vb里面数组的最多元素数量就是long的长度,用long就可以索引整个数组了,其实这里用integer甚至byte也是可以的,因为一局棋最多落15*15=225颗棋子。也就是说棋局数组的大限理论上不会超过225。

接下来才是我们判断棋子是否重叠的算法(函数):

这里可能会有比较初学的朋友看不太明白,其实这个算法已经暴露了我们如何将棋子整齐化的方法了。

int()函数是VB内置的一个函数,作用是将一个小数去掉小数点部分变成整数。

试问:(小数+0.5)取整,不就是四舍五入吗?

一个棋子的位置,四舍五入之后,不就正好在棋盘横竖交叉的地方吗?不就整齐化了吗?

同理,如果把要下的这颗棋子化整后,比对整个棋局里所有棋子化整后的位置,如果没有一样的,是不是就说明当前落点没有棋子了呢。

好的,第二章暂时到这里吧~

【VB6】如何用纯VB代码写个五子棋程序?(二)相关推荐

  1. 纯VB代码取得硬盘的物理序列号

    纯VB代码取得硬盘的物理序列号     网上有很多获取硬盘序列号的代码,但大部分都只能取得逻辑分区的序列号,而不能取得硬盘的物理序列号.我们知道,逻辑分区的序列号是FORMAT时产生的,重新FORMA ...

  2. 真香!如何用300行代码写完一个Spring基本框架?

    Spring是一个非侵入性(non-invasive)框架,其目标是使应用程序代码对框架的依赖最小化,应用代码可以在没有Spring或者其他容器的情况下运行. 看spring的源码,学习spring, ...

  3. 如何用纯前端去写购物车_索尼商城购物车

    这里以Sony商城的购物车为例,购物车用纯前端的技术来写的,并且是存在了localstorage里,由于没有存在数据库里,购物车的操作基本是在前端页面操作的! 用jquery写的javascript, ...

  4. 如何用76行代码写一个AI微信机器人......

    本期博客主要介绍如何使用 微信SDK 和 AI聊天接口 ,实现 微信机器人功能. 准备 电脑需要安装Go环境,这个可以直接参考菜鸟教程:Go 语言环境安装,知道CSDN的同学基本能在半小时内装好吧- ...

  5. 教你如何用纯CSS代码实现垂直居中

    目录 方法1:设定行高 ( line-height ) 方法2:绝对定位 方法3:利用 transform 方法4:使用表格或假装表格 方法5:使用 Flexbox 十种水平垂直居中方案 : 在编辑一 ...

  6. 公司员工信息纯HTML代码写表格table

     代码如下: border 为边框的厚度为1px(像素) rules 为合并相邻之间表格的边框 cellpadding:代表单元格边框到内容之间的距离(留白) cellspacing:用来指定表格各单 ...

  7. 纯CSS代码写出各种不规则的形状图形

    做网页设计时经常要用到各种形状的图形,对于规则的图形很简单,但是对于不规则的图形,一般我们都是用图片来切图实现.不过今天新起点博客给大家分享几十种看似简单却又非常强大的纯CSS绘制的图形,里面有最简单 ...

  8. 纯css3代码写下拉菜单效果

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  9. 1000行代码写小游戏(二)

    玩家属性Table数据格式: local userData = {floor = 1, -- 楼层level = 0, -- 等级curExp = 0, -- 当前经验maxExp = 0, -- 升 ...

最新文章

  1. Java 对象都是在堆上分配内存吗?
  2. Fiori Fundamentals和SAP UI5 Web Components
  3. js中执行到一个if就停止的代码_Node 中如何引入一个模块及其细节
  4. java保留二位小数_java使double保留两位小数的多方法 java保留两位小数
  5. OS操作系统概念简介
  6. Android 系统(81)---Android permission 动态申请、授权
  7. Unity界面插件NGUI核心组件说明
  8. mini web框架-2-显示页面
  9. 钉钉扫码登录第三方_e签宝联合钉钉升级产品功能,共建企业服务生态闭环
  10. bzoj1452 [JSOI2009]Count
  11. 干掉visio,这是一款免费又好用的画图神器
  12. 视频预测算法vid2vid比MCNet好在哪里?
  13. linux mkdir命令用法,常用Linux运维命令 - mkdir命令用法详解
  14. 地图行业应用的难点思考
  15. eBPF-4-perf_map的丢失事件lost_event解读
  16. 1022: [SHOI2008]小约翰的游戏John
  17. 淘宝获取商品详情API接口
  18. 机器学习——朴素贝叶斯分类
  19. CTreeCtrl的HitTest用法
  20. 使用draw.io桌面版代替visio制作流程图

热门文章

  1. cad中tk什么意思_原来CAD里的这些缩写是这个意思!终于搞懂了对象捕捉这个玩意儿...
  2. 华容道(4x4)教学(最难(最后两行))
  3. bash 运行linux命令大全,bash命令
  4. 互联网日报 | iPhone 12系列手机正式发布;盒马入局火锅市场;东风汽车A股IPO申请获受理...
  5. 一线城市房价的理性思考
  6. spi遵循_我今天将遵循样式指南
  7. 概率密度函数的参数估计
  8. 多线程在PyQt5中的应用记录
  9. 如何在mac eclipse引入win版本eclipse的android项目
  10. IDEA完整安装教程