博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Silverlight+WCF 新手实例 象棋 棋子移动-规则[将、马、士、相、炮](八)
阅读量:6076 次
发布时间:2019-06-20

本文共 3743 字,大约阅读时间需要 12 分钟。

hot3.png

这节来完成剩下五个种子的规则。

先来将吧

将:只能走一步,而且只能在九宫内行走

看代码,还是和兵的一个样。

if
 (Math.Abs(y2 
-
 y1) 
+
 Math.Abs(x2 
-
 x1) 
!=
 
1
)
//
只能走一步
                        {
                            
break
;
                        }

 

下面限制九宫内判断:

if
 (
2
 
<
 x2 
&&
 x2 
<
 
6
 
&&
 y2 
>
 
6
)
                            {
                                
return
 
true
;
                            }

 

完了,将的验证太简单了,句合起来就是:

05233235_dBCX.gif
 
case
 ChessType.Jiang:
                        
if
 (Math.Abs(y2 
-
 y1) 
+
 Math.Abs(x2 
-
 x1) 
!=
 
1
)
//
只能走一步
                        {
                            
break
;
                        }
                        
if
 (
2
 
<
 x2 
&&
 x2 
<
 
6
 
&&
 y2 
>
 
6
)
                        {
                            
//
九宫内走
                            
return
 
true
;
                        }
                        
break
;

 

下面说马,爱日的马。

马:有两种走法,一种竖着日,一种横着日,如果没有顶心顶肺马脚就日过去了。

先说竖着日,y方向走跨两步,x方向跨一步,是不是很简单:

if
 ((Math.Abs(y2 
-
 y1) 
==
 
2
 
&&
 Math.Abs(x2 
-
 x1) 
==
 
1
))
//
先判断走竖日型
{
//
再判断有没有马脚。
}

 

那马脚咋判断?我们只要判断马脚上存不存在棋子就可以了,至于马脚点的坐标,

其实就是:(x1 + x2) / 2, y1,y不变,x方向和移动点之间的点。

要判断棋子存不存在呢,我们要加多个函数来判断了。

 
///
 
<summary>
        
///
 是否存在指定的点
        
///
 
</summary>
        
public
 
bool
 IsExits(Point point)
        {//待实现
            return true;
        }

 

好了,现在我们在马日里实现马脚判断就行了:

05233235_dBCX.gif
if
 ((Math.Abs(y2 
-
 y1) 
==
 
2
 
&&
 Math.Abs(x2 
-
 x1) 
==
 
1
))
//
先判断走竖日型
                        {
                            
//
有没有马脚点
                            
if
 (
!
IsExits(
new
 Point(x1, (y1 
+
 y2) 
/
 
2
)))
                            {
                                
return
 
true
;
                            }
                        }

 

这样就完成竖着日,横着日嘛,也很简单了,y方向一步,x方向两步:

05233235_dBCX.gif 代码
if
 ((Math.Abs(y2 
-
 y1) 
==
 
1
 
&&
 Math.Abs(x2 
-
 x1) 
==
 
2
))
//
先判断走横日型
                        {
                            
//
有没有马脚点
                            
if
 (
!
IsExits(
new
 Point((x1 
+
 x2) 
/
 
2
, y1)))
                            {
                                
return
 
true
;
                            }
                        }

 

两个合起来嘛,完整代码就是:

05233235_dBCX.gif
case
 ChessType.Ma:
                        
if
 ((Math.Abs(y2 
-
 y1) 
==
 
2
 
&&
 Math.Abs(x2 
-
 x1) 
==
 
1
))
//
先判断走竖日型
                        {
                            
//
有没有马脚点
                            
if
 (
!
IsExits(
new
 Point(x1, (y1 
+
 y2) 
/
 
2
)))
                            {
                                
return
 
true
;
                            }
                        }
                        
else
 
if
 ((Math.Abs(y2 
-
 y1) 
==
 
1
 
&&
 Math.Abs(x2 
-
 x1) 
==
 
2
))
//
先判断走横日型
                        {
                            
//
有没有马脚点
                            
if
 (
!
IsExits(
new
 Point((x1 
+
 x2) 
/
 
2
, y1)))
                            {
                                
return
 
true
;
                            }
                        }
                        
break
;

 

下面说说士啦[上面那个点的判断后面再实现,其实就是一个循环棋子找点]

士:九宫内走半日。

05233235_dBCX.gif
 
case
 ChessType.Shi:
                        
if
 (
2
 
<
 x2 
&&
 x2 
<
 
6
 
&&
 y2 
>
 
6
)
                        {
                            
//
九宫内走
                            
if
 ((Math.Abs(y2 
-
 y1) 
==
 
1
 
&&
 Math.Abs(x2 
-
 x1) 
==
 
1
))
//半日
                            {
                                
return
 
true
;
                            }
                        }
                        
break
;

 

完了,两个if搞定了。

下面说说相:

相:走两日合成田,不能有马脚,还不能过河。

05233235_dBCX.gif
case
 ChessType.Xiang:
                        
