📄 gameserver.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 + -