小型网络游戏实例(vc++)——网络五子棋

转载请注明出处

本文章的源代码下载地址

       前面介绍了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.cppMatch类中保存着当前的棋盘,它还负责判断是否能够在指定的位置落子,

是否出现输赢局面。



1.4 代码详细分析

 

下面将分析网络五子棋游戏中的网络控制、五子棋规则和视图控制部分的相关代码。

_ 网络控制部分:CServerSocketCClientSocketCMessg

第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 中的核心代码如下(构造函数负责部分初始化工作):<

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值