Silverlight实现的纸牌(完成)

本文介绍了使用Silverlight开发扑克游戏的过程,包括增加图片效果、实现拖动功能及面向对象的设计思路。作者通过调整图片的圆角和阴影效果提高了游戏画面的表现力,并详细解释了如何在不同的容器中保持牌的位置一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 前言

    上次急切的想看看自己写的Silverlight程序放在日志上是什么样子的,所以放了一个半成品上去。但是突然发现自己好像不知道怎么把Silverlight插入到日志中,只是见到别人这么干过。自己又对Html,JS这类东西不怎么了解,还好找到了博客园的一位高人“菩提树下的杨过”的方法,照搬上来,果然好用。先谢过。

    本人不才,做的这个东西没有用什么NB的技术和高深的思想,只是完全本着面向对象的基本思想然后很认真很认真的一点点写出来的。所以高手请直接无视,新人可以选择性的看看,只是不要被我误导了就好。这算是我在博客园的第一个帖子,谢大家捧场。

    对上次的半成品添加了一些加强和修正。现放出一个较完整的版本,有源码可下载。下面介绍一些我觉得可以说一说的东西。

1. 增加图片效果

    首先是看看扑克牌的图片,我从网上总算是搜寻出了一个一套54张的图片。但是质量不行,每张牌都是四四方方的,切割也很粗糙,看上去就很死板。只能是这样的图片效果的话,我可就没兴趣做下去了,但是又找不到其他更好的图片了,只能在显示的时候用一些小手段了。主要是两个手段:圆角+阴影。

代码如下

代码

   
_ForeImage = new Image()
{
// 设定Source(其实就是那些很粗糙的图片了)
Source = CardGameLib.CardImageLib.GetCardBitmap(cv),
Width
= 80 ,
Height
= 123 ,
// 切割成圆角矩形
Clip = new RectangleGeometry() { RadiusX = 4 , RadiusY = 4 , Rect = new Rect( 0 , 0 , 80 , 123 ) },
// 阴影效果(ShadowDepth=0是为了让四周的阴影一样,看个人喜好了)
Effect = new DropShadowEffect() { Opacity = 0.6 , BlurRadius = 3 , ShadowDepth = 0 }
};

 

看看对比效果

原图效果

使用手段后

image_thumb[1] image3_thumb[1]

恩,帅多了。

2. 拖动

     拖动本来就是一个很简单的东西,无非就是处理MouseLeftbuttonDown, MouseMove, MouseLeftButtonUp,这三个事件就行了。

     但是在这里面我的设计是桌面上的牌堆是放在Grid容器中的,为了方便自动布局。但是拖动的时候,我是将要拖动的扑克牌移到了Grid上面覆盖的一个Canvas容器中的,方便随时定位。但是这样就有一个问题了:我在把牌从Grid中移到Canvas中的时候(即MouseLeftButtonDown的时候),怎么保证他们的位置是一致的呢(即看上去位置没有变化)?毕竟他们的定位方式不同,而且可能两个容器的相对位置是不一定的。

     幸运的是鼠标事件参数e很强大,可以直接e.GetPosition(**)来获得鼠标相对与某个控件的位置。这样的话,在把牌移到Canvas里面之前,我们可以先得到鼠标相对与牌的位置pos1,然后在得到鼠标相对于Canvas的位置pos2,这样,用鼠标做参考,pos2-pos1就可以得到牌相对与Canvas的位置了。然后将牌从Grid中remove掉,add进Canvas,再Canvas.SetLeft, Canvas.SetTop,问题解决。

代码如下:

代码

   
// 获取鼠标相对与牌的位置
Point tmpP1 = e.GetPosition(theCard);

// 获取鼠标相对与Canvas的位置
Point tmpP2 = e.GetPosition( this .DragCanvas);
// 想减,得到牌相对与Canvas的位置
Point tmpP3 = new Point(tmpP2.X - tmpP1.X, tmpP2.Y - tmpP1.Y);
// 把牌从Grid中移到Canvas中(这里注意,如果有Margin值的需要清掉)
ContentGrid.Children.Remove(theCard);
DragCanvas.Children.Add(theCard);
// 设定初始位置
Canvas.SetLeft(MoveStack, tmpP3.X);
Canvas.SetTop(MoveStack, tmpP3.Y);

 

3. 对象

    纸牌这个游戏很简单,如果只是想写出来这个程序,可能并不需要那么严格的面向对象,封装的思想。但是学习不是完成任务,而且为了代码思路更加清晰,为了使程序有更大的扩展性,我就尽量的“面向对象”了(也不知道我理解的面向对象对不对)。下面说一下该程序中的类,和代码结构。

image6_thumb

    第一个工程是一个SilverlightClassLibrary。里面定义了这些类

Card扑克牌(继承UserControl)
CardImageLib扑克牌图片管理类
可以从中取出各张牌的Bitmapimage
CardStackBase牌堆的基类,定义的一些基本操作和属性
Contact这不是类名,里面定义了一个牌面值的枚举类型CardValue
EnumHelper枚举类型功能扩展(Silverlight比Wpf少了好多东西)

    第二个工程就是Silverlight程序了。先说一下牌堆的概念,游戏中会有多个地方可以放置扑克牌,统称为牌堆,这些地方规则和功能都不相同,但是有一些共同的性质和操作。于是就有了牌堆基类CardstackBase,和他的几个子类了。

image14 

    第二个工程里面定义的这些类如上图所示,其中CardMoveStack是拖动中的牌堆的意思。他们都继承CardStackBase并自己定义了一些特殊的功能。

    对于CardImageLib存在的意义,一是便于管理图片(废话)。二是,游戏里面可能会用到同一张图片很多次,如果每次都去new一个BitmapImage,必然会浪费资源。多个Image公用一个BitmapImage是可以的,所以CardImageLib里面就在程序一开始就new了54张牌的BitmapImage,然后就不在new了,以后外面有需要,就直接传引用出去。这样应该会比较好。

 

好了,就这样,上示例和源码。


在线演示

源代码

转载于:https://www.cnblogs.com/hehongbo/archive/2010/08/02/1790763.html

内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
内容概要:该论文针对新型电力系统中非线性负荷和分布式电源接入导致的电能质量扰动识别难题,提出了一种结合优化广义S变换(OGST)和混合输入神经网络的方法。OGST通过自适应选取高斯窗函数参数保留扰动信号的幅值和频率特征;混合输入神经网络分别处理原始时间序列和时频矩阵,融合两种特征后识别扰动类型。实验表明,该方法在26种扰动类型的仿真数据上识别准确率达99.77%,在实际电网信号上达到92.5%,优于传统单一输入神经网络。论文还提供了详细的代码实现,包括优化广义S变换、电能质量扰动信号生成、混合输入神经网络模型构建及训练流程。 适合人群:具备一定编程基础,特别是对电能质量监测、信号处理和深度学习感兴趣的工程师和研究人员。 使用场景及目标:①适用于电力系统中的电能质量监测,特别是智能变电站和新能源电站的并网检测;②通过OGST和混合输入神经网络,提高对复杂电能质量扰动的识别准确率和鲁棒性;③支持实时处理和边缘计算部署,满足工业场景的实时性和资源限制要求。 其他说明:该方法不仅在理论上创新,而且在实际应用中表现出色。通过参数优化和混合输入架构,能够有效应对不同类型的电能质量扰动。此外,论文还提供了完整的代码实现和实验验证,便于读者复现实验结果并应用于实际项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值