Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

简介:

前言

复制代码
ExpandedBlockStart.gif
继之前Silverlight+WCF 新手实例 象棋系列四十篇之后,一个多月的时间都在写CYQ.Data框架系列[CYQ.Data 轻量数据层之路 框架开源系列 索引],

让各位对该Silverlight+WCF 象棋系列有兴趣的网友久候了,上一系列详见:[Silverlight+WCF 新手实例 象棋 专题索引]

今天开始就在之前四十篇续上,直到把 [Silverlight+WCF 新手实例 象棋 在线演示] 上的最新代码写完,谢谢支持!
复制代码

 

乱七杂八说两句:

一个多月没碰VS2010了,今天回头看原来的象棋系列代码,感觉到有点陌生了,

好多原来的思路,都忘的差不多了,要续写这系列文章,感觉还得像个新手一样重温下代码才行呢。

本系列为进阶优化系列,会在原来的基础上,慢慢改动很多代码的哦,欢迎持续关注!

 

正文:

我们先回顾下,截一张上一系列 最后一节[Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放-结局(四十) ]里的一张图片先:

 

OK,从这图片我知道双方是在下棋了,可是我们并不知道现在该谁下了?

当然了,认真看一下棋谱,还是知道刚刚是黑方下了一步,不过还是要很用力的猜车一平二是怎么个平法。

十字轨迹的出现,解决了这个问题,如果到QQ平台下过棋,也见过的,就是那个棋子周围加上的一个边框了,那这个为啥叫十字轨迹?这个这个...

 

 

好!大伙知道十字轨迹是什么就好了,现在说说实现思路

大伙想啊,十字轨迹是在棋步移动之后,在棋盘上就有两个出现了,一个在移动的棋子的原来位置,一个在移动后的位置,而且整个棋盘就只能有两个,于是,我们的思路定位就很简单了。

一:在棋盘上先创建好两个十字轨迹,默认隐藏

二:在棋手移动完棋子之后,把两个十字轨迹移动到相应的位置

 

 

就这么两步,很简单吧,该出手时就出手。

 

实现步骤如下:

 

一:棋盘Board类画十字轨迹

 

1:增加两个十字轨迹属性

复制代码
ExpandedBlockStart.gif
    ///   <summary>
    
///  棋盘 by 路过秋天
    
///   http://cyq1162.cnblogs.com
    
///   </summary>
     public   class  Board
    {
        
///   <summary>
        
///  十字轨迹框
        
///   </summary>
         public  Canvas TrackFrom
        {
            
get ;
            
set ;
        }
        
///   <summary>
        
///  十字轨迹框
        
///   </summary>
         public  Canvas TrackTo
        {
            
get ;
            
set ;
        }
        
// 下面省略N多代码
     }
复制代码

2:增加一函数,用于画十字轨迹

复制代码
ExpandedBlockStart.gif
         private   void  DrawTrack(Panel panel)
        {
            
double  width  =  panel.Width  -   8 ;
            
// 横线4条
            DrawLine( 0 0 , width  /   4 0 3 , panel,  false ); // L-
            DrawLine( 0 , width, width  /   4 , width,  3 , panel,  false ); // LB-
            DrawLine(width  *   3   /   4 0 , width,  0 3 , panel,  false ); // R-
            DrawLine(width  *   3   /   4 , width, width, width,  3 , panel,  false ); // RB-


            
// 直线四条
            DrawLine( 0 0 0 , width  /   4 3 , panel,  false ); // L| ok
            DrawLine(width,  0 , width, width  /   4 3 , panel,  false ); // R| ok
            DrawLine( 0 , width,  0 , width  *   3   /   4 3 , panel,  false ); // LB|
            DrawLine(width, width  *   3   /   4 , width, width,  3 , panel,  false ); // RB|
        }
复制代码

说明:

画这么个框,记得以前还真费了不少劲,在那调坐标和宽度;

注意哦,DrawLine方法变成5个参数了,以前只有四个的。

3:DrawLine方法小调整

复制代码
ExpandedBlockStart.gif
        private   void  DrawLine( double  x1,  double  y1,  double  x2,  double  y2)//保留原有方法原型,不用改其它画线代码
        {
            DrawLine(x1, y1, x2, y2, 
1 , container,  true );
        }
        
