c#,代表,纸牌游戏

时间:2011-11-18 10:12:53

标签: c# delegates event-handling playing-cards

我将使用代表写一个黑杰克游戏,据我的一个朋友说,你可以通过一个PlayerEventArgs:EventArgs类来管理所有事件作为绘制和保持来实现这一点。怎么样?

我可以从我的GUI类创建一个引用上面的类的委托,并调用PlayerEventArgs类中的方法或者我该怎么做?

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

public event EventHandler<PlayerEventArgs> PlayerTurnCardEventHandler;

2 个答案:

答案 0 :(得分:1)

是的,为不同的操作提供两个不同的事件处理程序是很好的。

解密你的代码。

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

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

创建一个经理类(在你的情况下是游戏的引擎)创建一个实例 玩家类并订阅活动。

答案 1 :(得分: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))