此文以现代传统的中国象棋为背景,为实现中国象棋弈棋的智能化、自动化,主要研究了一种以中国象棋为依托来实现智能棋盘的软硬件设计。
在行棋的过程中,利用光电管进行持续的扫描,根据每个棋子种类码进行判断,根据每个棋子位置码进行定位,并且了解棋手按照交替的方式进行行棋,从而确定棋子的移动方式的。为了确定棋子的移动是否违规,笔者为每一类棋子专门设定了程序。在比赛尚未开始时,就要设置好双方的行棋规定用时,如果在行棋的过程中起手规定时间到,就会被判定为违规,本棋盘规定当棋手落子后,对方必须在100 s内完成行棋(总步数不超过99步)。这样就不用棋手每次走完棋进行人工按压计时(计时器),采用自动化的技术来计算子数,替换到人工岗位,具有全自动功能,极大的节约了比赛时的人工成本。
软件设计主要为行棋程序设计,行棋程序主要由计着子数程序、计时器程序、吃棋程序、走棋程序、各棋子行棋规则判断程序等组成。
软件设计部分要在棋局开始前完成初始化设置,以及棋盘各类棋子的编码设置。开始按键按下后,由主程序不断检测8255所得到的棋盘各位置的变化,根据不同的棋子的变化,转去执行相应的棋子走子或吃子等相关子程序。
行棋程序中包含行棋规则是:①红先黑后;②棋子落定后,不得悔棋;③吃棋拿棋后,不得悔棋。
吃棋时,棋手应该先拿起己方棋子,然后再拿起想要吃的棋子,再将自己的棋子放在被吃棋子的位置上。如“炮”吃“卒”,应该先拿起自己的“炮”,然后去拿起对方的“卒”,最后将自己的“炮”放在对方原来的“卒”的位置上。
在三条规则之中,第三条规则可以进行二选一,为了满足用户使用的需要本程序设定为先拿起自己的棋子去覆盖敌方棋子。
当一方拿起自己的棋子,落在无棋子的位置上时,即为走棋;调用走棋程序,同时要调用棋子行棋规则判断程序,判断是否违规;如违规即报警;如无违规则记录该棋子的位置编码。当一方拿起自己的棋子,再拿起对方的棋子,并将自己的棋子落在该新位置上时,即为吃棋;调用吃棋程序,同时要调用棋子行棋规则判断程序,判断是否违规;如违规即报警;如无违规则记录该棋子的新位置编码。
棋子的类型编码是始终不变的,位置编码是随着行棋的进行而变化的。在开始键按下后,不断检测棋盘数据并与初始值进行比较,直至有变化,即表示有棋子移动。由移动的位置码可知是什么棋子在移动。
软件设计流程图如图1所示。
棋盘各点的检测扫描程序
此程序的功能是对棋盘初始值的检测,以及对各棋子位置变化的记录是整个软件设计部分的核心,本部分程序如能顺利完成,其他的软件部分也能迎刃而解。棋子的类型编码是实现设定好的,而位置编码是随着行棋的进行而不断刷新的。在开始键按下后,不断检测棋盘数据并与初始值进行比较,当棋子位置编码发生变化时,即说明有棋手行棋。由移动的位置码可知是什么棋子在移动。
8279键盘显示驱动程序
在键盘显示模块中,共有8个数码管,前四个与后四个各分为一组,前两位显示红方棋手的每步行棋剩余时间,三、四位显示红方棋手的着子数,五、六位显示黑方棋手每步行棋剩余时间,七、八位显示黑方棋手的着子数。这样就减轻了裁判员的负担,实现自动判断、计时的功能。该部分程序主要完成对走棋剩余时间的显示,以及走子数的显示。
下棋子程序设计
当棋手开始下棋时,下棋使用的程序共分为:走棋程序、吃棋程序、行棋规则。三种程序同时调用。下面以我方走马和走车分别为例进行说明。
1马行棋设计
例如,马的行棋规则为可走日,行走范围为全棋盘。如图2,可以向23456789中八个方向走,落地位置有对方子时可以直接吃掉,而不可向1处走,为蹩马腿。
当棋手走马时,流程图如图3所示。具体地,需要考虑如下情况:
根据是否仅有一个子动作判断调用走棋程序还是吃棋程序;
若仅有一个子动作则调用走棋程序;
再根据行棋规则判断是否符合马的行棋规则,判断方法为横纵坐标中有一项移动两格另一个移动一格,如不符合则报警;
如果没有犯规记录则自动将马的程序编码及移动位置进行储存;
若有两个棋子位置发生改变,则判定调用吃棋程序,当棋手吃完棋后,再根据行棋规则判断是否符合,如若不符合则自动报警;
如果没有犯规记录则自动将马的程序编码及移动位置进行储存;
同时要注意根据事先设定的程序,吃棋时需要先拿起自己的子再去拿对方的子。
具体判定过程为,先根据马的位置编码判定动作的子为马。然后根据行棋规则调用马的行棋规则,只能走日,即纵坐标移动2,横坐标移动1;或横坐标移动2纵坐标移动为1,如果不符合马的行棋规则则报警,如果符合则判定是否存在蹩马腿现象,存在则报警,如果不存在则继续;最后判定此步为吃棋还是行棋,结束。
2车行棋规则
车走棋时设计程序同理:车的行棋规则较为简单,只能直走,可以横向直走也可以纵向直走前后左右均可走,中间遇到对方子可以直接吃掉,前后左右为对方子可以直接吃掉。
首先判定车为纵向行走还是横向行走,如果为纵向行走则记录下纵向行走的位置编码进行储存;
然后再进行判定是行棋还是吃棋,若仅有车一子进行移动则为行棋,调用行棋程序;
若行棋结束位置还有其他子被替代则为吃棋,调用吃棋程序;
如果出现横纵坐标都变化、或者都不变化、或其他位置子消失等不符合行棋规则情况出现时则报警。
3炮行棋规则
炮的行棋规则较为特殊,走棋时可以直行,纵横方向皆可。吃棋时中间必须隔一个子;炮可向四个方向移动,也可以吃隔子吃子。这样程序设计时需考虑以下步骤:
先判断是走棋还是吃棋,判断横纵坐标是否只有其中一个有变化;
然后判断目标位置是否有子,如果有子则调用吃棋程序,如果没有子则调用走棋程序;
将走棋的炮坐标和目标位置的子以代码形式储存;
不符合行棋规则的报警。
联系客服