private   void  DrawLine( double  x1,  double  y1,  double  x2,  double  y2,  int  thick, Panel panel,  bool  auto)
        {
            
double  tempGap  =  ((x1  +  y1)  >   19   ||   ! auto)  ?   1  : gap; // 就这行加了一个!Auto,其它没变过
            Line line  =   new  Line()
            {
                X1 
=  x1  *  tempGap  +  marginLeft,
                Y1 
=  y1  *  tempGap  +  marginTop,
                X2 
=  x2  *  tempGap  +  marginLeft,
                Y2 
=  y2  *  tempGap  +  marginTop,
                Stroke 
=   new  SolidColorBrush(Colors.Black),
                StrokeThickness 
=  thick
            };
            panel.Children.Add(line);
        }
复制代码

说明:

增加一个auto是干虾米用的呢?这是因为在画十字轨迹时,我们传进的是实际像素值,然而又可能出现x1 + y1 < 19的情况,为了保证它是按像素计算,所以...你懂的!
还有,为啥是19,其实应该是17[数一下横线+直线有多少条,索引从0开始],这个问题在以前就说过了,这里不多解释了,保留19也没错。

4:初始化画棋盘时,把十字轨迹也画上

复制代码
ExpandedBlockStart.gif
         private   void  Draw()
        {
            
// 省略画棋盘线代码
      
            
#region  画棋步轨迹
            
// 创建两个十字修饰框
            TrackFrom  =   new  Canvas()
            {
                Width 
=  gap,
                Height 
=  gap,
                Margin 
=   new  Thickness( - marginLeft  *   12 - marginLeft  *   12 0 0 )
            };
            TrackTo 
=   new  Canvas()
            {
                Width 
=  gap,
                Height 
=  gap,
                Margin 
=   new  Thickness( - marginLeft  *   12 - marginLeft  *   12 0 0 )
            };
            DrawTrack(TrackFrom);
            DrawTrack(TrackTo);
            container.Children.Add(TrackFrom);
            container.Children.Add(TrackTo);
            
#endregion
            
#region  画楚河汉界
              DrawFont(
" 路过秋天 " );
            
#endregion
        }
复制代码

 

二:Chess象棋类增加设置十字焦点方法

 

1:增加设置十字焦点方法

复制代码
ExpandedBlockStart.gif
         ///   <summary>
        
///  设置轨迹十字框
        
///   </summary>
         public   void  SetFocus(Point from, Point to)
        {
            from 
=  SwitchPixelArray(from);
            to 
=  SwitchPixelArray(to);
            
double  offset  =  Board.TrackFrom.Width  /   2   -  Board.marginLeft  *   11   -   4 ; // 要减去默认初始位置,默认是*-12
            Canvas.SetLeft(Board.TrackFrom, from.X  -  offset);
            Canvas.SetTop(Board.TrackFrom, from.Y 
-  offset);
            Canvas.SetLeft(Board.TrackTo, to.X 
-  offset);
            Canvas.SetTop(Board.TrackTo, to.Y 
-  offset);
        }
复制代码

 

说明:

在移动棋步的时候,我们调用一下这个方法,把两个轨迹移动到相应的位置就OK了,

重点是:移动时,要减去原来的默认初始的位置,这个调整起来很麻烦。

 

三:ChessAction棋子动作类

 

1:棋手移动时调用设置十字轨迹焦点函数

复制代码
ExpandedBlockStart.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))
            {
                chessman.ReadyMove 
=   false ;
                chessman.chessman.Background 
=   null ;
                PlayMove(chessman, moveTo);
                Parent.SetFocus(chessman.MovePoint, moveTo);
// 就这一行代码增加
                HelpMoveStepEvent(chessman, moveTo);
                chessman.MovePoint 
=  moveTo;
                
                
return   true ;
            }
            
return   false ;
        }
复制代码

 

2:对方棋手下棋手,系统会自动移动棋子,也要自动设置十字轨迹焦点

复制代码
ExpandedBlockStart.gif
        ///   <summary>
        
///  系统自动移动棋子
        
///   </summary>
         public   void  AutoMoveTo(Point from, Point to)
        {
            Chessman chessman 
=  Parent.FindChessman(from);
            Chessman eatChessman 
=  Parent.FindChessman(to);
            
if  (chessman  !=   null )
            {
                PlayMove(chessman, to);
                Parent.SetFocus(from, to);
// 就这一行代码增加
                chessman.MovePoint  =  to;
                
if  (eatChessman  !=   null )
                {
                    SetIsGameEnd(eatChessman);
                    eatChessman.GoToDead();
                }
            }
        }
