服务器模块: Ø 游戏通信类,由CServer类实现。负责处理游戏中客户与服务器之间的网络连接细节,从而使得对于客户和服务器之间的数据传输可以忽略通信细节。模块描述如图4-6。 内容来自论文无忧网 www.paper51.com
paper51.com
图4-6 游戏通信类模块描述 内容来自论文无忧网 www.paper51.com Ø 游戏协议类,由CServerProtocol类实现。游戏协议类负责解析客户/服务器端所传输的协议,同时根据不同的协议调用不同的操作函数,并根据用户状态变化维护用户信息。模块描述如图4-7。 内容来自论文无忧网 www.paper51.com paper51.com 图4-7 游戏协议类模块描述 http://www.paper51.com Ø 游戏逻辑类负责处理游戏逻辑,在军棋游戏中包括计算得分,计算赢等。游戏逻辑类CServerLogic和游戏协议类分离的优点是可以只通过修改逻辑类来改变为不同的网络游戏,如修改为“象棋逻辑”即可以成为象棋游戏,修改为“升级逻辑”即可以成为升级游戏。 内容来自www.paper51.com Ø 用户管理类,直接在CCServerFrameView中实现。 copyright paper51.com Ø 数据库类,采用SQL Server 2000数据库,只是用来保存玩家的资料等一些数据。采用MFC ODBC数据库编程,在程序中为CServerFrameSet类。正如MFC提供的其他类库很好地对相应的Win32 API作了封装,MFC提供的ODBC类库也相应地对ODBCAPI作了封装,通过提供一种高级接口而避免直接使用ODBC API所涉及的种种繁琐处理,简化了对ODBC数据库的应用程序编程。模块描述如图4-8。 内容来自论文无忧网 www.paper51.com
paper51.com
图4-8 数据库类模块描述 copyright paper51.com 第五章 程序编码 内容来自www.paper51.com 5.1 数据结构 内容来自论文无忧网 www.paper51.com Ø 用17×17的数组表示军棋的棋盘,如下: 内容来自论文无忧网 www.paper51.com intBOARD[17][17] = { copyright paper51.com {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1}, 内容来自www.paper51.com {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1}, paper51.com {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1}, 内容来自www.paper51.com {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1}, 内容来自www.paper51.com {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1}, 内容来自www.paper51.com {-1,-1,-1,-1,-1, 0,0,0,0,0,0,0,-1,-1,-1,-1,-1}, copyright paper51.com {0,0,0,0,0,0, 0, 0, 0, 0,0,0,0,0,0,0,0}, copyright paper51.com {0,0,0,0,0,0, 0,-1, 0,-1,0,0,0,0,0,0,0}, 内容来自论文无忧网 www.paper51.com {0,0,0,0,0,0, 0, 0, 0, 0,0,0,0,0,0,0,0}, 内容来自www.paper51.com {0,0,0,0,0,0, 0,-1, 0,-1,0,0,0,0,0,0,0}, paper51.com {0,0,0,0,0,0, 0, 0, 0, 0,0,0,0,0,0,0,0}, http://www.paper51.com
{-1,-1,-1,-1,-1, 0, 7, 3,4,5, 3, 0,-1,-1,-1,-1,-1}, copyright paper51.com {-1,-1,-1,-1,-1,-1,10, 0,1,0, 9,-1,-1,-1,-1,-1,-1}, 内容来自www.paper51.com {-1,-1,-1,-1,-1,-1, 8,10,0,1, 5,-1,-1,-1,-1,-1,-1}, 内容来自www.paper51.com {-1,-1,-1,-1,-1,-1, 6, 0,4,0, 3,-1,-1,-1,-1,-1,-1}, 内容来自论文无忧网 www.paper51.com
{-1,-1,-1,-1,-1,-1, 2, 7,6,1,11,-1,-1,-1,-1,-1,-1}, 内容来自www.paper51.com {-1,-1,-1,-1,-1,-1,11,12,11,2,2,-1,-1,-1,-1,-1,-1}, copyright paper51.com
}; 内容来自论文无忧网 www.paper51.com
-1表示棋盘以外的位置 paper51.com 0 表示棋盘内位置,但无棋子 http://www.paper51.com 1 工兵 copyright paper51.com
2 排长 paper51.com 3 连长 内容来自论文无忧网 www.paper51.com 4 营长 内容来自论文无忧网 www.paper51.com 5 团长 paper51.com 6 旅长 copyright paper51.com 7 师长 内容来自www.paper51.com 8 军长 http://www.paper51.com 9 司令 http://www.paper51.com 10炸弹 copyright paper51.com
11地雷 内容来自论文无忧网 www.paper51.com
12我方军旗 paper51.com
13上方盟友或敌方的棋子 paper51.com 14左边敌方的棋子 内容来自www.paper51.com 15右边敌方的棋子 内容来自www.paper51.com 16上方军旗 paper51.com 17左方军旗 内容来自www.paper51.com 18右方军旗 copyright paper51.com
为了处理工兵的走法的方便,将四个转角斜对的位置恒置为0,这样在为工兵寻找路径时会方便一些。 copyright paper51.com Ø 游戏协议 内容来自论文无忧网 www.paper51.com 以char(20)作为一次信息的起始点,终点。“+”在字符串中用空格代替。以一字符串作为向服务发出的请求信息,服务器也以相应的一字符串发送回客户端作为应答。 paper51.com
对话: paper51.com
A+桌子号+聊天内容 copyright paper51.com 坐下: http://www.paper51.com B+桌子号+方位 内容来自www.paper51.com
调度完成: copyright paper51.com C+桌子号+方位+(棋盘数据)[用一维数据形式表示6×5的二维数组,数据之间用空格开。 内容来自www.paper51.com 开始游戏:(只由服务器发出) 内容来自www.paper51.com D+对战类型 copyright paper51.com 下棋: http://www.paper51.com E +桌子号+方位+起点(x,y)+终点(x,y) copyright paper51.com 吃:(只由服务器发出)(包括移动) 内容来自论文无忧网 www.paper51.com
F +起点(x,y) + 终点(x,y) copyright paper51.com 被吃:(只由服务器发出) 内容来自www.paper51.com G +起点(x,y) + 终点(x,y) 内容来自www.paper51.com
炸:(只由服务器发出) paper51.com
H +起点(x,y) + 终点(x,y) paper51.com
输:离开:(包括断线)投降: http://www.paper51.com I +方位 copyright paper51.com 求和: copyright paper51.com K +桌子号+方位 copyright paper51.com 注册: paper51.com L +用户名+密码 paper51.com
注册成功: 内容来自www.paper51.com M + 用户名 copyright paper51.com 登录: http://www.paper51.com
N + 用户名+密码 paper51.com 登录结果: copyright paper51.com
O + 1/0 copyright paper51.com 离开: paper51.com P + 桌子号 + 方位 内容来自www.paper51.com 请求接收信息: paper51.com Q + 桌子号 + 方位 http://www.paper51.com 碰: paper51.com R + 起点(x,y) + 终点(x,y) 内容来自www.paper51.com 5.2主要界面 内容来自论文无忧网 www.paper51.com
服务器界面如图5-1所示。 http://www.paper51.com 内容来自论文无忧网 www.paper51.com 图5-1 服务器启动界面 paper51.com 客户端大厅界面如图5-2所示。 内容来自www.paper51.com paper51.com 图5-2 客户端大厅界面 http://www.paper51.com
军棋游戏界面,如图5-3所示: 内容来自www.paper51.com http://www.paper51.com 图5-3 军棋游戏界面 http://www.paper51.com 5.3重要模块程序实现 http://www.paper51.com Ø 客户端三拆分窗口的实现 内容来自论文无忧网 www.paper51.com
BOOLCMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) copyright paper51.com { 内容来自www.paper51.com if(NULL==m_wndSplitter.CreateStatic(this,1,2)) 内容来自论文无忧网 www.paper51.com returnFALSE; 内容来自论文无忧网 www.paper51.com if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTableView),CSize(620,800),pContext)) http://www.paper51.com return FALSE; 内容来自www.paper51.com if(NULL==m_wndLeftSplitter.CreateStatic(&m_wndSplitter,2,1, 内容来自论文无忧网 www.paper51.com WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,1))) 内容来自论文无忧网 www.paper51.com
returnFALSE; http://www.paper51.com if(!m_wndLeftSplitter.CreateView(0,0,RUNTIME_CLASS(CCGameHallFrameView),CSize(380,300),pContext)|| copyright paper51.com !m_wndLeftSplitter.CreateView(1,0,RUNTIME_CLASS(CHtmlViewEx),CSize(380,500),pContext)) 内容来自论文无忧网 www.paper51.com
return FALSE; paper51.com pWebView=(CHtmlViewEx*)m_wndLeftSplitter.GetPane(1,0); copyright paper51.com pServerTreeView=(CCGameHallFrameView*)m_wndLeftSplitter.GetPane(0,0) http://www.paper51.com pTableView=(CTableView*)m_wndSplitter.GetPane(0,0); 内容来自www.paper51.com pServerTreeView->pTable=pTableView; http://www.paper51.com pWebView->Navigate2("http://free2.e-168.cn/zhou207",0,NULL); 内容来自www.paper51.com
return TRUE; paper51.com } copyright paper51.com
Ø 客户端初始化及连接 内容来自www.paper51.com voidCClient::ClientInit() 内容来自论文无忧网 www.paper51.com { http://www.paper51.com if(WSAAsyncSelect(m_hSocket,m_hWnd,CLI_MESSAGE,FD_READ|FD_WRITE|FD_CLOSE|FD_CONNECT)>0) 内容来自论文无忧网 www.paper51.com { copyright paper51.com
AfxMessageBox("Errorin select"); http://www.paper51.com
} http://www.paper51.com
} http://www.paper51.com BOOLCClient::InitAndConnect(HWND hWnd, UINT port, CString strServer) paper51.com
{ 内容来自www.paper51.com
m_hWnd=hWnd; 内容来自www.paper51.com
m_uPort=port; 内容来自www.paper51.com m_strServer=strServer; paper51.com if(m_hSocket!=NULL) copyright paper51.com
{ copyright paper51.com //先将以前打开的套接字关闭 copyright paper51.com closesocket(m_hSocket); 内容来自www.paper51.com m_hSocket=NULL; 内容来自www.paper51.com
} 内容来自论文无忧网 www.paper51.com //创建面向连接的socket copyright paper51.com
m_hSocket=socket(AF_INET,SOCK_STREAM,0); http://www.paper51.com ASSERT(m_hSocket!=NULL); copyright paper51.com ClientInit(); http://www.paper51.com
//设置连接信息:网络协议+IP地址+端口 paper51.com m_addr.sin_family=AF_INET; http://www.paper51.com m_addr.sin_addr.S_un.S_addr=inet_addr(m_strServer.GetBuffer(0)); 内容来自www.paper51.com
m_addr.sin_port=htons(m_uPort); 内容来自www.paper51.com
//连接服务器 copyright paper51.com int ret=0; copyright paper51.com int error=0; http://www.paper51.com ret=connect(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr)); copyright paper51.com
if(ret==SOCKET_ERROR) http://www.paper51.com { 内容来自www.paper51.com //连接失败 内容来自论文无忧网 www.paper51.com
if(GetLastError()!=WSAEWOULDBLOCK) 内容来自www.paper51.com { 内容来自www.paper51.com AfxMessageBox(_T("请确认服务器确实已经打开并工作在同样的端口!")); copyright paper51.com
returnFALSE; 内容来自论文无忧网 www.paper51.com } copyright paper51.com } copyright paper51.com return TRUE; 内容来自论文无忧网 www.paper51.com } paper51.com |