我在试着学写三国杀那样游戏中,玩家自己窗体的消息机制,大致是这样的要求:玩家会首先选择自己要干什么(几个按钮让玩家主动选择了自己的行为,或者是游戏中其他玩家所为触发的),这会置玩家于特定情况下,需要打出一张特定的牌,否则会触发别的状况。这个时候需要出的牌会亮起,其他不需要/不能出的牌变灰色,已经点选的牌会高亮。我的牌有三种状态,就是不亮,亮起,和高亮,对应上面说的不同状态。牌Card,这个类别里面有个private JButton variable,这个JButton会在玩家的手牌界面里显示,玩家一旦点击一个已经亮起(可以点击的)JButton类别的图片,牌Card就会改变状态为高亮(已点击),并且会有消息发送。
手牌界面的旁边,有一个“确定”和一个“取消”按钮。一个情景便是:比如现在系统提示需要同时打出两张黑桃牌,不然我就会扣血(之类的负面状况)。我点击“取消”,就会直接放弃,扣血。“确定”现在是灰色的,不能点击,只有我选定两张黑桃牌,两张黑桃牌高亮(被选定)之后,“确定”才会高亮。然后我点“确定”才算相应了提示。如果我选择了一张黑桃而发现自己没有第二张的时候,我仍然可以选择"取消",也会直接放弃,扣血.我的问题是两个:一。我现在的想法是,在玩家界面View里面加几个牌Card的变量,required1, required2.....,并且View实现Observer,Card继承Observable。手牌中的Card会和玩家的View建立联系,addObserver,这样Card就可以把消息发回View。然后每次玩家点了一张亮起的卡,卡变为高亮,消息传回View, required1 被设置为被传回的卡。然后我需要点击第二章需要的牌(像刚才那个情况中,我需要出2张黑桃),同理,消息传回View, required2被设置为被传回的卡,这个时候检测到满足条件,“确定”按钮被被触发。
我不知道这个想法对不对,尤其是该不该用Observer,和Observable,还有没有更好的办法,请各位高手指教。谢谢!二。因为游戏中会有很多很多种情况,各种情况会要求玩家出不同的牌,要求特定的牌类(Class对象)/牌名(String)/数字(int)/花色(int), 我的问题是,如果我每种要求都写,会浪费很多时间,似乎这个就叫泛型吧,我初学,不很懂,谁能给我个例子呢,让我4个method,用不同参数,就可以完成所有的要求呢??非常感谢! 分不多,再次感谢!

解决方案 »

  1.   

    http://hi.baidu.com/dizemmm/blog/item/4c6213eca7280dc62e2e2130.html/cmtid/2d95bf2a3c8d8722d52af135
    LZ你看看这个呢
      

  2.   

    我觉得你可以将需要出某些牌的各种事件进行分类,
    即同样都是“事件类”,但是其中某个属性不一样以区分不同事件
    然后服务器端把这个消息发给需要进行出牌判断的那个客户端客户端收到这个消息后,进入判断流程
    然后 UI 上的点击允许等情况全在客户端进行判断
    可以给在点击 card 时调用一个方法去判断及计算以下一些东西:
    1、当前已选中的卡(可能为多张)
    2、根据不同的事件类型,判断已选中的卡是否满足当前要求
    最后,客户端只要返回给服务器端一个“取消”或“确定”的消息就行了
    当然消息中要包含所选卡牌等等属性
    然后服务器端根据这个选择,进行后续结算不要频繁的和服务器端交互
    至于卡牌我觉得也不要分那么多不同的类
    就算要分,他们也应该有一个共同的父类
    父类中应该包含卡牌的:
    1、花色
    2、点数
    3、名称
    4、大类别(如基本牌、锦囊、装备等)
    5、小类别(如“杀”、“闪”、“桃”、“延时锦囊”、“非延时锦囊”、“武器”、“防具”、“+1”、“-1”等)
    等等属性
      

  3.   


    我的牌是按照你后面说的这个分类分的。我把花色/点数作为了每张牌的变量你前面说的这些,我觉得很受启发啊:
    “我觉得你可以将需要出某些牌的各种事件进行分类,
    即同样都是“事件类”,但是其中某个属性不一样以区分不同事件
    然后服务器端把这个消息发给需要进行出牌判断的那个客户端” 我现在想的是直接在服务器和客户端建立socket,服务器发送string, 用几个字节就讲明要求什么牌(因为总共也就4花色,13个点数,还有就是那几个大类别,我估计一个字节绰绰有余把)。客户端再用几个字节的说明客户打出的牌的花色/点数/名称/类别等等。 
    我有点担忧就是这样做似乎不是以对象为向导的,但是说实话哈,我新手不知道socket要怎样才能传对象哈,呵呵。谢谢你的指导!