Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#,代表,纸牌游戏_C#_Delegates_Event Handling_Playing Cards - Fatal编程技术网

c#,代表,纸牌游戏

c#,代表,纸牌游戏,c#,delegates,event-handling,playing-cards,C#,Delegates,Event Handling,Playing Cards,我将使用代理编写一个Black Jack游戏,据我的一个朋友说,您可以通过使用一个PlayerEventArgs:EventArgs类来完成此操作,该类将所有事件管理为draw and hold。怎么做 我可以从我的GUI类中创建一个引用上述类并调用PlayerEventArgs类中的方法的委托吗?或者我如何做到这一点 我是否应该在GUI类中有两个事件处理程序,例如:PlayerDrawEventHandler和PlayerHoldEventHandler public event EventH

我将使用代理编写一个Black Jack游戏,据我的一个朋友说,您可以通过使用一个PlayerEventArgs:EventArgs类来完成此操作,该类将所有事件管理为draw and hold。怎么做

我可以从我的GUI类中创建一个引用上述类并调用PlayerEventArgs类中的方法的委托吗?或者我如何做到这一点

我是否应该在GUI类中有两个事件处理程序,例如:PlayerDrawEventHandler和PlayerHoldEventHandler

public event EventHandler<PlayerEventArgs> PlayerTurnCardEventHandler;
公共事件事件处理程序PlayerTurnCardEventHandler;

是的,对于不同的操作,最好有两个不同的事件处理程序

将代码解耦

创建一个接口,比如定义了事件的IPlayer

它们创建一个实现IPlayer接口的播放器对象

创建一个manager类(在您的例子中是游戏引擎)创建
Player类并订阅事件。

您可以实现如下功能:

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
    { ... }
}
公共接口IMessage
{
}
公共类PlayerDraw:IMessage
{
公共AnyType参数{get;set;}
}
公共接口IMessageHandler,其中T:IMessage
{
无效句柄(T消息);
}
私有类消息处理程序:
IMessageHandler,
IMessageHandler
{
公共无效句柄(PlayerDraw消息)
{
//在这里使用你的信息;
}
公共无效句柄(PlayerHold消息)
{
//在这里使用你的信息;
}
...
}
公共类游戏管理器
{
专用只读词典_messageRoutes=
新字典();
公共无效注册表处理程序(操作处理程序),其中T:IMessage
{ ... }
公共无效发送(T消息),其中T:IMessage
{ ... }
}
现在,您需要一个注册消息处理程序的位置:

var messages = new MessageHandlers();
GameManager.RegisterHandler<PlayerDraw>(messages.Handle);
GameManager.RegisterHandler<PlayerHold>(messages.Handle);
var messages=newmessagehandlers();
GameManager.RegisterHandler(messages.Handle);
GameManager.RegisterHandler(messages.Handle);
并以以下方式使用您的机制:

GameManager.Send<PlayerDraw>(new PlayerDraw(Arguments))
GameManager.Send(新的PlayerDraw(参数))