“王宫双门棋”游戏编程中相关的技巧探索

来源 :现代教育教学探索杂志 | 被引量 : 0次 | 上传用户:jibbsb12
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘要】本文主要工作是围绕藏棋游戏中较为流行的藏棋之一“王宫双门棋”,论述了“王宫双门棋”游戏编程中对棋盘表示、棋子落点、棋盘坐标选取等方面的技巧探索。
  【关键词】王宫双门棋;棋盘表示;棋子落点
  The related technique investigate in the “palace double door chess” game plait distance
  Hang Ying
  【Abstract】This text is main work is around hide in the chess game more popular of hide a“palace double door chess” of the chess, discuss“palace double door chess” game plait distance in mean to the chessboard, the pawn fall point, the chessboard sit a mark selection etc. of technique investigate.
  【Key words】Palace double door chess;The chessboard mean;The pawn fall a point
  当今,国际象棋、中国象棋、围棋号称世界三大棋种。其中,以中国象棋和围棋为主要代表的这些棋类游戏在中国可以说是源远流长。
  传统藏棋是一种在藏族地区广为流行的传统游戏方式,而以黑白子在纵横交错的棋盘上应对的盘上游戏为多种。其中,“密芒”是藏族棋类游戏中历史最悠久、最具影响的游戏种类,类似围棋下法,故亦称“藏围棋”。除“密芒”之外,藏区还流行着多种藏棋,如:王宫多门棋、六子棋、手鼓棋等。其中,主要流行的藏棋是:王宫多门棋,也称为围王棋。王宫多门棋有分为:王宫独门棋、王宫双门棋和王宫四门棋三种。
  图1 “王宫独门棋”棋盘 图2 “王宫双门棋”棋盘 图3 “王宫四门棋”棋盘
  本文主要研究藏棋中的“王宫双门棋”,因此,归纳“王宫双门棋”的规则具体如下:
  1. 棋盘和棋子 
  1.1 棋盘。
  “王宫双门棋”棋盘由九道横线、五道纵线和六道斜线交叉组成。棋盘上共有37个交叉点,棋子就摆放和活动在这些交叉点上,棋盘两端三角形区域叫做“王宫”。
  1.2 棋子。
  “王宫双门棋”棋子共有二十六个,分为黑、白两种,黑子2个,白子24个。
  2. 走棋和吃子 
  
  2.1 对弈。
  在开局时,2个黑子和8个白子放在棋盘固定的位置上,由黑子先走,双方轮流各走一着,直至分出胜负为止。
  2.2 棋子的走法。
  黑子:黑子不吃子时,每次移动一步,当吃子时必须跳吃。
  白子:待黑子每移动一步,白子落一子,待16个子全部落完后,所有白子开始移动,每次移动一步。
  2.3 吃子。
  黑子吃白子:即黑子与白子相邻时,在这两子所处的直线上白子相邻的位置无子时,黑子可跳过该白子到达无子的空位,则该白子被吃;白子不能吃黑子,只能将黑子围住。
  3. 胜负
  若黑子吃掉7个以上白子,并且有黑子可以移动,则判定黑方胜;若黑子吃掉白子不足7个,且两个黑子都无处可走,则判定白方胜。
  
  3.1 “王宫双门棋”棋盘的表示技巧。
  棋盘表示就是使用一种数据结构来描述棋盘及棋盘上的棋子,以方便计算机处理。一般说来,这与具体的棋类知识密切相关。通常,最典型的方式是使用一个二维字节数组来描述棋盘及棋盘上的棋子信息。例如,中国象棋的棋盘是使用一个 9×10 的二维数组来表示。棋盘的数据表示直接影响到程序的时间及空间复杂度。
  从棋子的角度考虑,如果把棋盘看成是一个平面坐标系,可以知道每一个棋子的位置信息,包含一个横坐标和一个纵坐标。因为在棋盘上最多有26个棋子,所以可以用一个有26个字节的一维数组表示所有26个棋子的位置,其中每个字节的高4位表示该棋子的横坐标,低4位表示该棋子的纵坐标。而已经被吃掉的棋子用坐标范围以外的数表示。这样整个棋盘信息就被装进了这26个字节当中。
  上面介绍的两种棋盘表示方法:一是做一个棋盘数组(每个元素记录棋子的类型);二是做一个棋子数组(每个元素记录棋子的位置)。如果一个程序同时使用这两个数组,那么获得棋子的类型和棋子的位置都可以在常数时间内完成。这就是“棋盘-棋子联系数组”,此数组可以定义为:
   struct PositionStruct { 
   int Squares[90]; //数组下标表示棋盘的位置,数组元素的值记录该位置棋子的类型
  int Pieces[32]; //数组下标表示棋子的类型,数组元素的值记录该位置棋子的位置
  };
  藏棋棋盘与其他博弈类的棋盘不同,大多数成不规则棋盘,如:“王宫双门棋”的棋图除横竖线以外,还有斜线,以及棋图周围会有表示王宫的三角图形构成。
  
  
  对于“王宫双门棋”而言,在其棋盘上有9行5列,棋子分为黑白两种,黑子2个,白子24个,共26个。按照“棋盘-棋子联系数组”的技术原则,可以定义两个数组:Squares[45]和Pieces[26]。在图2“王宫双门棋”棋位编号中,红色位置为无效位置,如果该棋位位置是无效的,则存放-1表示无效的棋位位置。
  
  “王宫双门棋”棋位位置的编号如图2所示,棋位编号是一维的,范围从0号棋位到44号棋位,从上到下,从左到右依次编号。如图2所示,总共45个棋位位置。
  在计算机处理中,位运算比一般的加减乘除及取余运算快很多,如果能在寻找棋子和定位棋子上使用位运算代替加减乘除和取余,这将在很大程度上提高运算速度。基于这种想法,人们把“棋盘-棋子联系数组”进行扩展:把棋盘做成16×16的大小,这样得到行号可以用16除(右移4位),得到列号可以对16取余(和15进行与运算),这比取整取余操作要快得多。
  20世纪60年代末前苏联的KAISSA项目组提出比特棋盘。它用64位数表示一个棋子的位置每个位置用一个比特位表示。使用时先利用数据库技术把棋子在某一位置可以到达的位置用一个比特棋盘保存,求合法走法时只需要先根据具体的局势计算得到不可走的比特棋盘,然后与可走的比特棋盘与运算即可得到合法的走法。
  
  
  图2 “王宫双门棋”棋位编号 图3
  为了借鉴比特棋盘的思想,人们在不断探索中形成了位行位列技术。它以“位”的形式记录棋盘上某一行所有的格子的状态(仅仅指是否有子),就称为“位行”(BitRank),与之对应的是“位列”(BitFile)。
  对于“王宫双门棋”,在其棋盘上有9行5列,那么,棋盘结构应该包含9个位行和5个位列,即:
  struct PositionStruct { 
   …… 
   unsigned short wBitFiles[16]; 
   unsigned short wBitRanks[16]; 
   …… 
  }; 
  值得注意的是,它仅仅是棋盘的附加信息,“棋盘-棋子联系数组”仍旧是必不可少的。 
  “王宫双门棋”中的黑子着法分为吃白子和不吃白子两种,这两种着法生成器原则上是分开的,因此分为黑子不吃白子、黑子吃白子两个部分。不吃白子的着法可以沿着上下、左右和斜线八条射线逐一生成(即并列做8个循环)。我们感兴趣的是吃白子的着法。是否能吃子(暂时不管吃到的是黑子还是对方白子),只取决于它所在的行和列上的每个格子上是否有棋子,而跟棋子的颜色无关,因此这些信息完全反映在位行和位列中。 
   因此,移走或放入一颗棋子时,必须在位行和位列上置位: 
  void AddPiece(int Square, int Piece) { 
   …… 
   x = Square % 16; 
   y = Square / 16; 
   wBitFiles[x]= 1 << (y - 3); 
   wBitRanks[y]= 1 << (x - 3); 
  …… 
  } 
  
  3. 棋盘中棋子的落点问题
  在“王宫双门棋”的棋盘上,有9行5列,共9×5=45个点,棋子的落点编号如图3所示,该编号是一维的,范围从0到44,从上到下,从左到右依次编号,总共45个编号。在这45个点上有8个点是不能落子的,图3中红色的点表示不能落子的8个点,因此,棋盘上有37个点可以落子。
  
  对于黑子而言,满足下列情况的点可以成为落点:
  ① 与该黑子坐标距离绝对值为1的空白点(即:横、纵方向上的相邻点)——黑子在横纵方向上的落子情况;
  ② 与该黑子坐标距离绝对值为 的空白点(即:斜方向上的相邻点)——黑子在斜方向上的落子情况;
  ③ 在与该黑子坐标距离绝对值为1的点上为白子时,与该黑子坐标距离绝对值为2的空白点(即:横、纵方向上的隔点)——黑子在横纵方向上的吃子情况;
  ④ 在与该黑子坐标距离绝对值为 的点上为白子时,与该黑子坐标距离绝对值为2 的空白点(即:斜方向上的隔点)——黑子在斜方向上的吃子情况;
  对于白子而言,满足下列情况的点可以成为落点:
  ①与该白子坐标距离绝对值为1的空白点(即:横、纵方向上的相邻点)——白子在横纵方向上的落子情况;
  ②与该白子坐标距离绝对值为 的空白点(即:斜方向上的相邻点)——白子在斜方向上的落子情况;
   总之,不论是黑子还是白子,只要满足各自的落子条件,就是合理的落点。但要在这些合理的落点中找到最优落点,需要算法支持。
  “王宫双门棋”中,白子不可以吃黑子,只能围住黑子,让其无路可走,从而达到取胜的目的。因此,在棋盘上,黑子所处的位置不同,将其围住所需要的白子的数目也就不同。
  在图4中:
  (1)如果黑子在①或②号位置,则需要16个白子才能将黑子围住;
  (2)如果黑子在③号位置,则需要12个白子才能将黑子围住;
  (3)如果黑子在④号位置,则需要10个白子才能将黑子围住;
  (4)如果黑子在⑤号位置,则需要8个白子才能将黑子围住;
  (5)如果黑子在⑥号位置,则需要7个白子才能将黑子围住;
  (6)如果黑子在棋盘中间矩形区域的边界其他位置,则需要5~6个白子就能将黑子围住;
  (7)如果黑子在棋盘两端的王宫中,则只需要4~5个白子就能将黑子围住。
  
  
   综上所述,在棋盘上,黑子所处的位置不同,需要白子将其围住的数目也就不同。可见,在图4所示的棋盘中①、②、③号等位置是非常重要的几个棋位。因此,无论黑子还是白子,在着法过程中棋子的位置对于游戏的全局有着非常大的影响作用。
  4. 棋盘坐标选取的技巧探索
  公元1637年前,法国数学家笛卡尔受到了经纬度的启发,创立了直角坐标系,把相互对立着的“数”与“形”统一了起来。通过对坐标表示法的研究,我们可以考虑藏棋游戏编程中棋盘坐标选取的问题。
  
  图4 “王宫双门棋”棋子特殊落点
  
  国际象棋、中国象棋和围棋号称世界三大棋种。在围棋程序中,我国习惯采用古法坐标,按汉字-数字对表示,且纵先横后,如(三、4)表示棋盘底起上数三行,再自左向右数四列。这种表示法虽是承袭传统,但少有围棋程序采用。
  现代围棋程序流行的坐标表示法,是按字母-数字对表示,先横后纵,而日本法则采用古法自上而下排列。
  综上所述,棋类游戏中坐标一般选择棋盘左下角为坐标系原点或左上角为坐标系原点,以棋盘的行为坐标系的x轴,自左向右,以棋盘上的每个小格作为一个坐标单位,从0开始标记;以棋盘的列为坐标系的y轴,自下向上,以棋盘上的每个小格作为一个坐标单位,从0开始标记。例如,将中国象棋棋盘看作一个坐标系,以左下角为坐标系原点,棋盘的行和列分别为坐标系的x轴和y轴,以棋盘上的每个小格作为一个坐标单位,分别绘制棋盘的横线、竖线、将帅区以及河界。
  对于“王宫双门棋”而言,由于棋盘是一种对称图形。而且,基于该棋的游戏特点,棋盘中心点对于黑白双方都是非常重要的一个占据点。所以,我们考虑将棋盘中心点作为坐标系原点。 
  
  在编程时,先对所有棋子进行编号,棋盘上的内容使用数组来标记,数组的下标表示棋盘上的位置(坐标),如果当前位置上有棋子则该数组元素的值为该棋子的编号,否则为0。每走完一步修改数组内容。我们从棋盘左上角出发,向右逐行搜索,当遇到一个黑子时,以它为中心向左挨个查找,如果遇到白子则记录然后继续,如果再遇到白子或边界就停止查找;如果遇到空白点则考虑落子,左边完成后再向右进行同样的操作;最后把左右两边的记录合并起来,得到的数据就是该点横向上的棋型,而其他几个方向的棋型也可用同样的方法得到,当搜索完整张棋盘后,就可以得到所有可以落白子的空白点,最后再根据算法判断落在哪个点上是最优的。
  本文围绕藏棋游戏中较为流行的藏棋之一“王宫双门棋”,展开了对“王宫双门棋”游戏编程中技巧的探索,填补了藏族棋类游戏相关研究的空白。通过对有关游戏界面、棋局表示、棋子落点等方面的技巧的研究,希望能够为藏棋游戏未来的系统研究提供基础。
  
  参考文献
  [1] 游贵荣. 游戏搜索算法中估价函数的构造策略. 福建商业高等专科学校学报,2005.12.
  [2] 张玉宏, 刘运通, 李涛. 智能搜索算法在棋类零和博弈中的应用. 科技咨询导报,2006,No.18.
  [3] 王小春 编著. PC游戏编程(人机博弈). 重庆大学出版社, 2002.5.
  [4] 雷超然, 罗勋阳等编著. Visual C++ MFC 棋牌类游戏编程实例. 人民邮电出版社,2008.7.
  [5] 张颖, 李祖枢. 棋类计算机博弈系统的主要研究方法及在六子棋上的应用. 重庆工学院学报,2008年9月,第22卷第9期.
  [6] 更境.“密芒”围棋棋盘的发现. 中国西藏CHINA'S TIBET,2001,第四期.
  收稿日期:2010-09-02
