=.=写得杀人游戏(可行性尚待验证)

服务器组件暴露IKillServer接口,该接口有下列方法
1.GetUserInfo     取得指定用户的信息
2.GetTowns     取得已注册城镇列表
3.RegeisterTown    注册城镇
4.UnRegisterTown    注销城镇
5.UpdateTownInfo    更改城镇信息
6.RewardsPublish    告知结果
7.GetJusticerInfo    取得法官列表
8.GetJusticer     下载法官dll

//1.GetUserInfo
HRESULT GetUserInfo([in] LogInfo li,[in]WCHAR username[16],[out]UserInfo* pui);
说明:取得用户资料
参数:
 li:登陆信息
 username:目标用户的用户名
 pui:接收缓冲区
返回值:
 S_OK:成功
 E_LOGINFAIL:登陆失败
 E_NOUSER:用户不存在
备注:UserInfo结构如下
typedef struct tagUserInfo {
 WCHAR  username[16];
 int  score;
 int  level;
} UserInfo;

//2.GetTowns
HRESULT GetTowns([in] LogInfo li, [in] int cMax, [out] int *pLength,
  [out,size_is(cMax),length_is(*pLength)] TownInfo* pti);
说明:该方法从服务器取得已注册城镇列表。
参数:
 li:登陆信息。
 cMax:缓冲区能包容的城镇最大数目
 pLength:实际城镇数目
 pti:接受城镇信息数组的缓冲区
返回值:
 S_OK:成功获取城镇信息
 E_LOGINFAIL:登陆失败
 E_OUTOFBUFFER:缓冲区容量不够
备注:
1.缓冲区容量不够的时候,得不到所有的城镇信息,但缓冲区应当被充满。也就是说,应当返回缓冲区容量数目的城镇信息。
2.LogInfo 与 TownInfo结构定义如下:
typedef struct tagLogInfo {
 WCHAR username[16]; //用户名
 WCHAR password[16]; //密码
} LogInfo;
typedef struct tagTownInfo {
 WCHAR townname[16]; //镇名
 WCHAR alcalde[16]; //镇长
 WCHAR justicer[16]; //法官
 WCHAR description[512]; //描述
 UINT ip;  //镇所在的ip地址
 BYTE bLocked; //是否有密码
 BYTE bInGame; //是否游戏中
} TownInfo;
其中WCHAR是UNICODE字符: typedef wchar_t WCHAR;
UINT是32位无符号整数:typedef unsigned int UINT;
//3.RegisterTown
HRESULT RegisterTown([in] LogInfo li, [in] TownInfo ti,[out]ITownToPlayer** ppTown);
说明:在服务器上注册城镇信息,以便玩家获得。
参数:
 li:登陆信息
 ti:城镇信息
 ppTown:如果在服务器上创建城镇,该参数返回创建的城镇的接口指针。否则返回NULL;
返回值:
 S_OK:成功注册
 E_LOGINFAIL:登陆失败
 E_INAVAILABLETOWN:无效城镇
 E_TOWNNAMEEXIST:城镇名已存在
 E_USERREGISTERED:用户已注册城镇
 E_NOTCREATETOWN:不能在服务器端创建城镇
备注:
1.镇长名ti.alcalde必须和用户名li.username一致。若不一致,或者拒绝服务,或者忽略ti.alcalde.
2.如果ip不为0,则仅在服务器上注册城镇信息。否则在服务器上创建城镇并注册。
3.一个用户在同一时刻只能注册一个城镇。
//4.UpdateTownInfo
HRESULT UpdateTownInfo([in] LogInfo li, [in] TownInfo ti);
说明:更新城镇注册信息
参数:
 li:登陆信息
 ti: 城镇信息
返回值:
 S_OK: 更新成功
 E_LOGINFAIL:登陆失败
 E_TOWNNOTEXIST:城镇不存在
备注:
1.镇长名ti.alcalde必须和用户名li.username一致。若不一致,或者拒绝服务,或者忽略ti.alcalde.
2.ti.ip无效
//5.UnregisterTown
HRESULT UnregisterTown([in] LogInfo li);
说明:注销城镇。如果城镇在服务器机器上,该服务器被销毁。
参数:
 li:用户信息
返回值:
 S_OK:成功注销
 E_LOGINFAIL:登陆失败
 E_TOWNNOTEXIST: 用户没有注册城镇
