admin管理员组文章数量:1621906
转载请注明出处
本文章的源代码下载地址
前面介绍了Socket网络开发基础,下面通过一个网络五子棋的例子来介绍小型网络游戏的制作方
法和流程。
1.1 主程序结构和流程
对于一般的小型网络游戏设计来说,可以分成如下的几个模块。
_ 服务器模块:负责建立游戏服务器并接受客户端的连接和处理客户端的数据。
_ 客户端模块:负责连接到服务器并处理和服务器的会话。
_ 游戏规则模块:负责游戏的控制和结果的判断,使游戏按规则进行。
_ 视图控制模块:负责控制整个程序的操作,负责处理用户的输入和游戏的界面绘制。
本节的网络五子棋游戏就是按照以上的设计思路来安排的。
第4 章网络游戏开发207
1.2 实例演示
实例运行时的界面如图4.7 所示。实现的主要功能有:双人对下五子棋,聊天。
208 Visual C++游戏开发技术与实例
图4.7 网络五子棋的运行界面
1.3 实例设计
利用Win32 AppWizard 建立一个单文档工程,工程名称为FiveChess。工程主要包括以下的一些
文件。
其中窗体/视图/文档文件包括如下文件。
_ MainFrm.h /MainFrm.cpp:主窗体框架。
_ FiveChessView.h/FiveChessView.cpp:棋盘界面的显示,鼠标消息的处理和发送网络数据(聊
天和下棋)。
_ FiveChessDoc.h/FiveChessDoc.cpp:文档部分。
网络控制部分包括如下文件。
_ ServerSocket.h/ServerSocket.cpp:服务器端用来监听的socket,它继承自CSocket。它负责响应
客户端连接消息。
_ ClientSocket.h/ClientSocket.cpp:用来会话的socket,它也继承于CSocket。它负责响应Receive
的消息。服务器端和客户端都用这个socket 发送和接受数据。
_ CMessg.h/CMessg.cpp:发送和接受的数据的定义。它采用串行化的方式对网络数据进行处理。
五子棋规则部分包括如下文件。
_ Match.h/Match.cpp:Match类中保存着当前的棋盘,它还负责判断是否能够在指定的位置落子,
是否出现输赢局面。
1.4 代码详细分析
下面将分析网络五子棋游戏中的网络控制、五子棋规则和视图控制部分的相关代码。
_ 网络控制部分:CServerSocket、CClientSocket和CMessg。
第4 章网络游戏开发209
CServerSocket 类是一个专门用来监听客户端连接的Socket类,它继承于CSocket,响应OnAccept
消息。CServerSocket 类声明如下:
classCServerSocket : public CSocket
{
public:
CFiveChessView* m_view; //主视图的指针,为接受连接函数服务
UINTm_uPort; //需要监听的端口
BOOLInit(UINT port, CFiveChessView* dlg); //socket 的初始化
public:
virtualvoid OnAccept(int nErrorCode); //接受连接消息处理函数
};
在ServerSocket.cpp 中的核心代码如下,其中成员函数Init 负责初始化ServerSocket,而OnAccept
函数负责接收客户端连接。
BOOLCServerSocket::Init(UINT port, CFiveChessView* view)
{
m_uPort=port;
m_view=view;
//创建socket
if(Create(m_uPort)==FALSE)
{
AfxMessageBox("ServerSocket Create Error");
returnFALSE;
}
//监听socket
if(Listen()==FALSE)
{
AfxMessageBox("ServerListen Error");
returnFALSE;
}
returnTRUE;
}
voidCServerSocket::OnAccept(int nErrorCode) //接受客户端连接
{
CSocket::OnAccept(nErrorCode);
//调用视图类中的连接处理函数
m_view->ProcessPendingAccept();
}
CClientSocket 类是一个专门用做会话的类,它负责数据的发送和接收。它继承自CSocket,负责
响应OnReceive 和OnClose消息。另外,作为CSocket类的继承类,理所当然的采用了串行化的方式
来处理网络数据。网络数据是由CMessg 的对象构成的。
另外,在CClientSocket 类中还定义了几个静态函数,它们用来得到本机的名字和本机的IP 地址。
CClientSocket 类声明如下:
class CClientSocket : public CSocket
{
public:
210 Visual C++游戏开发技术与实例
CArchive* m_aSessionIn; //输入数据的串行化
CArchive* m_aSessionOut; //输出数据的串行化
CSocketFile* m_sfSocketFile; //Socket 关联文件指针
CFiveChessView * m_view; //视图指针
bool m_bInit; //是否初始化
bool m_bClose; //连接是否已关闭
public:
void Init(CFiveChessView * view); //socket 和串行化相关的初始化
BOOL SendMessage(CMessg * msg); //发送消息的函数
void CloseSocket(); //关闭socket 函数
public: //几个静态函数,用来得到主机名和主机IP 地址
static int GetLocalHostName(CString&sHostName); //获得本地计算机名称
static int GetIpAddress(const CString&sHostName, CString &sIpAddress);
//获得本地IP
static int GetIpAddress(const CString&sHostName, BYTE &f0,BYTE &f1,BYTE &f2,BYTE
&f3);//获得本地IP
//这个静态函数根据GetLastError()返回的tag 找到网络失败的原因
static CString ErrorReason(int tag);
public:
virtual void OnReceive(int nErrorCode); //数据接受消息的处理函数
virtual void OnClose(int nErrorCode); //socket 关闭的消息处理函数
};
ClientSocket.cpp 中的核心代码如下(构造函数负责部分初始化工作):<
版权声明:本文标题:小型网络游戏实例(vc++)——网络五子棋 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728849975a1176549.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论