基于C++的围棋定式管理系统

来源 :跨世纪 | 被引量 : 0次 | 上传用户:stbruce
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘要】 围棋有五种基本定式,将围棋定式与计算机技术结合以后,查询定式、学习定式将不再是麻烦事。文章介绍了基于C++技术的围棋定式管理系统制作原理并详细说明了制作该系统所用到的基本算法。
  【关键词】 围棋定式;二叉树;前序遍历
  【中图分类号】 G891.3
  【文献标识码】 B
  【文章编号】 1005-1074(2008)08-0058-02
  
  围棋定式就是在围棋活动中长久以来逐渐形成的各种进攻或防守的模式。围棋的基本定式有五种:小目定式、目外定式、高目定式、星定式、三三定式。采用面向对象方法编写围棋定式管理系统是很有实用性的,初学者学习围棋时辅以该系统学习一系列的定式、布局和攻防,不断地进行对战,在实战中增加对定式、布局的理解,强化攻防转换的能力,从而使自己的围棋水平更上一层楼。
  
  1 围棋棋子的显示
  
  每一个围棋定式都是由一个个的下棋步骤组成的,每一个下棋步骤在棋盘中显示。那么我们就应该先研究如何将棋盘以及棋子在计算机中显示出来。围棋棋盘的形状为正方形或略呈长方形的平面图,现在的棋盘为平面上画横竖各19条平行线,构成361个交叉点。棋盘上可分为9个部分,分别称为:左上角、左下角、右上角、右下角、上边、下边、左边、右边和中腹。棋盘上共有九个黑点称作“星”,棋心的黑点称作“天元”。[1]
  绘制可以利用C++ Builder强大的图形编程功能进行绘制。绘制围棋棋盘时要用到的组件有TImage,其中用到TCanvas对象。绘制棋盘时只要通过循环就可以画出横竖各十九条平行线的棋盘。
  还应该考虑的一个问题是如何在用户点击棋盘时在点击处显示出一个棋子。棋子分为白色与黑色两种,利用TCanvas的画图功能同样可以画出棋子。棋盘的范围有限,绘制棋子时应该先判断点击的位置是否在棋盘的范围内,若在棋盘范围内则调用画图函数画出棋子;若超出棋盘范围,则不显示。[4]
  
  2 主要算法分析
  
  2.1 建立二叉树实现定式的存储
  


  上图是三三定式的一部分结构图。白1尖冲三三,是对三三的一种对策.利用三三位置偏低尽量的压扁它是一种取势的下法。黑方走后,轮到白方走。那么我们把黑方在棋盘上的坐标位置当作树的根,那么根据三三定式,白方有可能走的位置就是A、B、C、D、E。1长,也是出头的要点。如果在A位挡,就会被黑毫不犹豫的在1位扳。被黑扳起来的话,黑的出路宽阔,根据地也有了。倒是白的头被捂着,前面和左面和下面的出路都没有了,只有右边的出路还没有根据地,这样的棋很被动,很容易遭杀。所以,白1长必然,当然也有在C位跳的棋.长更坚实有利瞄着B位的拐头封锁和A位的挡。[1]
  这相当于树的父节点为1,1的孩子节点为A、B、C、D、E。将围棋中任何一个定式按步骤展开,我们会发现定式中每一步都是有序的,且每一步需要保存的信息为该步在棋盘中的坐标位置,整个定式展开与数据结构中树的遍历很相似。
  将一种定式在围棋棋盘上记录下来相当于建立一棵二叉树。将树用孩子兄弟表示法进行存储,有利于对各种操作的实现。一个二叉树的结点至少保存三种信息:数据元素、左孩子位置、右孩子位置,对应地,链式存储二叉树的结点至少包含三个域:数据域、左、右指针域。
  我们用如下结构体来记录棋子的信息。
  typedef struct btnode
  {float x1,y1;
  AnsiString jieshou,dir;
  AnsiString colour;
  struct btnode *lchild,*rchild;
  }bitnode,*bitree;
  其中x1,y1为围棋棋子在棋盘中的坐标,jieshou为围棋定式中每一步的解说,dir为建立孩子兄弟表示法时每一个节点的方向,若为l,则为左孩子;若为r,则为右孩子,孩子兄弟表示法中,左为左孩子,右为右兄弟;colour记录的是棋子的颜色。
  利用二叉树前序遍历的结果可以非常方便地生成给定的二叉树,具体做法是:将第一个输入的结点作为二叉树的根结点,后继输入的结点序列是二叉树左子树前序遍历的结果,由它们生成二叉树的左子树;再接下来输入的结点序列为二叉树右子树前序遍历的结果,应该由它们生成二叉树的右子树;而由二叉树左子树前序遍历的结果生成二叉树的左子树和由二叉树右子树前序遍历的结果生成二叉树的右子树的过程均与由整棵二叉树的前序遍历结果生成该二叉树的过程完全相同,只是所处理的对象范围不同,于是完全可以使用递归方式加以实现。[5]
  建立二叉树可以采用递归或者非递归的方法,在该程序中采用递归的方法,函数名为ins_node,函数的主要代码分析如下:[2]
  ins_node(bitree s,bitree t,String dir) //s、t为二叉树节点类型变量
  {AnsiString aa=IntToStr(j)+"-("+FloatToStr(s->x1)+","+FloatToStr(s->y1)+")是否为左孩";
  //aa为字符串类型变量
  if(t==NULL)//判断节点是否为空
  { t=s; //为空则插入
  if(Table1->TableName!=NULL) //表格名称是否为空
  {String command="insertinto"+Table1->TableName+"values('"+FloatToStr(s->x1)+"','"+FloatToStr(s->y1)+"','"+t->jieshou+"','"+_dir+"')";
  //将坐标值等存入数据库的表中
  Query1->SQL->Text=command;
  Query1->ExecSQL( );
  } elseShowMessage("没有建立该表!");
  }
  else if(MessageDlg(aa ,mtInformation, TMsgDlgButtons() << mbYes<  //是否为左孩子
  { _dir=_dir+"l";
  t->lchild=ins_node(s,t->lchild,_dir);
  //递归建立左子树
  }
  else
  {_dir=_dir+"r";
  t->rchild=ins_node(s,t->rchild,_dir);
  //递归建立右子树
  }
  return t;
  }
  2.2 遍历二叉树实现定式的输出
  建立在存储结构为树形结构的基础上,对围棋中每一个定式的显示就相当于对所存储的二叉树进行遍历。由于二叉树是一种非线性结构,每个结点可能有一个以上的直接后继,因此,必须规定遍历的规则,并按此规则遍历二叉树,最后得到二叉树所有结点的一个线性序列。
  二叉树的遍历有三种方法:前序遍历、中序遍历、后序遍历。由于每一个定式的特点,我们可以采用前序遍历的方法实现对围棋定式的显示。
  _preorder( )函数的功能是通过递归调用对已经建立的二叉树进行右子树遍历。参数root为二叉树的根节点,biaoji是一个标记值,整形变量,返回值为空。
  递归算法是遍历二叉树常采用的算法,用递归写的二叉树遍历程序简洁且通俗易懂。_preorder( )函数先判断当前结点是否为空,若不为空,则设置要显示的画布颜色以及字体颜色,并输出标记符号,递归遍历该结点的右子树;若为空则退出。[3]
  该函数的流程图见图1。
  _preorder(bitree root,int biaoji) //root为二叉树的根节点
  {
  int k=0;
  if(root!=NULL)
  {Image1->Canvas->TextOutA(root->x1,root->y1,IntToStr(biaoji));
  //根據遍历树的值在画布上显示标记符号,即指明下一步该走哪一个位置
  biaoji++;
  _preorder(root->rchild,biaoji);
  //遍历右兄弟节点
  }
  }
  


  本文将数据结构中树的算法应用于围棋定式管理系统,详尽论述了开发围棋定式管理系统各部分主要程序算法的具体思路和方法。应用该系统可以随时进入研究模式自己再琢磨新的走法,研究时进退自如,免除在传统棋盘上反复移挪棋子之苦。围棋是检验人工智能发展水平的良好环境,如何提高围棋程序的棋力是人工智能领域的一大难题。同时,开发出与人类棋手水平相当的围棋程序也有助于对人类认知能力的理解,计算机围棋研究具有重要的理论意义和实用价值。
  
  3 参考文献
  
  1 西 丁.围棋基本定式100例[M].四川:署蓉棋艺出版社,1999
  2 肖正南.C++ Builder 6编程实用指南[M].湖北:华中科技大学出版社,2004
  3 严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,1997
其他文献
【摘要】语文教学中,必须依据科学的方法,提高的不仅是语言本身的能力,而应将文化素养、道德情操的熏陶,观察认识事物能力,思维品质的培养,融入其中,对学生进行长时间地扎实有效训练,才能使他们形成和奠定起坚实的语文功力以及可供将来终生学习发展的语文基础。  【关键词】巧设练习;教材;课练;网络资源  【中图分类号】G623.2【文献标识码】B【文章编号】1005-1074(2008)07-0204-01
期刊
【摘要】初中文科综合性课程《历史与社会》新课改教材的一大亮点就是在每个单元后面均编排了不同主题的综合探究课。为充分挖掘综合探究课的独特魅力,让探究活动真正有序地动起来,教学中笔者尝试利用春假或秋假时间,每学期选取某个单元的综合探究课为主题,引导学生自组实践小组,开展一次探究性社会实践活动。本文主要以“QQ对中学生的影响”这一探究活动为例,阐述“4R模式”对于初中开展探究性学习活动,是一种集理论和操
期刊
【摘要】20世纪90年代的上海掀起一场怀旧热潮,小说《长恨歌》在此时问世,把怀旧作为文本内容,以主人公怀旧的失败来否定遗留在新时期的旧上海的生存方式,并对当下的怀旧热进行了反思,展现了作品独特的怀旧意境。  【关键词】怀旧;上海  【中图分类号】I106.4【文献标识码】B【文章编号】1005-1074(2008)07-0224-02    提起旧上海,人们不禁会想到纸醉金迷的百乐门,琳琅满目的百
期刊
作者简介:王勇(1983~),甘肃天水人,西北师范大学美术学院研究生。    【摘要】任何时代,艺术的发展都会遇到各种各样的限制,物质的、精神的,等等。我们这个时代在物质方面的限制,对艺术家个人来说可能是越来越少了,我们很少有艺术家过着杜甫那种饥寒的生活。我们这个时代最大的精神限制是艺术家在精神上被浮华繁荣的物质生活俘获,他们无批判地接受了这种物质层面的繁荣和浮华。  【关键词】艺术概论;思考;批
期刊
目的:探讨细胞色素P450表氧化酶2J3(CYP2J3)/环氧二十碳三烯酸(EETs)-过氧化物酶体增殖物激活受体(PPARs)在糖尿病心肌肥厚中的作用,并观察柚皮素(NAR)的作用及其可能机制。方法:小鼠高糖高脂喂养4 w后,链脲佐菌素(STZ)40 mg/kg/d连续5 d i.p.,7 d后空腹血糖值(FBG)超过11.1 mmol/L,视为糖尿病模型建立成功;继续喂养4 w,检测小鼠心肌肥
【摘要】分析了温度对pH测定的影响,提出了解决方法。  【关键词】pH值;温度;仪器;玻璃电极  【中图分类号】X328【文献标识码】B【文章编号】1005-1074(2008)07-0258-02    pH值是环境监测部门常用的和最重要的检测项目之一。目前我国测量pH值的标准方法是玻璃电极法,由于该法测试过程简单、方便,且现在实验室里都有空调,室温变化小,对pH值测定的影响也较小,所以很多分析
期刊
背景:小檗碱是一种喹啉类生物碱,研究报道其可通过核受体调控转运体的表达。他汀类药物与小檗碱联合运用可增强降脂作用,减少他汀类药物的用量,降低他汀类不良反应的风险。有研究表明,他汀类主要通过OATPs转运进入肝脏从而发挥降血脂作用,且OATPs的表达受核受体调控。那么小檗碱是否可通过介导核受体来调控OATPs的表达,从而影响他汀类药物的摄取,有待进一步研究。目的:本研究旨在探讨小檗碱与他汀类药物联合
目的:
  本课题拟构建携带Ad-HA-PPARγ、Ad-Myc-SUMO1和Ad-Flag-PIAS1目的基因的腺病毒,感染至正常SD大鼠体内,探究PPARγ的过SUMO化是否能够模拟高糖和高脂饮食(HFD)诱导内皮产生胰岛素抵抗(IR),并探讨其潜在的机制。
  方法:
  实验分组:实验分为四组:正常对照组(Ctrl)、阴性对照组(Vehicle)、腺病毒共感染组(Ad)、高糖高脂组(HG/HF)。从南昌大学医学院购买了24只体重为80-100g的雄性斯普拉格-道利大鼠(SD)。在
目的:
  考察柴胡醋制后成分及药效差异,为阐释柴胡醋制所致的功效-成分变化奠定基础。
  方法:
  1.醋柴胡活性部位的化学成分研究:生、醋柴胡使用70%乙醇提取后,经过石油醚、乙酸乙酯萃取,得到石油醚部位、乙酸乙酯部位和水部位,将水部位通过AB-8大孔树脂,用水、20%、50%、75%、95%乙醇分别进行洗脱,得到四个部位。采用ESI-Orbitrap-MS分析技术对生醋柴胡中的四个部位分别进行定性分析,靶标差异性成分,针对差异性成分有目的地进行分离得到单体化合物。通过ESI-Or
目的:丹参饮记载于《时方歌括》,整方由丹参、檀香、砂仁构成,具有活血祛瘀,行气止痛之功效,主要用于治疗血瘀气滞证。现代常用本方治疗慢性胃炎、胃及十二指肠溃疡以及冠心病、心绞痛等,辨证属气滞血瘀者。经观察,该方对气滞血瘀型冠心病患者有着显著的治疗效果。本研究在课题组前期提取工艺研究的基础上,运用现代制剂技术对处方药材的提取物进行制剂成型工艺研究,以期建立可行、稳定的制剂方法,并通过制定合理、可行的质