目录
第一章 绪论 1
1.1 问题概述 1
1.1.1 问题的来源 1
1.1.2 目的和意义 1
1.1.3 国内外研究现状 1
1.2 问题剖析 2
1.2.1 主要问题 2
1.2.2 难点和关键 3
1.2.3 思路和方法 3
第二章 相关的知识和工具 4
2.1 解决问题的知识基础 4
2.2 开发平台 5
2.3 数据库 5
第三章 总体设计 6
3.1 总体设计的框架 6
3.2 模块功能概述 7
3.3 关键算法 8
3.4关键技术 12
第四章 详细设计 14
4.1数据库结构 14
4.2模块结构 14
4.3 重要模块详述 15
第五章 程序编码 19
5.1 数据结构 19
5.2主要界面 22
5.3 重要模块程序实现 24
第六章 问题和展望 32
6.1 特色与成功 32
6.2 问题与展望 32
参考文献 33
附录 34
游戏大厅 34
游戏类 38
3.2 模块功能概述
客户端类的划分:
游戏基本类:负责处理游戏中一些完成基本功能的类,如处理声音类、处理动画图标,图形按钮等类,基本类的特点是被其他类在特定处所调用,并不动生成对象。
游戏框架类:负责处理游戏中客户端用于显示程序界面和绘制游戏界面以及显示用户信息和广告信息等处理任务。
游戏通信类:负责处理游戏中客户服务器之间的网络传输细节,从而在编程中不用考虑网络通信细节,达到客户和服务器之间的透明的效果。
游戏应用程序类:主要负责处理应用程序中各种设置显示对话框、程序主线程处理、程序中基本的运行类框架的管理,以及游戏中图形的处理和显示等任务的处理。
游戏处理类:本文转载自http://www.biyezuopin.vip/onews.asp?id=14984主要用于处理游戏简单逻辑、负责解析和处理与服务器端交互的游戏数据,以及在游戏运行中维护游戏中的各种数据,同时维护处理游戏主线程逻辑等功能。
服务器类的划分:
游戏通信类:负责处理游戏中客户服务器之间的网络传输细节,从而在编程中不用考虑网络通信细节,达到客户和服务器之间透明传输的效果。
游戏协议类:负责处理游戏中客户服务器之间交互所传递的数据,并且对该数据格式进行打包和解包,同时根据该包中所包含的指令串进行相应的操作。
游戏逻辑类:负责处理游戏逻辑,如军棋游戏中用于维护军棋逻辑,判断下棋,得分等处理类。
用户管理类:用于管理用户资料,在用户登录后通过数据库验证用户名和密码,通过验证后从数据库读取用户的详细资料。同时在程序中维护用户数据,在用户游戏结束和退出游戏时将用户数据保存到数据库中。
服务器框架类:用于管理游戏大厅的数据,包括一些数据的列表。
数据库类:用于网络游戏的服务器端在处理大量的客户资料时,使用数据库进行大量数据的存储和查询所调用的类方法。
// Client.cpp: implementation of the CClient class.
//
//#include "stdafx.h"
#include "CGameHallFrame.h"
#include "Client.h"
#include "CGameHallFrameView.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//
// Construction/Destruction
//CClient::CClient()
{m_hSocket=NULL;
}CClient::~CClient()
{}void CClient::ClientInit()
{if(WSAAsyncSelect(m_hSocket,m_hWnd,CLI_MESSAGE,FD_READ|FD_WRITE|FD_CLOSE|FD_CONNECT)>0){AfxMessageBox("Error in select");}
}BOOL CClient::InitAndConnect(HWND hWnd, UINT port, CString strServer)
{m_hWnd=hWnd;m_uPort=port;m_strServer=strServer;if(m_hSocket!=NULL){//先将以前打开的套接字关闭closesocket(m_hSocket);m_hSocket=NULL;}//创建面向连接的socketm_hSocket=socket(AF_INET,SOCK_STREAM,0);ASSERT(m_hSocket!=NULL);ClientInit();//设置连接信息:网络协议+IP地址+端口m_addr.sin_family=AF_INET;m_addr.sin_addr.S_un.S_addr=inet_addr(m_strServer.GetBuffer(0));m_addr.sin_port=htons(m_uPort);//连接服务器int ret=0;int error=0;ret=connect(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));if(ret==SOCKET_ERROR){//连接失败if(GetLastError()!=WSAEWOULDBLOCK){AfxMessageBox(_T("请确认服务器确实已经打开并工作在同样的端口!"));return FALSE;}}return TRUE;
}void CClient::GetString(CString &str)
{recv(m_hSocket,str.GetBuffer(0),1024,MSG_DONTROUTE);
}void CClient::SendString(CString a)
{if(send(m_hSocket,a.GetBuffer(0),a.GetLength(),0)==SOCKET_ERROR){AfxMessageBox("Client Send data error");}
}