永利最大(官方)网站

用 Silverlight 开发围棋在线对弈程序(二)MVC

转帖|其它|编辑:郝浩|2009-03-31 09:46:53.000|阅读 406 次

概述:如何在 Silverlight下创建,开发图形棋盘问题。

#慧都22周年庆大促·界面/图表报表/文档/IDE/IOT/测试等千款热门软控件火热促销中>>

Silverlight 开发围棋在线对弈程序

作者: Neil Chen

第二部分:MVC

为了重用代码,并且开始开发围棋程序的界面控制功能,我们考虑用 MVC 架构来对前面的程序进行一点小的修改,这样方便扩展功能。

首先需要引入几个枚举,以及帮助类:
wq2.png

设计完成之后,我们的 Model, View, Controller 的类图如下:
wq3.png

程序的执行是从  App.xaml.cs 中开始的:

              private void Application_Startup(object sender, StartupEventArgs e)

              {

                     var model = new WeiQiModel();

                     var controller = new WeiQiController(model);

              }

这里创建了 Model Controller 对象,然后在 Controller 的构造函数中,将执行 View 的初始化动作,并将生成的 UserControl 对象赋给 Application.Current.RootVisual,从而达到显示 View 的目的。代码如下:

       public class WeiQiController

       {

              WeiQiView _view;

              WeiQiModel _model;

 

           ;   public WeiQiController(WeiQiModel model)

  ;  ;          {

                     _model = model;

                     _view = new WeiQiView(this, model);

                     _view.CreateView();              

 

                     Application.Current.RootVisual = _view;

 

              ;       model.Init();

              }

}

再来看一下 View 的构造函数,在其中,我们对 Model 的一个事件进行了注册。这样,当 Model 中的数据有变化时,可以直接通知 UI 进行更新。

       public partial class WeiQiView : UserControl

       {

              WeiQiController _controller = null;

              WeiQiModel _model = null;

 

              public WeiQiView(WeiQiController controller, WeiQiModel model)

              {

                     _controller = controller;

                     _model = model;

 

                     // 订阅 model 的更新事件以获得 UI 更新的通知

        &nbsp;            _model.BoardUpdated += new EventHandler<BoardUpdateEventArgs>(_model_BoardUpdated);

            &nbsp; }

       }

View 在响应鼠标点击事件时,进行必要的坐标转换,然后将请求转发给 Controller 处理:

         &nbsp; ;   // 棋盘上的鼠标点击事件

              void canvasBoard_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

    &nbsp;         {

          &nbsp;          var p = e.GetPosition(canvasBoard);

           &nbsp;        

&nbsp;                     // 转换绝对坐标为相对位置信息

        &nbsp;            Position pos;

 

           &nbsp;   ;      pos.X = (int)Math.Round(p.X / cellSize);

                     pos.Y = (int)Math.Round(p.Y / cellSize);

 

        &nbsp;            // 调用 Controller

         ;   ;         _controller.ClickOnBoard(pos);

             ; }

另一个转发的例子:

     &nbsp;      &nbsp; void btnGo_Click(object sender, RoutedEventArgs e)

     ;  &nbsp;      {

&nbsp;                    // 游戏开始

                     _controller.DealCommand("Start");

&nbsp;             }

看一下 Controller 中这两个方法的实现:

&nbsp;             // 在棋盘上某个位置点击

           &nbsp;  public void ClickOnBoard(Position pos)

       &nbsp;      {

           ;          if (_model.GameStatus != GameStatus.Started)

                      &nbsp;    return;

 

         &nbsp;&nbsp;          _model.SetStone(pos);

         &nbsp;    }

 

     &nbsp; &nbsp;      // 处理命令

    &nbsp;         public void DealCommand(string command)

    &nbsp;    &nbsp;    {

        &nbsp;            if (command == "Start")

     &nbsp;&nbsp;              {

&nbsp;                          _model.GameStatus = GameStatus.Started;

&nbsp;        &nbsp;           }

     &nbsp;        }

可以看到, Controller 调用了 Model 的相应核心逻辑进行处理。而 Model 中目前仅实现了简单的下棋规则判断,还有一些复杂的规则需要继续补充进去。如下列实现:

      &nbsp;       // 判断某个点是否能落子

         &nbsp;    //

         ;     // 在如下情况下,可能会导致落子失败:

 &nbsp; &nbsp;          //     &nbsp;&nbsp;     1. 坐标出界

        &nbsp;     //   &nbsp;         2. 该位置已有棋子

       &nbsp;      //      &nbsp;     3. 打劫,没有找劫材就提劫。

          &nbsp;   //            4. 属于自杀,并且不能提取对方的棋子。

            &nbsp; private bool CanMove(Stone stone, int x, int y)

         ;     {

    ;                 // 1. 坐标出界

      &nbsp;              if (!CheckPosition(x, y))

                      &nbsp;    return false;

 

&nbsp;     &nbsp;              // 2. 该位置已有棋子

         &nbsp;           if (GetStone(x, y) != Stone.None)

     &nbsp;                ;     return false;

 

      &nbsp;               // 3. 打劫判断

 

      ;        ;       // 4. 自杀判断

 

                &nbsp;    // TODO...

 

 

              ;  &nbsp;    return true;

     &nbsp;        }

到目前为止,程序显示如下:
wq4.png

其他实现细节看代码,这里不列举了。

代码下载:[v0.03]


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@hmdbvip.cn

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP
PM娱乐城网络现金网站(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) PM娱乐城最大(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 永利外围最新(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 网络权威朗驰娱乐大全(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 永利真人网上足球(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 利记最火十大网(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) boyu·博鱼权威网络足球(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) PM娱乐城网上足球(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新)