//6.RewardPublish
HRESULT RewardsPublish([in]LogInfo li,[in]cLength,[in,size_is(cLength)] ResultInfo* pri);
说明:向服务器传送结果信息
参数:
 li:用户信息
 cLength:结果信息的数量
 pri:结果信息数组
返回值:
 S_OK:成功传送
 
备注:
1.ResultInfo 结构如下
typedef struct tagResultInfo {
 WCHAR username[16];  //用户名
 WCHAR role[16];  //用户在游戏中扮演的角色
 int bWin;   //胜利还是失败
} ResultInfo;
//7.GetJusticerInfo
HRESULT GetJusticerInfo([in]LogInfo li,[in]int cMax,[out]int* pLength,
 [out,size_is(cMax),length_is(*pLength)]JusticerInfo* pji);
说明:取得服务器上的法官信息列表
参数:
 li: 用户信息
 cMax: 接受缓冲区的最大容量
 pLength 实际返回的法官信息数量
 pji: 接受缓冲区指针
返回值:
 S_OK:取得成功
 E_LOGINFAIL:登陆失败
 E_OUTOFBUFFER:缓冲区容量不够
备注:JusticerInfo结构如下
typedef struct tagJusticerInfo {
 WCHAR justicer[16];  //法官名
 WCHAR description[512]; //法官描述
 int size;   //法官dll的大小
};
//8.GetJusticer
HRESULT GetJusticer([in] LogInfo li, [in,size_is(16)]WCHAR* justicer,
 [in]int cMax, [out,size_is(cMax)]byte* buffer);
说明:取得法官dll
参数:
 li:  用户信息
 justicer: 法官名
 cMax:  接收缓冲区字节数
 buffer:  接受缓冲区指针
返回值:
 S_OK:成功
 E_LOGINFAIL:登陆失败
 E_NOJUSTICE:没有这个法官
 E_OUTOFBUFFER:缓冲区容量不够
备注:byte定义如下
typedef unsigned char byte;
城镇组件暴露三个接口。一个是对镇民暴露的接口ITown,另一个是对法官暴露的接口ITownToJusticer,还有就是对玩家暴露的接口ITownToPlayer
ITown包含下列方法
1. 镇民进入   TowneeEnter
2. 镇民退出 TowneeExit
3. 镇民玩家信息 GetTowneeInfo
4. 镇民准备就绪  TowneeReady
5. 镇民取消就绪  TowneeUnready
6. 镇民发言 TowneeSpeek
7. 镇民推举 TowneeVote
8. 镇民取消推举   TowneeCancelVote

//TowneeEnter
HRESULT TowneeEnter([in,size_is(16)]WCHAR *name,[in,size_is(16)]WCHAR* password,[in]ITownee* ptownee);
说明:镇民请求进入城镇
参数:
 name:镇民名。
 ptownee:镇民自己对城镇的接口指针
返回值:
 S_OK:成功
 E_DENY:拒绝进入
备注: 城镇可以根据镇民名向服务器验证,以确定是否接受进入
HRESULT TowneeExit([in,size_is(16)]WCHAR *name);
说明:镇民退出城镇
参数: 
 name:镇民名
返回值:
 S_OK:成功
 E_NOTOWNEE:没有这个镇民
HRESULT TowneeReady([in,size_is(16)]WCHAR *name);
说明: 镇民准备就绪
参数
 name:镇民名
返回值
 S_OK: 成功
HRESULT TowneeUnready([in,size_is(16)]WCHAR *name);
说明: 镇民未就绪
参数
 name:镇民名
返回值
 S_OK:成功
HRESULT TowneeSpeek([in,size_is(16)]WCHAR *name,[in,string]WCHAR* words);
说明: 镇民发言
参数:
 name 镇民名
 words 发言内容