其他文献
我们一起走过冰雪灾害,激情抗震救灾,我们感同身受,又共同分享奥运喜悦,感叹神七成功,应对金融危机,展望经济发展。在这特殊而关键的时刻,国家政府依然将教育发展、教育改革、教育规划摆在了突出的位置。办好教育,多出人才,出好人才,是全社会共同的责任,更是我们每一个教育者必须履行的光荣使命。面对王益大教育,如何拯救教育的缺失,如何加快教育改革的步伐,带动王益经济大发展,落实“一轴”、“两廊”、“四园区”发
期刊
创造性思维是人类思维的精华,是引发创造活动的前导。一个具有创造性思维的人能够科学地使用大脑,发挥自己的创造才能,得心应手地解决矛盾,攻克难关。近年来,随着生产力和科学技术的迅猛发展,创造性思维越来越受到重视,成为各级各类学校教育和教学中必不可少的重要一环。  素质教育的目的就是把学生从被动的、苦学的束缚中解脱出来成为学习的主体。叶圣陶曾经讲过:“受教育不是像张开了个空袋子,等人家把东西倒进来,装满
期刊
唯物辩证法认为,。任何事物都有两个方面,这两个方面都既是对立的,又是相互依存、相互影响、相互作用、相互促进的,是对立的统一,不可分割,不可偏废。把这一原理运用到班级管理中,会使我们获得一种辩证的科学思维方法,而用这种方法去指导我们的工作,能使我们有效地对学生进行目标管理。下面笔者就学生管理方法的几个方面的关系,谈一下粗浅的认识。  1.以工作为中心与以人为中心相结合 班级管理无非要处理好两种关系:
期刊
【摘要】管理是一种社会职能。管理是管理人员领导、指挥、组织与协调更多的人去完成一定的任务和实现共同目标的活动。是管理者借助下级人员的智慧和才能。充分调动下级人员的积极性、主动性和创造性。最大限度地发挥人力、物力和财力的作用。提高管理水平,提高工作效率,完成组织目标。这是各级管理的实质。而学校管理由于教师的劳动特点和心理特点。而使之具有不同于其它企业的管理特征。在管理中,正确把握教师的心理特征、调整
期刊
新的课程标准把德育教育放在十分重要的地位。新课程目标指导我们培养学生的爱国主义、集体主义精神,树立社会主义民主法制意识,遵守国家法律和社会公德,并逐步形成正确的世界观,人生观,价值观;具有社会主义责任感,努力为人民服务,使学生成为有理想、有道德、有文化、有纪律的一代新人。这些要求充分说明了德育教育在我们教育教学过程中占有重要地位,作为基础学科的数学也必须重视德育教育。所以数学教师的主要任务除了传授
期刊
新课程改革要求教师在课堂教学中要注重小学生的自主学习,让学生成为学习的主人。鉴于小学生的年龄小的特征,教师在教学中不但要重视小学生通过合作、自主的学习去获取知识,而且还要注重培养小学生的自主学习能力,使他们学会自主学习。我认为从以下几个方面来培养小学生的自主学习能力。  1. 创设情境,使学生愿学 创设良好的情境是小学生课堂教学的一部分,良好情境的创设不仅可以提高小学生学习的效率、唤醒了小学生的认
期刊
【摘要】当今中小学生的心理健康发展逐步为人们所重视,作为教师和家长不仅要重视学生的心理健康,更要在学生生理发展的特殊时期加强对其心理素质的培养,以提高社会适应能力。  【关键词】应对学生特殊心理时期;加强心理素质教育  Strengthen mental state health education, exaltation student mental state character  Hu J
期刊
【摘要】习题讲评是教学中不可缺少的环节,许多教师的习题讲评课往往是采用“我说你听”、“我写你抄”的模式,这种习题讲评模式忽视了教育对象的存在,极易造成学生思维疲劳,不利于培养学生的自主学习能力及思维能力。本人结合自身的教学体会撰写此文,与在教学中存在相同困惑的老师共同探讨。  【关键词】习题讲评;教学反思  The teaching of the living creature exercises
期刊
目前,随着企业体制改革和现代化企业制度的建立,对劳动资本的种类、规格、质量、结构组合提出了新的要求。企业对职工进行“筛选”、“过渡”、“优化”,无一技之长的部分职工下岗,需要的是专业技术人才,这给技工学校的生存和发展,提供了良好的机遇。随着市场经济的发展、独资、合资、民营企业的兴起,更需要专业技术人才,这又给技工学校如何培养对路人才提出了新的课题。“只有送得出,才能招得进”正常循环,才能生存。  
期刊
随着教育教学改革的不断深入,在数学教学中“培养学生的阅读能力,让学生在学会阅读数学的过程中会学数学”已成为越来越多的数学教师的共识。另一方面学生为主体,教师为主导的教学原则也在越来越多的课堂中得到体现,如何实施数学阅读教学呢?我的做法是:改变数学教学中不适应阅读学习的传统习惯,从教学方法、学习方式、作业形式等方面加以改进。  1. 通过数学阅读教学,变直接传授知识为主动获取知识的教学   目前的课
期刊