葡京在线开户Silverlight+WCF 新手实例 象棋 该谁下棋-A下B停(二十八)

在线演示地址:Silverlight+WCF 新手实例 象棋
在线演示

在线演示地址:Silverlight+WCF 新手实例 象棋
在线演示

 

 

达平等节,我们落实了“开始”游戏,并互打招呼可以初步打了;可是咱们并没有对棋子进行限制,双方还得天天的下;

在Silverlight+WCF 新手实例 象棋
主界面-棋谱-回放(三十九)遭逢,我们兑现了用户的棋谱回放,在篇章的底下,我们既留下了片只问题:

从而,接下我们而兑现对棋子的限制,A下B停,B下A停,同时,要传递棋步,对方接收棋步,要倒转棋步坐标,还得自动移动棋子。

 

 

1:下棋者在博弈过程,要无设放“回放”功能,如果开,需要小心什么?

说了这样多,我们从哪里开着手吧?其实我为想了大遥远……

2:观众以回放过程被,突然同时传入一个棋步,需要留意啊?

让咱们回去Chess象棋类,于是添加一个性能IsCanMove

 

葡京在线开户 1葡京在线开户 2

 

//象棋类 by 路过秋天
public class Chess
{
        /// <summary>
        /// 是否足以移动棋子
        /// </summary>
        public bool IsCanMove
        {
            get;
            set;
        }

于解答这有限个问题之前,我们先行来解答上同首的截图中发觉的题材:

//…省略N多行…

不知发生无有人发现?图被生出三单“炮”或三只”马“,出现是问题的原由,

}

凡由在历次重置chess.Reset的上,我们从没消除棋子列表,造成了发生再的棋子。找到了原委,解决的法门就是相当之简练了,

 

设以chess象棋类里之确Reset方法里,添加一行棋子列表.clear方法清除下就算执行了,增加的只有首先执:

OK,属性有了,我们透过这个特性来决定是无是能够走棋子,接着我们返回棋子类Chessman点击事件里,加上限制,不克活动就无为点:

葡京在线开户 3葡京在线开户 4

葡京在线开户 5葡京在线开户 6

public void Reset()
{
   ChessmanList.Clear();//增加棋子列表清除
   container.Children.Clear();//棋盘和棋子一连清掉了
   InitBoard();//只好再开始棋盘了
   InitChessman();//只好再度开始棋子了
   IsCanMove = false;//设置状态不可知走了
   IsGaming = false;//这个险忘了
}

 //新加的波方,棋子点击事件
void chessman_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
            if (!Parent.IsCanMove)
            {
                return;
            }

 

//…下面省略N行…
}

哼了,一行代码解决了咱达成同一节隐藏在图纸被之bug。

 

 

出矣一个性能与一个限,轻轻松松几实施代码,就做定矣,接下的从,就是要控制什么时装IsCanMove的true或false了.

通下去,我们如果对准上节养的点滴只问题开一下解答了:

OK,让我们回到[上一节]点击”开始“的波里,找到收到”回复可以起“的代码里,既然可以开了,那这个特性将设置为true了。

咱们把题目逐项倒一下,先解答第二独问题吧:观众在回放过程被,突然同时传出一个棋步,需要注意什么?

咱们回来EventButton.xaml.cs代码里:

俺们当达到平等省,曾定义了一个全局变量:

葡京在线开户 7葡京在线开户 8

public static bool chessManualPlaying = false;//棋谱正回放着

void client_NotifyStartGameReceived(object sender, GameService.NotifyStartGameReceivedEventArgs e)
        {
            //收到信了应有咋办
            switch (e.player.AttachInfo)
            {
                //…省略N行代码…                    
                    case “11”:
                    MessageBox.Show(“对方同意开始玩,请开始下棋”, “游戏通知”, MessageBoxButton.OK);
                    btnGameStart.IsEnabled = false;
                    //这里装一下Chess.IsCanMove=true;
                    break;
            }
        }

 

 

假设达到省被,我不过说了后边会因此到[很后哦],所以,这节咱们而为此到了,因为是变量可以解答问题:

