信息科学与技术学院学士学位论文
字中间是否有棋子。如果棋子“象”和“相”没有违背各自的属性,则可以移到目标点,否则棋子原地不动。
(4)“馬”的行棋规则设计
“馬”可以在棋盘任意位置活动,每一步可分解成两个部分,即水平方向(垂直)移动两个棋点,再垂直方向(水平)移动一个棋点,俗语将两部分合在一起的这一步称为“馬走日”。倘若蹩馬腿,即馬处于“日”字左上角,要移动到“日”字右下角,则左上角下一个棋点那个位置不能落子,否则馬不能移动。蹩馬腿的情况以此类推。
设计时可两种情况来考虑,一种是走横向“日”字,有从上往下和自下向上两种情境,一种是走竖向“日”字,也有两种情境。用if语句来判断,例如馬横向走“日”,首先,用if(a==2 && b==1)来判断棋子是否横向走两个棋点,纵向走一个棋点,接着再用判断语句if(qizi[start I+1][start J]!=null)和if (qizi [startI-1][start J]!=null)来判断棋子馬腿处是否有棋子。纵向走“日”同理。如果棋子“馬”不是走“日”,则棋子不移动。如果棋子“馬”符合以上的走棋规则,则可以移到目标位置,否则棋子强制不动。
(5)“車”的行棋规则设计
“車”可以在棋盘任意位置移动,每一步能够在水平或垂直方向移动任意个没有阻碍的棋点。它的这一属性,使得大多数棋友都视車如命,它操作简单,杀伤力巨大,既能一步登天,也能亦步亦趋。它只能走直线,且中间不能有任何棋子,设计时分为两种情况来考虑,一种是纵向行走;一种是横向行走。用if语句来判断实现,例如車纵向行走,首先,用if(max J==min J)来判断棋子是否纵向行走,接着再用判断语句if(qizi[i][maxJ]!=null)来判断竖线中间是否存在别的棋子。横向行走同理。如果棋子“車”符合以上的走棋规则,则能够移到目标点,否则棋子强制不动。
(6)“炮、砲”的行棋规则设计
“炮、砲”可以在棋盘任意位置活动,移动起来和車极其相似。只是跑在吃子之时,可以隔子吃子(跳子吃子),运用得当往往能够得到意想不到的效果。
如果棋子“炮、砲”走的是竖线,且终点有棋子,则需要判断棋子棋点和重点
16
信息科学与技术学院学士学位论文
之间存在几颗棋子,若是没有棋子,则在终点的前一位可以任意移动;若是有多颗棋子,在与最近那颗棋子中间可以自由移动。当“炮、砲”进行吃子时,若是中间有一颗棋子,而第二颗棋子是对方棋子,则可以将其覆盖掉;若是第二颗棋子是己方棋子,则不能将其覆盖。
(7)“卒、兵”的行棋规则设计
“卒、兵”的行走规则分两种情况。一种是棋子没过河界,另一种是棋子过了河界。用if语句来判断,首先,用if(start J>4)语句来判断棋子“卒”是否过河界,接着使用if(start I!=end I)来判断它是否向前走,随后通过if(end J-start I!=-1)来判断棋子“卒”是否走一个棋点;然后用if(end J>=6)语句来设定棋子过了河界,紧接着设定棋子在过了河界的情况下只能向前、向左、向右行走一个棋点。同理,用if(start J<5)来判断棋子“兵”是否过河,再以同样的方法判断其他规则。如果棋子“卒”和“兵”符合以上各自的走棋规则,则可以走动,否则棋子强制放回原处[10-11] 。
3.3.2 吃棋规则
通过棋子的行棋规则,每一颗棋子在各自的行棋规则内每走一步棋,若是目标棋子是对方的棋子,则己方棋子可以直接把对方棋子覆盖掉,占领该棋点。除“炮、砲”以外。棋子“炮、砲”吃子时,目标棋子中间必须隔一个棋子跳吃,中间有且仅能隔一个棋子,己方对方均可,即俗称“炮打接子连”。吃子的一方,把被吃掉的棋子移走并占居对方原来位置
[12]
。
走棋和吃棋流程图3-4所示。
17
信息科学与技术学院学士学位论文
图3-4 走棋和吃棋流程图
在鼠标点击监听“mouseClicked(MouseEvent e)”方法中,先单击己方棋子,并保存棋子下标Man及坐标(Manx,Many),再单击可移动棋点,走棋或吃子,并保存记录。
定义“boolean Move(Ex,Ey)”方法,设置棋子移动吃子规则,另外定义“booleanpaoEat(ix,iy)”方法定义炮吃子规则。
3.4 主要算法伪码示例
3.4.1 棋子和棋盘状态维护算法简介
中国象棋游戏棋盘是由9条竖线和10横线交叉而成,中间有一块空白的区域称为“楚河汉界”,即是象(相)和卒(兵)的临界点。对阵两边各执一方战场,在己
18
信息科学与技术学院学士学位论文
方中心各有一个交叉线打造的“九宫格”,相当于将帥的大本营。
棋盘是用一个9×10的二维数组表示的,由一个QiZi.java的一个实例对象维护,该类有一个属性QiZi[9][10] 的二维数组,系统通过此数组来进行整个棋盘状态的维护。棋盘布局如图3-5所示。
图3-5 棋盘布局图
3.4.2 棋盘规则馬规则伪码示例
Begin:
初始化->int 起动X坐标,起动Y坐标,落定X坐标,落定Y坐标,棋盘数组 根据馬的走棋规则,一般情况下“馬走日”,因此,馬在一个位置最多有8种走法,遍历这八种走法并且判断是否有“蹩馬腿”的情形
if(起X±1==落X && 起Y±2==落Y && 棋盘数组[起X][起Y±1]==0) return合法走法
if(起X±2==落X && 起Y±1==落Y && 棋盘数组[起X±1][落Y]==0) return合法走法
如果都不满足则为非法走法
19
信息科学与技术学院学士学位论文
return 非法走法 3.4.3 棋子选择和移动伪码示例
Begin:
初始化->int 鼠标X坐标,鼠标Y坐标,棋盘X坐标,棋盘Y坐标 int flag->0当flag=1时表示有己方棋子被选中,0表示没有 第一步:
在棋盘上点击鼠标,获得当前鼠标的X和Y坐标,对鼠标XY坐标进行量化处理,形成棋盘数组坐标
if(flag==0)
if(点击的棋子是己方棋子)flag->1 else goto 第一步 else
if(点击的棋子是己方棋子)flag->0 else if(走子合法)移动棋子 else goto第一步 3.4.4 棋谱生成的伪码示例
棋谱规则:移动棋子所在的直线编码(红白方均由己方底线从右向左数),红方用汉字表示,从右向左纵向九条竖线,记为一到九路;白方用阿拉伯数字表示,从右到左竖线,记为1到9。因此,红方的一路就是白方的9路。
棋子的移动方向,横走记为“平”,往对方底线记为“进”,朝己方底线记作“退”。走直线的棋子,进退是数格子的,比如红方一路的車向前走一步就是車一进一,平是记录从几路到几路,红方二路的炮平到五路就是炮二平五。走斜线的棋子只有进退没有平进退是记录从几路到几路,比如二路的馬向前跳到三路就是馬二进三。
如果在一条路上有两个相同的棋子则用前后区分而不必说明在几路,比如二路
20

