技术开发 频道

Windows游戏:Silverlight3开发空当接龙

    【IT168 专稿】在本系列文章中,我们将编写一个Silverlight 3版本的空当接龙游戏。与前款纸牌游戏类似,编写这款游戏的主要目的仍然是为了探讨Siverlight 3游戏开发中鼠标有关功能的支持。同时,在本游戏中,你还将学习Siverlight 3新引入的定制行为编程知识。

  注意,空当接龙游戏的开发及测试环境与前面介绍的纸牌游戏完全一致。而且,为了简化讨论,我们假设读者已经阅读了前面的纸牌游戏系列文章。

  一、空当接龙游戏简介

  空当接龙游戏是Windows平台上一款极具吸引力的单人智力扑克游戏,老少皆宜。据说,大约99.99%的牌面布局都可以解开。

  游戏区由右上方四个回收单元,左上方四个可用单元和下部一副牌组成。游戏开始时,牌的正面朝上,排成八列,自左边起前四列各7张,后四列各6张。

  本游戏的目标是主要利用左上方可用单元和下面可能存在的空位为中转单元,将下部所有的纸牌都移到右上方回收单元中。如果能在回收单元中叠放四叠从A到K升序排列的、每叠只有一种花色的牌,就赢得此局。

  具体游戏规则有:

  (1)如要移动纸牌,请先单击这张牌,然后单击要移到的位置。

  (2)将牌移动到下部某一列时,必须按照从大(K)到小(A)的顺序移动,并且红黑花色交替。

  (3)将牌移动到回收单元时,必须按照从小(A)到大(K)的顺序移动,并且花色相同。

  (4)每列最上面那张牌可以移到中转单元、另一列的最下面或者回收单元中。

  (5)可用单元中的牌可以移到下部一列的最上面或回收单元中。

  (6)如果在某一列的底部按序排好了两张或多张牌,只要有足够的可用单元,就可以将这整个序列的牌移到另一列。要移动一个列,请单击要移动列的最上面一张,再单击要移到的目标列。

  (7)双击纸牌,可以将其快速移到可用单元(本游戏中未实现)。

  (8)在每次移牌后,空当接龙会将废牌自动送到回收单元。当游戏区中没有相反颜色的更小的牌时,这张牌即为废牌。

  二、类似于纸牌游戏的设计方案

  由于本游戏与纸牌游戏中采用了许多相类似的解决方案;所以,后面的讨论中进行了许多简化。

  (1)处理扑克的坐标问题

  为了简化问题,仍然使用Canvas控件作为所有扑克子控件的容器控件。主要调用Canvas类的GetLeft、GetTop、SetLeft、SetTop四个方法来控制扑克子控件的Left和Top属性,从而实现扑克的位置控制。

  (2)处理扑克控件的zIndex属性

  在空当接龙游戏中,我们仍然采用与纸牌游戏相同的策略来处理扑克控件的zIndex属性—主要通过调用GetZIndex和SetZIndex两个方法来调整被移动扑克的zIndex属性值。

  (3)使用Silverlight Menu菜单控件

  使用http://slmenu.codeplex.com/开源网站上提供的菜单控件。

  (4)鼠标相关事件

  乍看起来,在空当接龙游戏中涉及的鼠标相关事件要比纸牌游戏中简单,例如不再需要进行鼠标拖动操作—在本游戏中,我们主要操作两个鼠标事件MouseLeftButtonDown和MouseLeftButtonUp来确定哪一张扑克是当前扑克,哪一张扑克刚刚操作过的前面那张扑克。但是,事情并非想像得那么简单。有关鼠标事件编程,将在后文中详细讨论。

  (5)取消支持鼠标双击操作

  在原来Windows空当接龙游戏中,通过双击鼠标能够把下部扑克移动到左上方可用单元或右上方回收单元,从而加速了扑克移动操作。但是,在本游戏中我们引入了一个特殊行为—InverseColorClickBehavior,由它控制实现扑克的反色。由于此行为组件的内部实现了内置了一个MouseLeftButtonDown事件处理器,从而妨碍了我们在最外层的双击鼠标实现方案。

  基于上述原因,我们决定放弃对于双击鼠标的支持。有兴趣的读者可以考虑通过取消应用上面的反色行为组件InverseColorClickBehavior而选择其他适当的双击鼠标实现方案。

  (6)一个更新版本的GetCurrentCard方法

  读者应当记得在纸牌游戏中,我们不断通过调用GetCurrentCard方法来定位当前鼠标。在本游戏中,我们继续使用这个方法,但是进行了如下改进:

0
相关文章