在押清楚罗,就当对方同意开始玩后,我们设设置为true,这样就足以下棋了,可是咱们的chess对象,在另外一个下棋区控件里,怎么传递信息?

我们设:当观众在回放棋步的进程中,棋手双方以匪鸣金收兵的博弈,不断的传递新的棋步过来;

我们在Silverlight+WCF 新手实例 象棋
主界面-控件消息传递(二十六)这节就开口了了,不清楚的回再探……

这时,我们唯有用处理的,只是不履行自动播放而已,至于写棋谱区文字及增长到棋谱列表的照常就实施了。

 

 

只是呢,这次我们转移另外一种办法来传递消息,毕竟是特性或者说chess类是个比较根本之类似,到处都或因此到,我们无可知随处委托人的,一不良点滴不良的嘱托人家就是到底了,件件事都来寄托人家便烦了,代码长了吧累。

用,我们只要做的事情虽是:开始广播时,设置App.chessManualPlaying为true;播放了晚,设置也false;

 

遂我们回去播放时之代码增加:

这就是说用啊法?还记得我们的player和client对象没?它们到处都得以天天用底。所以了,回到App.xmal.cs里,加多一个全局变量了:

葡京在线开户 9葡京在线开户 10

发无发出发现,最近己改换聪明了,经常性的简约以前的代码,来叫重要的代码变的复直观一点。

 private void PlayStep()
        {
            if (App.stepList.Count > 0)
            {
                //播放前复位棋子
                  App.chess.Reset();
                App.chessManualPlaying = true;//增加的一条龙
                timer.Interval = TimeSpan.FromSeconds(slPlayerInternal.Value);
                timer.Start();
            }
        }

葡京在线开户 11葡京在线开户 12

 

public partial class App : Application
{
        Grid root = new Grid();
        public static GameService.ServiceClient client;//回调的客户端
        public static GameService.Player player;//当前玩家
        public static ChessNewInstance.Chess chess;//象棋类,新长的
        public App()
        {
            //…省略…
        }
}

于是乎我们重回播放完毕时之代码增加:

 

葡京在线开户 13葡京在线开户 14

这时广州的圆在非停止的闪雷…

void timer_Tick(object sender, EventArgs e)
        {
            //…省略N行…
           if (moveStepIndex == App.stepList.Count)//棋步结束
            {
                moveStepIndex = 0;//重置索引
                  timer.Stop();//停止timer
                App.chessManualPlaying = false;//增加的一行
            }
        }

 

 

OK,全局也发生了,那在哪里也是大局赋值,总不能够用一个Null对象到到调整吧。

标识位加完了,我们回来设置自动移动棋步的地方,加判断,如果播放着,切断棋步自动移动:

为此,我们回来Chess.xaml.cs里,在实例化Chess的地方,为这个全局与一下价:

收下棋步的通告在Chess.xaml.cs里,我们无非待丰富半行代码[下面的!App.chessManualPlaying]:

代码较短,就满门Copy进来:

葡京在线开户 15葡京在线开户 16

葡京在线开户 17葡京在线开户 18

void client_NotifyMoveStepReceived(object sender, NotifyMoveStepReceivedEventArgs e)
        {
            App.stepList.Add(e.player.Step);//添加棋步
            if (!App.chessManualPlaying && App.player.ID != e.player.ID)//非棋步播放着,非友好
            {
              //…省不怎么棋步移动相关代码…
             }
            HelpSetChessManualEvent(e.player.Step);//写棋谱区
        }

public partial class Chess : UserControl
    {
       ChessNewInstance.Chess chess;//这里我们又将它们关系全局对象
        public Chess()
        {
            InitializeComponent();
            chess = new ChessNewInstance.Chess(canvasRoot);
            chess.InitBoard();
            chess.InitChessman();
            canvasRoot.Width = chess.Board.Width;
            canvasRoot.Height = chess.Board.Height;
            App.chess = chess;//为大局对象赋值
        }
    }

 

 

其次独问题,至此就缓解了,总共加加了2.5履行代码。

漫天就绪,现在得到处用App.chess对象了,于是我们头回路转至EventButton.xaml.cs里,只为加一行代码:

 

葡京在线开户 19葡京在线开户 20

