BingWay原创作品,转载请注明作者和出处。
象棋的走法是玩象棋必须知道的,下面的走法是我玩象棋两三天过后总结的。
将或帅
移动范围:它只能在王宫内移动。
移动规则:它每一步只可以水平或垂直移动一点。
士
移动范围:它只能在王宫内移动。
移动规则:它每一步只可以沿对角线方向移动一点。
象
移动范围:河界的一侧。
移动规则:它每一步只可以沿对角线方向移动两点(象走田),另外,在移动的过程中不能够穿越障碍,如果有,就是俗称的“塞象”。
马
移动范围:任何位置
移动规则:每一步只可以水平或垂直移动一点(马走日),再按对角线方面向左或者右移动。另外,在移动的过程中不能够穿越障碍,如果有,就是俗称的“撇马脚”。
车
移动范围:任何位置
移动规则:可以水平或垂直方向移动任意个无阻碍的点。
炮
移动范围:任何位置
移动规则:移动起来和车很相似,但它必须跳过一个棋子来吃掉对方的一个棋子(隔山炮)。
兵
移动范围:任何位置
移动规则:每步只能向前移动一点。小兵过河后,就有了左右移动的能力,兵只能前进,不能后退。
实现各棋子走法的代码:
各子的走法
1 //判断***马***的走法是否合理
2 public bool HorseFoot(Point fromPoint,Point toPoint)
3 {
4 int fromIndex=this.CountIndex(fromPoint); //起点信息的一维数组的索引
5 int toIndex=this.CountIndex(toPoint); //终点信息的一维数组的索引
6 if(fromPoint==toPoint) //如果起点和终点是同一个点,则允许放回旗子,重新选其它路
7 {
8 return true;
9 }
10
11 if(who[fromIndex].Equals(who[toIndex])) //如果起点和终点是同一边的旗子,则不能走
12 {
13 return false;
14 }
15 double twoPoint_Right_Distance=Math.Sqrt((this.width*this.width)+(width+width)*(width+width));
16 double twoPoint_True_Distance=Math.Sqrt((fromPoint.X-toPoint.X)*(fromPoint.X-toPoint.X)+(fromPoint.Y-toPoint.Y)*(fromPoint.Y-toPoint.Y));
17 if(this.GetNextPoint(fromPoint,-2,1)==toPoint||this.GetNextPoint(fromPoint,-2,-1)==toPoint) //当马向上跳时有两种跳法(左上日和右上日)
18 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,-1,0))]==false) //起点上面没有旗子,也就是不 "撇马脚" 时可以往上走旗
19 {
20 if(twoPoint_True_Distance<=twoPoint_Right_Distance)
21 return true;
22 }
23 if(this.GetNextPoint(fromPoint,2,1)==toPoint||this.GetNextPoint(fromPoint,2,-1)==toPoint) //同上,只是变为向下跳马的情况
24 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,1,0))]==false)
25 {
26 if(twoPoint_True_Distance<=twoPoint_Right_Distance)
27 return true;
28 }
29 if(this.GetNextPoint(fromPoint,1,2)==toPoint||this.GetNextPoint(fromPoint,-1,2)==toPoint) //同上,只是变为向右跳马的情况
30 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,0,1))]==false)
31 {
32 if(twoPoint_True_Distance<=twoPoint_Right_Distance+5)
33 return true;
34 }
35 if(this.GetNextPoint(fromPoint,-1,-2)==toPoint||this.GetNextPoint(fromPoint,1,-2)==toPoint) //同上,只是变为向左跳马的情况
36 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,0,-1))]==false)
37 {
38 if(twoPoint_True_Distance<=twoPoint_Right_Distance+5)
39 return true;
40 }
41
42 return false; //除去以上几种情况,其余终点都不能落旗
43 }
44 //判断***兵/卒***的走法是否合理
45 public bool ObiitFoot(Point fromPoint,Point toPoint)
46 {
47 int fromIndex=this.CountIndex(fromPoint); //起点信息的一维数组的索引
48 int toIndex=this.CountIndex(toPoint); //终点信息的一维数组的索引
49 string isUpOrDownFromPoint=this.IsUpOrDown(fromPoint); //起点是在旗盘上方,还是下方("兵/帅" 在旗子上方和下方走法不一样)
50 string isUpOrDownToPoint=this.IsUpOrDown(toPoint); //终点是在旗盘上方,还是下方("兵/帅" 在旗子上方和下方走法不一样)
51
52 if(fromPoint==toPoint) //如果起点和终点是同一个点,则允许放回旗子,重新先其它路
53 {
54 return true;
55 }
56
57 if(who[fromIndex].Equals(who[toIndex])) //如果起点和终点是同一边的旗子,则不能走
58 {
59 return false;
60 }
61
62 if(who[fromIndex].Equals("black")) //假如起始点是黑兵
63 {
64 if(isUpOrDownFromPoint=="down"&&isUpOrDownToPoint=="down"||isUpOrDownFromPoint=="down"&&isUpOrDownToPoint=="up")//起点和终点都在下面或起点在下面终点在上面时情况
65 {
66 if(this.GetNextPoint(fromPoint,-1,0)==toPoint) //如果终点是起点的上面一个点,则返回真
67 {
68 return true;
69 }
70 }
71 else
72 {
73 if(isUpOrDownFromPoint=="up"&&isUpOrDownToPoint=="up")//当起点和终点都在同一点
74 {
75 if(this.GetNextPoint(fromPoint,-1,0)==toPoint) //过河后可以往上走
76 return true;
77 if(this.GetNextPoint(fromPoint,0,1)==toPoint) //过河后可以往右走
78 return true;
79 if(this.GetNextPoint(fromPoint,0,-1)==toPoint) //过河后可以往左走
80 return true;
81 }
82 }
83 }
84 if(who[fromIndex].Equals("red"))
85 {
86 if(isUpOrDownFromPoint=="up"&&isUpOrDownToPoint=="up"||isUpOrDownFromPoint=="up"&&isUpOrDownToPoint=="down")
87 {
88 if(this.GetNextPoint(fromPoint,1,0)==toPoint)
89 {
90 return true;
91 }
92 }
93 else if(isUpOrDownFromPoint=="down"&&isUpOrDownToPoint=="down")//当起点和终点都在同一点
95 {
96 if(this.GetNextPoint(fromPoint,1,0)==toPoint) //过河后可以往下走
97 return true;
98 if(this.GetNextPoint(fromPoint,0,1)==toPoint) //过河后可以往右走
99 return true;
100 if(this.GetNextPoint(fromPoint,0,-1)==toPoint) //过河后可以往左走
101 return true;
102 }
103 }
104
105 return false;
106 }
107 //判断***車***的走法是否合理
108 public bool JuFoot(Point fromPoint,Point toPoint)
109 {
110 int fromIndex=this.CountIndex(fromPoint); //起点信息的一维数组的索引
111 int toIndex=this.CountIndex(toPoint); //终点信息的一维数组的索引
112
113 if(fromPoint==toPoint) //如果起点和终点是同一个点,则允许放回旗子,重新先其它路
114 {
115 return true;
116 }
117 if(who[fromIndex].Equals(who[toIndex])) //如果起点和终点是同一边的旗子,则不能走
118 {
119 return false;
120 }
121 if(fromPoint.X==toPoint.X) //判断是否在同一条垂直直线上
122 {
123 if(fromPoint.Y>toPoint.Y) //起点在终点下面情况
124 for(int i=-1;this.GetNextPoint(fromPoint,i,0)!=toPoint;i--) //判断起点终点之间有无旗子
125 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,i,0))]==true)
126 return false;
127
128 if(fromPoint.Y<toPoint.Y)//起点在终点上面情况
129 for(int i=1;this.GetNextPoint(fromPoint,i,0)!=toPoint;i++) //判断起点终点之间有无旗子
130 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,i,0))]==true)
131 return false;
132 return true;
133 }
134 if(fromPoint.Y==toPoint.Y) //判断是否在同一条水平直线上
135 {
136 if(fromPoint.X<toPoint.X) //起点在终点左边
137 for(int j=1;this.GetNextPoint(fromPoint,0,j)!=toPoint;j++) //判断起点终点之间有无旗子
138 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,0,j))]==true)
139 return false;
140
141 if(fromPoint.X>toPoint.X) //起点在终点右边
142 for(int j=-1;this.GetNextPoint(fromPoint,0,j)!=toPoint;j--) //判断起点终点之间有无旗子
143 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,0,j))]==true)
144 return false;
145 return true;
146 }
147
148 return false;
149 }
150 //判断***炮***的走法是否合理
151 public bool CannonFoot(Point fromPoint,Point toPoint)
152 {
153 int fromIndex=this.CountIndex(fromPoint); //起点信息的一维数组的索引
154 int toIndex=this.CountIndex(toPoint); //终点信息的一维数组的索引
155
156 if(fromPoint==toPoint) //当起点和终点都在同一点,则允许放回旗子,重新先其它路
157 {
158 return true;
159 }
160 if(who[fromIndex].Equals(who[toIndex])) //如果起点和终点是同一边的旗子,则不能落旗
161
1 //判断***马***的走法是否合理
2 public bool HorseFoot(Point fromPoint,Point toPoint)
3 {
4 int fromIndex=this.CountIndex(fromPoint); //起点信息的一维数组的索引
5 int toIndex=this.CountIndex(toPoint); //终点信息的一维数组的索引
6 if(fromPoint==toPoint) //如果起点和终点是同一个点,则允许放回旗子,重新选其它路
7 {
8 return true;
9 }
10
11 if(who[fromIndex].Equals(who[toIndex])) //如果起点和终点是同一边的旗子,则不能走
12 {
13 return false;
14 }
15 double twoPoint_Right_Distance=Math.Sqrt((this.width*this.width)+(width+width)*(width+width));
16 double twoPoint_True_Distance=Math.Sqrt((fromPoint.X-toPoint.X)*(fromPoint.X-toPoint.X)+(fromPoint.Y-toPoint.Y)*(fromPoint.Y-toPoint.Y));
17 if(this.GetNextPoint(fromPoint,-2,1)==toPoint||this.GetNextPoint(fromPoint,-2,-1)==toPoint) //当马向上跳时有两种跳法(左上日和右上日)
18 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,-1,0))]==false) //起点上面没有旗子,也就是不 "撇马脚" 时可以往上走旗
19 {
20 if(twoPoint_True_Distance<=twoPoint_Right_Distance)
21 return true;
22 }
23 if(this.GetNextPoint(fromPoint,2,1)==toPoint||this.GetNextPoint(fromPoint,2,-1)==toPoint) //同上,只是变为向下跳马的情况
24 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,1,0))]==false)
25 {
26 if(twoPoint_True_Distance<=twoPoint_Right_Distance)
27 return true;
28 }
29 if(this.GetNextPoint(fromPoint,1,2)==toPoint||this.GetNextPoint(fromPoint,-1,2)==toPoint) //同上,只是变为向右跳马的情况
30 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,0,1))]==false)
31 {
32 if(twoPoint_True_Distance<=twoPoint_Right_Distance+5)
33 return true;
34 }
35 if(this.GetNextPoint(fromPoint,-1,-2)==toPoint||this.GetNextPoint(fromPoint,1,-2)==toPoint) //同上,只是变为向左跳马的情况
36 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,0,-1))]==false)
37 {
38 if(twoPoint_True_Distance<=twoPoint_Right_Distance+5)
39 return true;
40 }
41
42 return false; //除去以上几种情况,其余终点都不能落旗
43 }
44 //判断***兵/卒***的走法是否合理
45 public bool ObiitFoot(Point fromPoint,Point toPoint)
46 {
47 int fromIndex=this.CountIndex(fromPoint); //起点信息的一维数组的索引
48 int toIndex=this.CountIndex(toPoint); //终点信息的一维数组的索引
49 string isUpOrDownFromPoint=this.IsUpOrDown(fromPoint); //起点是在旗盘上方,还是下方("兵/帅" 在旗子上方和下方走法不一样)
50 string isUpOrDownToPoint=this.IsUpOrDown(toPoint); //终点是在旗盘上方,还是下方("兵/帅" 在旗子上方和下方走法不一样)
51
52 if(fromPoint==toPoint) //如果起点和终点是同一个点,则允许放回旗子,重新先其它路
53 {
54 return true;
55 }
56
57 if(who[fromIndex].Equals(who[toIndex])) //如果起点和终点是同一边的旗子,则不能走
58 {
59 return false;
60 }
61
62 if(who[fromIndex].Equals("black")) //假如起始点是黑兵
63 {
64 if(isUpOrDownFromPoint=="down"&&isUpOrDownToPoint=="down"||isUpOrDownFromPoint=="down"&&isUpOrDownToPoint=="up")//起点和终点都在下面或起点在下面终点在上面时情况
65 {
66 if(this.GetNextPoint(fromPoint,-1,0)==toPoint) //如果终点是起点的上面一个点,则返回真
67 {
68 return true;
69 }
70 }
71 else
72 {
73 if(isUpOrDownFromPoint=="up"&&isUpOrDownToPoint=="up")//当起点和终点都在同一点
74 {
75 if(this.GetNextPoint(fromPoint,-1,0)==toPoint) //过河后可以往上走
76 return true;
77 if(this.GetNextPoint(fromPoint,0,1)==toPoint) //过河后可以往右走
78 return true;
79 if(this.GetNextPoint(fromPoint,0,-1)==toPoint) //过河后可以往左走
80 return true;
81 }
82 }
83 }
84 if(who[fromIndex].Equals("red"))
85 {
86 if(isUpOrDownFromPoint=="up"&&isUpOrDownToPoint=="up"||isUpOrDownFromPoint=="up"&&isUpOrDownToPoint=="down")
87 {
88 if(this.GetNextPoint(fromPoint,1,0)==toPoint)
89 {
90 return true;
91 }
92 }
93 else if(isUpOrDownFromPoint=="down"&&isUpOrDownToPoint=="down")//当起点和终点都在同一点
95 {
96 if(this.GetNextPoint(fromPoint,1,0)==toPoint) //过河后可以往下走
97 return true;
98 if(this.GetNextPoint(fromPoint,0,1)==toPoint) //过河后可以往右走
99 return true;
100 if(this.GetNextPoint(fromPoint,0,-1)==toPoint) //过河后可以往左走
101 return true;
102 }
103 }
104
105 return false;
106 }
107 //判断***車***的走法是否合理
108 public bool JuFoot(Point fromPoint,Point toPoint)
109 {
110 int fromIndex=this.CountIndex(fromPoint); //起点信息的一维数组的索引
111 int toIndex=this.CountIndex(toPoint); //终点信息的一维数组的索引
112
113 if(fromPoint==toPoint) //如果起点和终点是同一个点,则允许放回旗子,重新先其它路
114 {
115 return true;
116 }
117 if(who[fromIndex].Equals(who[toIndex])) //如果起点和终点是同一边的旗子,则不能走
118 {
119 return false;
120 }
121 if(fromPoint.X==toPoint.X) //判断是否在同一条垂直直线上
122 {
123 if(fromPoint.Y>toPoint.Y) //起点在终点下面情况
124 for(int i=-1;this.GetNextPoint(fromPoint,i,0)!=toPoint;i--) //判断起点终点之间有无旗子
125 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,i,0))]==true)
126 return false;
127
128 if(fromPoint.Y<toPoint.Y)//起点在终点上面情况
129 for(int i=1;this.GetNextPoint(fromPoint,i,0)!=toPoint;i++) //判断起点终点之间有无旗子
130 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,i,0))]==true)
131 return false;
132 return true;
133 }
134 if(fromPoint.Y==toPoint.Y) //判断是否在同一条水平直线上
135 {
136 if(fromPoint.X<toPoint.X) //起点在终点左边
137 for(int j=1;this.GetNextPoint(fromPoint,0,j)!=toPoint;j++) //判断起点终点之间有无旗子
138 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,0,j))]==true)
139 return false;
140
141 if(fromPoint.X>toPoint.X) //起点在终点右边
142 for(int j=-1;this.GetNextPoint(fromPoint,0,j)!=toPoint;j--) //判断起点终点之间有无旗子
143 if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,0,j))]==true)
144 return false;
145 return true;
146 }
147
148 return false;
149 }
150 //判断***炮***的走法是否合理
151 public bool CannonFoot(Point fromPoint,Point toPoint)
152 {
153 int fromIndex=this.CountIndex(fromPoint); //起点信息的一维数组的索引
154 int toIndex=this.CountIndex(toPoint); //终点信息的一维数组的索引
155
156 if(fromPoint==toPoint) //当起点和终点都在同一点,则允许放回旗子,重新先其它路
157 {
158 return true;
159 }
160 if(who[fromIndex].Equals(who[toIndex])) //如果起点和终点是同一边的旗子,则不能落旗
161
作者: yorkville
- 该日志由 yorkville 于12年前发表在综合分类下,最后更新于 2012年09月20日.
- 转载请注明: 象棋游戏编程——各棋子的走法 | 学步园 +复制链接
抱歉!评论已关闭.