if
 ((Math.Abs(y2 
-
 y1) 
==
 
2
 
&&
 Math.Abs(x2 
-
 x1) 
==
 
2
))
//
先判断走田型
                        {
                            
//
有没有田脚点,并且不能过河
                            
if
 (
!
IsExits(
new
 Point((x1 
+
 x2) 
/
 
2
, (y1 
+
 y2) 
/
 
2
)))
                            {
                                
if
 (y2 
>
 
4
)
//
不过河
                                {
                                    
return
 
true
;
                                }
                            }
                        }
                        
break
;

 

三步判断搞定。

下面最后一个就是炮了:

炮:能和车一样直来直往。还能隔空打炮,不过只能隔一炮打一炮,即隔着炮的时候必须有炮给打,要是没东西打就不能过去。

1。好,先调用和车一样的障碍物函数:

OutCount(chessman.MovePoint, moveTo, out xCount, out yCount);

2。判断是不是目标地点有“炮可打”

bool exits = IsExits(moveTo);

3。最后进行判断,看下面那句说明:

if (x1 == x2 && (yCount == 0 && !exits) || (yCount == 1 && exits)

                         || y1 == y2 && (xCount == 0 && !exits) || (xCount == 1 && exits))
                        {//坚走/横走没有最多一个障碍别
                            return true;
                        }

合起来就是:

 

05233235_dBCX.gif
 
case
 ChessType.Pao:
                        OutCount(chessman.MovePoint, moveTo, 
out
 xCount, 
out
 yCount);
                        
bool
 exits 
=
 IsExits(moveTo);
                        
if
 (x1 
==
 x2 
&&
 (yCount 
==
 
0
 
&&
 
!
exits) 
||
 (yCount 
==
 
1
 
&&
 exits)
                         
||
 y1 
==
 y2 
&&
 (xCount 
==
 
0
 
&&
 
!
exits) 
||
 (xCount 
==
 
1
 
&&
 exits))
                        {
//
坚走/横走没有最多一个障碍别
                            
return
 
true
;
                        }
                        
break
;

 

OK,至此,所以规则都做完了,oh,还有一个判断马脚田脚和猪脚的函数没实现,现在来实现一下:

由于根据一个点找一颗棋子,这函数是在以后会用到,所以,我们在Chess类里先实现一个函数来返回一颗棋子:

05233235_dBCX.gif
///
 
<summary>
        
///
 找棋子
        
///
 
</summary>
        
public
 Chessman FindChessman(Point point)
        {
            
for
 (
int
 i 
=
 
0
; i 
<
 ChessmanList.Count; i
++
)
            {
                
if
 (point 
==
 ChessmanList[i].MovePoint)
                {
                    
return
 ChessmanList[i];
                }
            }
            
return
 
null
;
        }

 

接下我们那个IsExits函数就相当的简单了:

///
 
<summary>
        
///
 是否存在指定的点
        
///
 
</summary>
        
public
 
bool
 IsExits(Point point)
        {
            
return
 Action.Parent.FindChessman(point) 
!=
 
null
;
        }

 

终于,该做的都做完了,我们对下半盘棋子都做了规则限制了。

那我们到现在还没应用呢,应用呢,很简单了,回到动作类里ChessAction里,在MoveTo方法加一个if判断就行了

 

05233235_dBCX.gif
///
 
<summary>
        
///
 移动棋子
        
///
 
</summary>
        
///
 
<param name="chessman">
棋子
</param>
        
///
 
<param name="toX">
移动到X坐标
</param>
        
///
 
<param name="toY">
移动到Y坐标
</param>
        
public
 
bool
 MoveTo(Chessman chessman, Point moveTo)
        {
            
if
 (Rule.IsCanMove(chessman, moveTo))
//
把规则应用到这里就OK了
            {
                chessman.ReadyMove 
=
 
false
;
                chessman.chessman.Background 
=
 
null
;
                PlayMove(chessman, moveTo);
                chessman.MovePoint 
=
 moveTo;
                
return
 
true
;
            }
            
return
 
false
;
        }

 

OK,运行看下效果:

试了一下,下面的红色棋都正常的按规则走了。

不过上半棋黑色棋,还是个别的是不能按规则走,不过我们下棋都一般只下下面的棋,所以应用的话只对下半盘做限制就行了。

如果需要对上半盘也做限制,另外方式补充了。

好到这一阶段,提供第二阶段源码:

打完收工!

作者博客:

转载于:https://my.oschina.net/secyaher/blog/274084

你可能感兴趣的文章
DOM方式保存xml为UTF-8格式
查看>>
学生管理系统
查看>>
python一键修改zabbix客户端配置
查看>>
前后端传参语法细节
查看>>
android下载封装类
查看>>
判断是否IE浏览器,修改div背景色
查看>>
浅析Linux服务器网络开发模型
查看>>
Coroutine on Android学习笔记
查看>>
android ImageView.getDrawingCache return NULL一点...
查看>>
xcode4.2 关闭ARC
查看>>
jfinal与jqgrid结合实例。
查看>>
spring ApplicationContext 继承结构
查看>>
《老爸老妈浪漫史》Barney和Robin终于。。。
查看>>
geexbox 在pannd board 的配置
查看>>
mysql中存储emojj
查看>>
“秒杀”问题的数据库和SQL设计
查看>>
properties 文件 属性值过长换行如何处理
查看>>
Session
查看>>
nodejs 升级最新稳定版本
查看>>
Git详解---------------Book
查看>>