六子棋培训讲义.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
六子棋培训讲义 1. 规则简介 规则与五子棋非常相似,除了第一次黑方下一颗子外,之后黑白双方轮流每次各下两子, 先连成六子者获胜。 2. 程序架构 六子棋博弈程序和一般的博弈程序一样,一般包括一下几部分: 2.1. 棋盘表示 棋盘表示主要探讨的是使用什么数据结构来表示棋盘上的信息。一般说来,这与具体的 棋类知识密切相关。通常,用来描述棋盘及其上棋子信息的是一个二维数组。例如,对于六 子棋,我们可以用一个二维数组 ChessBoard[19][19]来表示棋盘,定义黑棋为 0;白棋为 1, 空为 0xFF。 const int Black=0,White=1,Empty=255; int ChessBoard[19][19]; 2.2. 棋型识别 以 19*19 的二位整型数组作为输入,通过对棋盘 4 个维度(水平,竖直,左倾 45°, 右倾 45°)的扫描,统计处各种棋形的数量。 棋型一般包括: ? 六连(Continuous six):+OOOOOO+,在棋盘的纵向、横向或斜向的任意一条线上, 形成的 6 颗同色棋子相连。 ? 长连(Continuous long):+OOOOOOO+,在棋盘的纵向、横向或斜向的任意一条线 上,形成的 7 颗或 7 颗以上同色棋子相连。 六连或长连是六字获胜的必要条件。 ? 活五(Active five):+OOOOO+,在同一直线上的 5 颗同色棋子,符合“对方必须 用两手棋才能挡住”的条件。挡住是指不让另一方形成六连或长连。 ? 眠五(Sleep five):XOOOOO+,在同一直线上的 5 颗同色棋子,符合“对方用一手 棋就能挡住”的条件。 ? 活四(Active four):++OOOO++,在同一直线上的 4 颗同色棋子,符合“对方必须 用两手棋才能挡住”的条件。 ? 眠四(Sleep four):XOOOO++,在同一直线上的 4 颗同色棋子,符合“对方用一手 棋就能挡住”的条件。 ? 活三(Active three):+++OOO+++,在同一直线上的 3 颗同色棋子,符合“再下一 手棋就能活四”的条件。 ? 朦胧三(Indistinct three):X++O+OO+X,在同一直线上的 3 颗同色棋子,符合“再 下一手棋只能形成眠四,但如果再下两手棋的话就能形成活五”的条件。 ? 眠三(Sleep three):XOOO+++,在同一直线上的 3 颗同色棋子,符合“再下两手 棋也只能形成眠五”的条件。 ? 活二(Active two):++++OO++++,在同一直线上的 2 颗同色棋子,符合“再下两 手棋就能形成活四”的条件。 ? 眠二(Sleep two):XOO++++,在同一直线上的 2 颗同色棋子,符合“再下两手棋 只能形成眠四”的条件。 2.2.1. 简单棋型识别算法简述 1. 从左到右从上到下扫描找出第一个非空点。 2. 以此点为中心分别在水平、垂直、左斜、右斜四个方向扫描棋型。 3. 将以参与扫描的点标记为“已分析”。 4. 读取下一个非空点,如果该点未被分析,则转 1,否则转 4,直至所有的点都已被 分析。 2.2.2. 横向扫描 1. 从左到右从上到下扫描找出第一个点。 2. 以此点为中心分别向左右两个方向扩展,得到棋型的“相连边界”和“落子范围”, 如图所示。 3. 计算中心相连部分的长度。 4. 根据中心相连的长度判断棋型,并将以参与扫描的点标记为“已分析”。 2.2.3. 其他方向扫描 我们可以将垂直、左斜、右斜方向的棋型扫描转换为水平方向的棋型扫描。以从左上到 右下方向扫描为例 1. 新建一个一维数组 int tempLine[19]。 2. 找出待扫描点所在左 45 度斜线的起始位置 //(y,x)为一行的起点 if (i < j) { y = 0; x = j - i; } else { x = 0; y = i - j; } 3. 将该条斜线上的点复制到临时数组 tempLine 中 for ( k = 0; k < GRID_NUM; k++) { //防止越界 if (x + k >= GRID_NUM || y + k >= GRID_NUM) break; tempLine[k] = chessBoard[y+k][x+k]; } 4. 按照水平扫描棋型的方法分析该临时数组 5. 标记扫描过的点 2.3. 评估系统 根据棋型识别所得的结果对当前棋局进行评估,得到当前棋型的估值。一般来讲估值越 大,局势对己方越有利。 2.3.1. 静态原始棋子位置得分 也就是位置得固有得分。其分值分布为:天元点分值最大,沿其四周分数依次递减,棋 盘四周分值最低。以 19*19 棋盘为例,我们可以建立静态棋子价值表。 int PosValue[19][

文档评论(0)

wx171113 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档