Jiwu Bu

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  32 随笔 :: 0 文章 :: 25 评论 :: 0 Trackbacks
转载请注明出处!
上篇五子棋<一>
http://www.cppblog.com/bujiwu/archive/2009/08/23/94199.html

主要实现了五子棋的界面与下棋业务流程。
这二天实现了以下计划中的第一点,完成了网络对战功能,并实现了网络悔棋。
1、网络对战功能(包括GameClient与GameServer类,可以了解Socket编程)。
2、人机对战功能(目前还没有好的思路)。

由于五子棋服务端与客户端通讯比较简单,所以只用最简单的网络通讯模式(没有使用IOCP)。定义网络通讯抽象基类CBaseSocket。
 1 typedef void (* RECVFUNC)(char *pMsg, int len);
 2 
 3 class CBaseSocket
 4 {
 5 public:
 6     CBaseSocket();
 7     virtual ~CBaseSocket();
 8 
 9     virtual bool SendPacket(void* pMsg, int len) = 0;
10     virtual bool Initialize(int Port, char* pAddress) = 0;
11    
12 protected:
13     bool InitWinSock();
14 
15 protected:
16     SOCKET hSocket;
17     static RECVFUNC pRecv;
18 };

客户端类CGameClient与CGameServer类继承CBaseSocket基类。并实现bool SendPacket(void* pMsg, int len) 与 bool Initialize(int Port, char* pAddress) 纯虚函数。由于CGameClient与CGameServer都继承CBaseSocket,所以可以通过多态的实例化具体的客户端类或服务端类。 如下:

 1 定义:
 2 CBaseSocket *pSocket = NULL;
 3 
 4 if(IsDlgButtonChecked(hDlg, IDC_RADI_HOST))
 5 {
 6     pSocket = new CGameServer(RecvPktCallBack);
 7     gMode = SERVER_MODE;
 8     EnableWindow( GetDlgItem(hDlg, IDOK), FALSE);
 9 }
10 else
11 {
12     pSocket = new CGameClient(RecvPktCallBack);
13     gMode = CLIENT_MODE;
14     GetDlgItemText(hDlg, IDC_EDIT_IP, pAddress, sizeof(pAddress) );
15 }

服务端类当accept客户端就压入到vector,主要是为了以后支持网络模式下可以观棋的客户端连接。
 1 class CGameServer:public CBaseSocket
 2 {
 3 public:
 4     CGameServer(RECVFUNC pRecv);
 5     ~CGameServer();
 6 
 7     bool SendPacket(void* pMsg, int len);
 8     bool Initialize(int Port, char* pAddress);
 9 
10 private:
11     static DWORD WINAPI RecvThread(LPVOID lpPara);
12     static DWORD WINAPI AcceptThread(LPVOID lpPara);
13 
14 private:
15     static vector<SOCKET> ClientVec;
16 };

其它就是打包、解包的工作了。


代码:
/Files/bujiwu/Gobang.rar

posted on 2009-08-27 21:32 bujiwu 阅读(1755) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理