HRESULT TowneeVote([in,size_is(16)WCHAR* name,[in,size_is(16)]WCHAR *object);
说明: 镇民推选
参数:
 name 镇民明
 object 推选对象
返回值
 S_OK 成功
HRESULT TowneeCancelVote([in,size_is(16)]WCHAR *name);
说明: 镇民取消推选
参数:
 name 镇民名
返回值
 S_OK
HRESULT GetTowneeInfo([in,size_is(16)]WCHAR *name,[in]int cMax, [in] int* pLength,
  [out,size_is(cMax),cLength_is(*pLength)]TowneeInfo* pti);
说明: 取得镇民信息
参数:
 name 要取得的镇民名
 cMax 接收缓冲区容量
 pLength 实际返回的镇民信息数目
 pti 接收缓冲区
typedef struct tagTowneeInfo {
 WCHAR name[16];
 byte bReady;
};
ITownToJusticer包含以下方法
1. 天黑   Night
2. 天亮   Day
3. 死亡   Die
4. 复活   Relive
5. 睡觉   Sleep
6. 苏醒   Wake
7. 赋权   qualify
8. 夺权   Disqualify
9. 通知死亡  InformDie
10. 通知复活  InformRelive
11. 通知身份  InformRole
12. 通知发言  InformSpeek
13. 通知推举  InformVote
14. 结束   End
HRESULT Night();
说明: 夜晚到了
返回值:
 S_OK 成功。法官不必检测这个结果。
备注:
 城镇应当把这个消息转发给所有镇民。
HRESULT Day();
说明: 白天到了
返回值:
 S_OK 成功。法官不必检测这个结果。
备注:
 城镇应当把这个消息转发给所有镇民。

HRESULT Die([in,size_is(16)]WCHAR* name);
说明: 镇民死亡
参数: 
 name 死者名
备注: 
1.城镇应该让死者死亡(调用Die方法),并通知其他镇民死者的死讯(InformDie)
2.死亡的意义就是不能发言,不能推举。
HRESULT Relive([in,size_is(16)]WCHAR* name);
说明: 镇民复活
参数:
 name 复活者名
备注: 城镇应该让复活者复活(Relive),并通知其他镇民。(InformRelive)
HRESULT Sleep([in]InformType it,[in,size_is(16)]WCHAR* para);
说明: 让某些镇民睡觉
参数: 
 it 通知类型。该参数决定了什么群体得到响应。
  itAll  所有镇民响应
  itRole 某身份镇民人响应
  itName 某名字的镇民响应
 
 para 通知参数。
  如果it为itAll,该参数无效。
  如果it为itRole,该参数为身份名
  如果it为itName,该参数为镇民名
返回值:S_OK 成功
备注:睡觉的意义就是不能说话。只有活着的并且醒着的人有发言权。
HRESULT Wake([in]InformType it,[in,size_is(16)]WCHAR* para);
说明: 让某些镇民醒来
参数: 
 it 通知类型。该参数决定了什么群体得到响应
 para 通知参数。
返回值:S_OK 成功
HRESULT Qualify([in]InformType it,[in,size_is(16)]WCHAR* para);
说明: 赋予选举权
参数:
 it 通知类型。该参数决定了什么群体得到响应
 para 通知参数。
返回值:S_OK 成功
备注: 只有活着并且有选举权的人能够推选
HRESULT Disqualify([in]InformType it,[in,size_is(16)]WCHAR* para);
说明: 剥夺选举权
 it 通知类型。该参数决定了什么群体得到响应
 para 通知参数。
返回值:S_OK 成功
HRESULT InformDie([in,size_is(16)]WCHAR* actor);
说明: 通知死讯
参数:
 actor 死者名
返回值:S_OK成功
备注: 城镇应当把该消息转发给所有镇民
HRESULT InformRelive([in,size_is(16)]WCHAR* actor);
说明: 通知复活
参数:
 actor 死者名
返回值:S_OK成功
备注: 城镇应当把该消息转发给所有镇民
HRESULT InformRole([in]InformType it,[in,size_is(16)]WCHAR* para,
  [in,size_is(16)] WCHAR* actor, [in,size_is(16)] role);
说明: 通知身份
参数:
 it 通知类型。该参数决定了什么群体得到响应
 para 通知参数。
 actor 对象
 role  对象身份
返回值  S_OK 成功
 

HRESULT InformSpeak([in]InformType it,[in,size_is(16)]WCHAR* para,
  [in,size_is(16)] WCHAR* actor, [in,string]WCHAR* words);
说明: 通知发言
 it 通知类型。该参数决定了什么群体得到响应
 para 通知参数。
 actor 发言者
 words 发言内容
返回值:S_OK 成功
HRESULT InformVote([in,size_is(16)]WCHAR* voter,[in,size_is(16)]WCHAR* votee);
说明: 通知推选
参数: voter 推选者
 votee 推选对象
返回值:S_OK 成功
备注:  城镇应当把该消息转发给所有镇民

HRESULT End();
说明: 游戏结束
备注:  城镇应当通知所有镇民游戏结束,并且告知服务器结果。
ITownToPlayer包含以下方法
1.SetTownName    设置镇名
2.SetAlcalde  设置镇长
3.SetPassword  设置密码
4.SetJusticer  设置法官
5.GetTownName  取得镇名 
6.GetAlcalde  取得镇长
7.GetPassword  取得密码
8.GetJustitcer  取得法官
6.GetPropertyNames 获取属性名列表
7.SetProperty  设置属性
8.GetProperty  取得属性
9.GetTownInfo  产生城镇信息
HRESULT SetTownName([in,size_is(16)]WCHAR* townname);
说明:设置或更改镇名
HRESULT SetAlcalde([in,size_is(16)]WCHAR* alcalde);
说明:设置镇长
HRESULT SetPassword([in,size_is(16)]WCHAR* password);
说明:设置密码。
备注:有密码的城镇只能让密码正确的用户进入。空串表示无密码。
HRESULT SetJusticer([in,size_is(16)]WCHAR* justicer);
说明:设置法官
参数:
 justicer 法官名
备注:
 城镇将根据法官名寻找法官。
HRESULT GetTownName([out,size_is(16)]WCHAR* townname);
HRESULT GetAlcalde([out,size_is(16)]WCHAR* alcalde);
HRESULT GetPassword([out,size_is(16)]WCHAR* password);
HRESULT GetJusticer([out,size_is(16)]WCHAR* justicer);
HRESULT GetPropertyNames([in]int cMax,[out]int* pLength,[out,size_is(cMax),length_is(*pLength),PropertyName* pti);
说明: 取得属性名表

typedef WCHAR PropertyName[16];
HRESULT GetProperty([in,size_is(16)]WCHAR* propname,[out]long* pvalue);
说明: 取得属性
HRESULT SetProperty([in,size_is(16)]WCHAR* propname,[in] long value);
说明: 设置属性
备注: 对于GetPropertyNames,GetProperty, SetProperty三个方法,城镇的标准行为是转调法官的对应方法
HRESULT GetTownInfo([out]TownInfo* pti);
说明: 得到城镇信息
法官暴露接口IJusticer
1.开始 Start
2.玩家发言 TowneeSpeek
3.玩家推选 TowneeVote
4.玩家取消推选 TowneeCancelVote
5.取属性名列表 GetPropertyNames 
6.设置属性 SetProperty  
7.取得属性 GetProperty
8.取得法官名 GetName
9.取得描述 GetDiscription
 
HRESULT Start();
HRESULT TowneeSpeek([in,size_is(16)]WCHAR *speeker,[in,string]WCHAR* words);
HRESULT TowneeVote([in,size_is(16)WCHAR* voter,[in,size_is(16)]WCHAR *votee);
HRESULT TowneeCancelVote([in,size_is(16)]WCHAR *voter);
HRESULT GetPropertyNames([in]int cMax,[out]int* pLength,[out,size_is(cMax),length_is(*pLength),PropertyName* pti);
说明: 取得属性名表

typedef WCHAR PropertyName[16];
HRESULT GetProperty([in,size_is(16)]WCHAR* propname,[out]long* pvalue);
说明: 取得属性
HRESULT SetProperty([in,size_is(16)]WCHAR* propname,[in] long value);
HRESULT GetName([out,size_is(16)]WCHAR* name);
HRESULT GetDiscription([out,size_is(512)]WCHAR* discription);
镇民暴露两个接口。其中一个暴露给城镇ITownee,另一个暴露给外界(操纵者)IPlayer
ITownee 有以下方法
1. 开始 Start
2. 结束 End
3. 天黑 Night
4. 天亮 Day
5. 死亡 Die
6. 复活 Relive
7. 睡觉 Sleep
8. 苏醒 Wake
9. 赋权 qualify
10. 夺权 Disqualify
11. 通知死亡 InformDie
12. 通知复活 InformRelive
13. 通知身份 InformRole
14. 通知发言 InformSpeak
15. 通知推举 InformVote
HRESULT Start();
HRESULT End();
HRESULT Night();
HRESULT Day();
HRESULT Die();
HRESULT Relive();
HRESULT Sleep();
HRESULT Wake();
HRESULT Qualify();
HRESULT Disqualify();
HRESULT InformDie([in,size_is(16)]WCHAR* actor);
HRESULT InformRelive([in,size_is(16)]WCHAR* actor);
HRESULT InformRole([in,size_is(16)]WCHAR* actor,[in,size_is(16)]WCHAR* role);
HRESULT InformSpeak([in,size_is(16)]WCHAR* actor,[in,string]WCHAR* words);
HRESULT InformVote([in,size_is(16)]WCHAR* actor,[in,size_is(16)]WCHAR* votee);
IPlayer有以下方法
1. 进入城镇  Enter
2. 退出城镇  Exit
3. 取得玩家信息 GetTowneeInfo
4. 准备就绪  Ready
5. 取消就绪  Unready
6. 发言  Speak
7. 推举  Vote
8. 取消推举   CancelVote
9. 设置玩家名 SetName

HRESULT Enter([in]int ip,[in,size_is(16)]WCHAR* password);
HRESULT Exit();
HRESULT GetTowneeInfo([in]int cMax, [in] int* pLength,
  [out,size_is(cMax),cLength_is(*pLength)]TowneeInfo* pti);
HRESULT Ready();
HRESULT Unready();
HRESULT Speak([in,string]WCHAR* words);
HRESULT Vote([in,size_is(16)]WCHAR* votee);
HRESULT CancelVote();
HRESULT SetName([in,size_is(16)WCHAR* name);
 
/**************************************************************/
本设计可分为以下模块
1.服务器DLL模块
该模块实现了服务器组件。该组件暴露了IKillServer接口,并且实现了对应行为。
该DLL模块引出CreateObject函数,库利用这个函数来创建组件对象。
IKillServer* CreateObject();
2.服务器EXE程序
该程序实现服务器界面部分。它通过库函数CreateServer来创建一个服务器组件,利用它来接受服务请求,完成服务。该程序必须有一个消息循环。因为库可能利用消息机制分发调用请求。
城镇DLL模块
该模块实现了城镇组件。该组件暴露了ITown,ITownToJusticer,ITownToPlayer三个接口,并实现了对应行为。
该DLL模块引出CreateObject函数,库利用这个函数来创建组件对象。
ITownToPlayer* CreateObject();
3.法官DLL
该模块实现了法官组件。该组件暴露了IJusticer接口,并实现了对应行为。
该DLL模块引出CreateObject函数,库利用这个函数来创建组件对象。
4.镇民DLL模块
该模块实现了镇民组件。该组件暴露了ITownee接口和IPlayer接口,并实现相应行为。
该DLL模块引出CreateObject函数,库利用这个函数来创建对象。
5.客户端EXE
该部分完成了客户端界面。它可通过库函数CreateTown,CreatePlayer来创建镇和镇民对象,并利用它们的接口来完成功能。该程序应该有一个消息循环。
6.库DLL模块
该库对实现细节进行封装,对开发者提供标准的函数。
int KillInitialize() 初始化
void KillUninitialize() 结束工作
IKillServer* CreateServer(const char* DLLPath) 根据DLLPath提供的路径加载服务器组件,并创建服务器对象。该函数调用后,本地机器就变成一个服务器,可以提供远程级机器要求服务器接口指针的请求。该函数在服务器EXE中被调用。
ITownToPlayer* CreateTown(const char* DLLPath) 根据DLLPath提供的路径加载城镇组件,并创建城镇。该函数调用后,本地机变成一个服务器,可以提供远程机器要求服务器接口指针的请求。该函数在客户端EXE中被调用
IPlayer* CreatePlayer(const char* DLLPath) 根据DLLPath提供的路径加载镇民组件,并创建镇民。该函数在客户端EXE中被调用
IJusticer* CreateJusticer(WCHAR name[16]) 根据法官名来加载法官,并创建法官。这意味着法官管理工作由库完成。该函数应该在城镇DLL中被调用
int RegisterJusticer(const char *DLLPath) 注册法官。
int UnregisterJusticer(const char* DLLPath) 注销法官。
以上两个函数应该在服务端EXE,客户端EXE或其他外挂程序里被调用。
IKillServer* GetServer(int ip) 根据ip地址取得远程服务器的接口指针。这个函数应在客户端EXE中调用
ITown* GetTown(int ip) 根据ip地址取得远程机器上城镇的指针。这个函数应在镇民组件中被调用。
int ReleaseInterface(void* pItf); 使用GetServer,GetTown或其他方式获得的指针一定要删除。
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值