⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameserver.cpp

📁 五子棋的其中一个代码 是里面用户登陆的
💻 CPP
字号:
//	Declaration of class CGameServer
//	Author: ShiXingdong
//	Last modify: Jun 2nd, 2002

#include <memory.h>
#include "global.h"
#include "GameServer.h"
#include "UserInfo.h"
#include "UserManager.h"
#include "GameManager.h"
#include <winsock2.h>
#include <string>
using namespace std;

static CUserManager UserManager;	//用户管理器
static CGameManager GameManager;	//游戏管理器


bool g_RecepFunc(SOCKET sct)	//用来响应客户端请求的函数
{
	int OpNum,length,result,RoomNum;
	unsigned int UserID=(unsigned int)sct;
	ACTION action;
	char UserName[256];
	CUserInfo user;
	GAMERESULT gameresult;

	recv(sct,(char*)&OpNum,4,0);	//得到用户请求的代号
	switch(OpNum)
	{
		case QUERY_USERS:	//查询用户信息
			length=UserManager.GetUserCount() * sizeof(CUserInfo);
			send(sct,(char*)&length,4,0);
			send(sct,(const char*)UserManager.GetAllUser(),length,0);
			break;

		case ENTER_ROOM:	//进入游戏室
			if(recv(sct,(char*)&RoomNum,4,0)==SOCKET_ERROR)
				break;
			result=GameManager.AddUser(UserID,RoomNum)&&UserManager.SetRoomNum(UserID,RoomNum)?OK:FAILED;
			send(sct,(char*)&result,4,0);
			break;

		case EXIT_ROOM:		//退出游戏室
			result=GameManager.DeleteUser(UserID)&&UserManager.SetRoomNum(UserID,0)?OK:FAILED;
			send(sct,(char*)&result,4,0);
			break;

		case USER_ACTION:	//用户作出动作
			if(recv(sct,(char*)&length,4,0)==SOCKET_ERROR)
				break;
			if(recv(sct,(char*)&action,length,0)==SOCKET_ERROR)
				break;
			if( !GameManager.IsReady(UserID) ||
				GameManager.GetNextPlayerID(UserID)!=UserID)
			{
				gameresult.GameEnd=false;
				gameresult.NextPlayerID=GameManager.GetNextPlayerID(UserID);
				result=FAILED;
			}
			else
			{
				action.UserID=UserID;
				gameresult=GameManager.UserPlay(action);
				result=OK;
			}
			send(sct,(char*)&result,4,0);
			length=225;
			send(sct,(char*)&length,4,0);
			send(sct,GameManager.GetGameInfo(UserID),length,0);
			if(gameresult.GameEnd)
				GameManager.RestartGame(UserID);
			break;

		case QUERY_BOARD:	//查询棋盘信息
			length=225;
			send(sct,(char*)&length,4,0);
			send(sct,GameManager.GetGameInfo(UserID),length,0);
			break;

		case REGISTER_USER:	//注册用户
			if(recv(sct,(char*)&length,4,0)==SOCKET_ERROR)
				break;
			if(recv(sct,(char*)UserName,length,0)==SOCKET_ERROR)
				break;
			UserName[length]='\0';
			user.SetID(UserID);
			user.SetName(UserName);
			user.SetIP("Unknown");
			result=UserManager.AddUser(user)?OK:FAILED;
			send(sct,(char*)&result,4,0);
			break;
			
		case LOGOUT:	//注销用户
			UserManager.DeleteUser(UserID);
	}
	return(true);
}

bool CGameServer::IsOK() const
{
	return(CTCPServer::IsOK());
}

bool CGameServer::TurnOn()
{
	return(CTCPServer::TurnOn());
}

bool CGameServer::TurnOff()
{
	return(CTCPServer::TurnOff());
}

string CGameServer::GetServerIP()
{
	return(GetIPAddr());
}

CGameServer::CGameServer(unsigned short nPortNum):CTCPServer(nPortNum)
{
	SetReceptionist(g_RecepFunc);	//设置相应用户请求的函数
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -