2011-11-18 93 views
0

我要用代表写一个黑杰克游戏,根据我的一位朋友的介绍,你可以通过让一个PlayerEventArgs:EventArgs类来管理所有事件为draw和hold。怎么样?c#,代表,纸牌游戏

我可以从我的GUI类创建一个委托,它引用上面的类并调用PlayerEventArgs类中的方法,或者如何执行此操作?

我应该有两个EventHandlers,例如:GUI类中的PlayerDrawEventHandler和PlayerHoldEventHandler?

public event EventHandler<PlayerEventArgs> PlayerTurnCardEventHandler; 

回答

1

是的,对于不同的动作有两个不同的事件处理程序是很好的。

解耦您的代码。

创建一个接口,就像在其中定义事件的IPlayer一样。

他们创建一个实现IPlayer接口的Player对象。

创建一个经理类(在您的情况下,游戏引擎)创建一个 Player类的实例并订阅事件。

1

您可以实现这样的事情:

public interface IMessage 
{ 
} 

public class PlayerDraw: IMessage 
{ 
    public AnyType Arguments { get; set; } 
} 

public interface IMessageHandler<T> where T: IMessage 
{ 
    void Handle(T message); 
} 

private class MessageHandlers: 
    IMessageHandler<PlayerDraw>, 
    IMessageHandler<PlayerHold> 
{ 
    public void Handle(PlayerDraw message) 
    { 
     // Use your message here; 
    } 

    public void Handle(PlayerHold message) 
    { 
     // Use your message here; 
    } 

    ... 
} 

public class GameManager 
{ 
    private readonly Dictionary<Type, Action<IMessage>> _messageRoutes = 
     new Dictionary<Type, Action<IMessage>>(); 

    public void RegisterHandler<T>(Action<T> handler) where T : IMessage 
    { ... } 

    public void Send<T>(T message) where T : IMessage 
    { ... } 
} 

现在你需要一个地方来注册你的消息处理程序:

var messages = new MessageHandlers(); 
GameManager.RegisterHandler<PlayerDraw>(messages.Handle); 
GameManager.RegisterHandler<PlayerHold>(messages.Handle); 

和使用您的机制这样的方式:

GameManager.Send<PlayerDraw>(new PlayerDraw(Arguments))