复制代码

 

四:F5看运行结果

 

1:运行后直接上图了

OK,大伙看到效果了吧!

 

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/10/11/1847625.html

相关文章
|
12天前
|
存储 SQL 安全
网络安全的盾牌:漏洞防护与加密技术的实战应用
【8月更文挑战第27天】在数字化浪潮中,信息安全成为保护个人隐私和企业资产的关键。本文深入探讨了网络安全的两大支柱——安全漏洞管理和数据加密技术,以及如何通过提升安全意识来构建坚固的防御体系。我们将从基础概念出发,逐步揭示网络攻击者如何利用安全漏洞进行入侵,介绍最新的加密算法和协议,并分享实用的安全实践技巧。最终,旨在为读者提供一套全面的网络安全解决方案,以应对日益复杂的网络威胁。
|
8天前
|
运维 安全 应用服务中间件
自动化运维的利器:Ansible入门与实战网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【8月更文挑战第30天】在当今快速发展的IT时代,自动化运维已成为提升效率、减少错误的关键。本文将介绍Ansible,一种流行的自动化运维工具,通过简单易懂的语言和实际案例,带领读者从零开始掌握Ansible的使用。我们将一起探索如何利用Ansible简化日常的运维任务,实现快速部署和管理服务器,以及如何处理常见问题。无论你是运维新手还是希望提高工作效率的资深人士,这篇文章都将为你开启自动化运维的新篇章。
|
9天前
|
Java
【实战演练】JAVA网络编程高手养成记:URL与URLConnection的实战技巧,一学就会!
【实战演练】JAVA网络编程高手养成记:URL与URLConnection的实战技巧,一学就会!
21 3
|
10天前
|
Java API UED
【实战秘籍】Spring Boot开发者的福音:掌握网络防抖动,告别无效请求,提升用户体验!
【8月更文挑战第29天】网络防抖动技术能有效处理频繁触发的事件或请求,避免资源浪费,提升系统响应速度与用户体验。本文介绍如何在Spring Boot中实现防抖动,并提供代码示例。通过使用ScheduledExecutorService,可轻松实现延迟执行功能,确保仅在用户停止输入后才触发操作,大幅减少服务器负载。此外,还可利用`@Async`注解简化异步处理逻辑。防抖动是优化应用性能的关键策略,有助于打造高效稳定的软件系统。
24 2
|
5天前
|
SQL 安全 网络安全
网络安全之盾:漏洞防御与加密技术的实战应用
【9月更文挑战第2天】在数字时代的浪潮中,网络安全成为保护个人隐私和企业资产的坚固盾牌。本文深入探讨了网络安全的两个核心要素:防御漏洞和加密技术。我们将从基础概念入手,逐步剖析常见的网络攻击手段,并分享如何通过实践加强安全意识。同时,提供代码示例以增强理解,旨在为读者构建一道坚不可摧的网络安全防线。
|
7天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
25 0
|
7天前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
18 0
|
7天前
|
SQL 安全 网络安全
网络防御前线:漏洞识别与加密技术的实战应用
【8月更文挑战第31天】在数字化浪潮下,网络安全成为守护数据资产的盾牌。本文深入浅出地探讨了网络安全漏洞的成因与对策,并结合实例展示了加密技术的应用。通过提升安全意识与实践操作,我们能够有效防范网络威胁,保护个人与企业的信息不受侵害。
|
7天前
|
安全 Apache 数据安全/隐私保护
你的Wicket应用安全吗?揭秘在Apache Wicket中实现坚不可摧的安全认证策略
【8月更文挑战第31天】在当前的网络环境中,安全性是任何应用程序的关键考量。Apache Wicket 是一个强大的 Java Web 框架,提供了丰富的工具和组件,帮助开发者构建安全的 Web 应用程序。本文介绍了如何在 Wicket 中实现安全认证,
17 0
|
7天前
|
安全 算法 网络安全
网络安全之盾:漏洞防护与加密技术的实战解析
【8月更文挑战第31天】本文将通过浅显易懂的方式,带领读者了解网络安全的基石——漏洞防护和加密技术。我们将从基础概念入手,逐步深入到实际应用,不仅分享理论知识,更提供代码示例,帮助读者构建起自己的网络安全防线。无论你是初学者还是有一定基础的技术人员,这篇文章都将为你的安全知识库添砖加瓦。
下一篇
DDNS