使用过Windows 98的用户对其自带的纸牌游戏一定不会陌生,在您的鼠标点击、拖动等操作之下,扑克牌上下翻飞、腾挪组合;在您不经意的操作中,其实您已经触发了一系列预设事件,这些事件过程的响应最终让您体会到成功的喜悦和失败的痛苦。但您想不想体会一下借助于某种开发工具自己去编程实现的感觉呢,充分体会Delphi的事件驱动机制,这将是另外一番享受,并且理解了事件驱动机制后,再作其他更深层次的开发,这样您会变得更加得心应手。
一、单张牌的实现
Delphi编程环境中提供了图形按钮控件,设计时采用了一个按钮就是一张牌,我们可以将选定的图形(如BMP图形,大小合适)作为其背面和前面。在Delphi中,图形的装入显示的方法为:
图形按钮.glyph.loadfromfile('图形文件路径+文件名')
在设计中可以事先准备52张扑克正面图形和几张背景图形,用控件(控件数组)动态生成的方法(Create(Self))逐一调用。
二、关于图形按钮
在游戏中要对扑克牌进行正确的操作还要借助在其图形按钮上增加几个属性(如图1)
图1
HS:标识一张牌的花色(方块、黑桃、红心或梅花)。
DS:标识一张牌的点数(1-13即A-K)。
HB:标识一张牌的黑色和红色。
Over:标识本张牌上面是否有牌压着。
Look:标识本张牌的正面或背面。
Area:指定本张牌的操作区域,在设计中将各操作区定义为如图2所示各操作区。
发牌源区(Source):即左上角两叠牌。
回归区(Home):即右上角四门回收处。
操作拖放区(Operate):即下排(7叠)主要拖放区。
PTR属性:用于支持多张扑克牌的拖动操作,为一指针,指向单张牌。笔者用此属性来实现一叠牌的拉单向链表。也可以再加一属性拉双向链表方便操作。
三、扑克牌的操作
扑克牌的操作多数是通过Delphi提供的事件驱动编程实现的,开始一个拖动牌操作:Delphi是从OnMouseDown事件开始。请参考OnMouseDown模块。
接受/拒绝被拖动的牌:这里由OnDragOver事件决定,要接受被拖动的牌,必须把图形按钮的Accept属性设为TRUE。
释放处理被拖动的牌:这里由EndDrag和DragDrop事件被激发来处理,这里选用了DragDrop事件来处理,因为该事件只有当DragOver事件的Accept设为TRUE时,只有这个事件被激发。
图2
另外,扑克牌的位置改动是通过Top和Left属性实现的。
这里在设计时,52个控件共享Click、OnMouseDown、OnDragOver、OnDragDrop事件。
在运行时是动态赋予的。程序中如下例赋予事件代码:
Mainpk[i].OnMouseDown:=pk1mousedown;
Mainpk[i].OnDragOver:=pk1DragOver;
Mainpk[i].OnDragDrop:=pk1Dragdrop;
Mainpk[i].OnClick:=pk1Click;
四、程序的实现
程序开始时先动态生成52张牌(图形按钮),赋予花色、点数、正面图形等,接着利用Delphi提供的随机函数RANDOM(), 将52张牌次序打乱,完成洗牌。接着开始发牌,动态赋予事件代码。之后由接受用户选择进入游戏,游戏处理过程实际上就是相应事件代码在运作。
游戏调试通过后,笔者还查阅了其他相关资料,有的系统还提供了专门的关于扑克牌方面类库或API函数供程序员直接调用,减少了程序员的设计复杂性,有兴趣的读者也可以不妨一试。
|