今日退回第一独问题了:下棋者在博弈过程,要无若放“回放”功能,如果开,需要留意啊?

void client_NotifyStartGameReceived(object sender, GameService.NotifyStartGameReceivedEventArgs e)
        {
            //收到信息了应有咋办
            switch (e.player.AttachInfo)
            {
                //…还是省略N行…

免开:只需要拿“回放”按钮启用状态设置也false就实施了;

                case “11”:
                    MessageBox.Show(“对方同意开始玩,请开始下棋”, “游戏通知”, MessageBoxButton.OK);
                    btnGameStart.IsEnabled = false;
                    App.chess.IsCanMove=true;//这里设置一下,就加这无异实施
                    break;
            }
        }

盛开:其实也容易:我们如果限制在播音过程中,不叫棋手下棋就执行了,

 

而且棋手播放过程为会见发出首先单问题:不过,我们刚刚已经缓解,加的代码对一把手也是一律有效。

 

 

OK,到此,我们可以F5一下看一下意义,又比方起来截图了:

怎样限棋手不给下棋,其实生简短了,chess.IsCanMove属性就会限制了,只要播放时,设置也false,播放了,设置回原值就尽了;

俺们精心看一下贪图,看一下会话哦:

凡勿是觉得和第一只问题太相像了?动手吧,还是播放开始跟得了,只不过,也只要增一个变量,来存棋手的对弈状态:

葡京在线开户 21

追加一行全局变量:

棋子区的觊觎就是不弯截了,细看一下对话区,由于我们仅仅兑现了同等片段,A可以下,B停。所以时永久是这状态,A可以直接下,B一直信停。

葡京在线开户 22葡京在线开户 23

以此状态我们只要留到下节来处理状态,如果细看,还见面发觉,双方头顶上都是黑色棋子,也就是说双方为此底且是新民主主义革命棋???

 public partial class ChessManual : UserControl
    {
       //…省略2行代码…
        bool tempIsCanMove;//保存棋手之前的状态
        public ChessManual()
        {
            //…省略N行代码…

夫嘛,我们为别开小节来讲解罗。

        }
       //…省略N行代码…
   }

 

播音时,先取状态,再装IsCanMove=false[马上句以Reset重置里曾经发出了,可以省了];

葡京在线开户 24葡京在线开户 25

 private void PlayStep()
        {
            if (App.stepList.Count > 0)
            {
                //播放前复位棋子
                tempIsCanMove = App.chess.IsCanMove;//先存之前状态
                App.chess.Reset();//重置状态时会设置IsCanMove=false,所以无用写多一行
                App.chessManualPlaying = true;
                timer.Interval = TimeSpan.FromSeconds(slPlayerInternal.Value);
                timer.Start();
            }
        }

 

继播放了时,状态设置回来[说到底一行代码]:

葡京在线开户 26葡京在线开户 27

void timer_Tick(object sender, EventArgs e)
        {
            //…省略N行代码…
            if (moveStepIndex == App.stepList.Count)//判断棋步结束无
            {
                moveStepIndex = 0;//重置索引
                timer.Stop();//停止timer
                App.chessManualPlaying = false;
                App.chess.IsCanMove = tempIsCanMove;//增加的一行
            }
        }

 

 

OK,至此,我们之所以了同样的道,解决了上节的少单问题,接下去并且至F5的showtime时间:

正常,上图,这下棋步回放是常规的了:

1:棋手正下棋不久:

葡京在线开户 28

 

2:观众进了,播放了棋步,定位及实时状态:

葡京在线开户 29

 

3:观众想看下棋过程,开始“回放”棋步:

葡京在线开户 30

 

4:“回放”到第三步棋中:

葡京在线开户 31

 

5:回放到第五步棋中:

葡京在线开户 32

 

OK,截图及就是顶这矣,本系列文章,一不小心就形容了40节省了,在当下一系列之40节里,所有力量就全然的开放源码并主讲了了!

 

 

生趣味之读者欢迎关注本系列文章,明天铺面以如搬家了,本系列有没有发出持续文章,目前状况不明……

 

顺路履新下索引:Silverlight+WCF 新手实例 象棋
专题索引