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

📄 gobangdeal.cpp

📁 java程序五子棋源代码。 java程序五子棋源代码。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// GobangDeal.cpp: implementation of the GobangDeal class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "GobangServer.h"
#include "GobangDeal.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern CShareMemory<NODE_STRUCT> *svr_recv_queue;		//接收队列
extern CShareMemory<NODE_STRUCT> *svr_send_queue;		//发送队列
extern CShareMemory<NODE_STRUCT> *svr_robot_queue;		//机器人交互队列
char* split(char* &text,const char *seps);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


GobangDeal::GobangDeal(CListBox *pListBox,CString configfile)
{
	this->configfile = configfile;
	m_pMsgList = pListBox;
	ReadFromConfig();
}



GobangDeal::~GobangDeal()
{

}


void GobangDeal::SetThreadNo(int no)
{
	threadno = no;
}

int GobangDeal::GetThreadNo()
{
	return threadno;
}

void GobangDeal::GetDataBasepara(CString &sdatabase,CString &sdbusername,CString &sdbpassword,CString &slogdir)
{
	sdatabase = this->database;
	sdbpassword = this->dbpassword;
	sdbusername = this->dbusername;
	slogdir = this->logdir;
}

//读配置文件
void GobangDeal::ReadFromConfig()
{	
	char buf[1024];
	threadnum = ::GetPrivateProfileInt("THREAD","gobang",10,configfile);
	::GetPrivateProfileString("DB","database","",buf,sizeof(buf),configfile);
	database =buf;
	::GetPrivateProfileString("DB","username","",buf,sizeof(buf),configfile);
	dbusername = buf;
	::GetPrivateProfileString("DB","password","",buf,sizeof(buf),configfile);
	dbpassword = buf;
	::GetPrivateProfileString("LOG","gobanglogdir","",buf,sizeof(buf),configfile);
	logdir = buf;
	logfile = logdir + "gobang.txt";
}


BOOL GobangDeal::Init()
{

//	DbpInit();
	//实例化一个共享内存对象
	svr_recv_queue = new CShareMemory<NODE_STRUCT> (GOBANG_RECV_KEY);
	if(!svr_recv_queue->Init(QUEUE_LENGTH)){
		AddMsg("初始化接收共享内存时产生错误!","系统错误",MB_OK|MB_ICONSTOP);
		exit(-1);
	}
	else{
		AddMsg("初始化接收共享内存时成功");
	}

	svr_send_queue = new CShareMemory<NODE_STRUCT> (GOBANG_SEND_KEY);
	if(!svr_send_queue->Init(QUEUE_LENGTH)){
			AddMsg("初始化发送共享内存时产生错误!","系统错误",MB_OK|MB_ICONSTOP);
		exit(-1);
	}
	else{
		AddMsg("初始化发送共享内存时成功");
	}

	svr_robot_queue = new CShareMemory<NODE_STRUCT> (GOBANG_ROBOT_KEY);
	if(!svr_robot_queue->Init(QUEUE_LENGTH)){
			AddMsg("初始化机器人交互共享内存时产生错误!","系统错误",MB_OK|MB_ICONSTOP);
		exit(-1);
	}
	else{
		AddMsg("初始化机器人交互共享内存时成功");
	}	
		return true;

}


UINT GobangDeal::Run()
{
	Init();
	for(int i = 0; i < threadnum; i++)
	{
		SetThreadNo(i+1);
		pRecvThread[i] = AfxBeginThread(RecvThreadFunc,this,THREAD_PRIORITY_NORMAL);
		Sleep(100);
	}
	AddMsg("五子棋服务程序初始化完成!");
	return PBL_Error_OK;
}


//功能:向监视窗口添加一条信息
//参数:csMsg是要显示的信息
void GobangDeal::AddMsg(LPCTSTR fmt , ...)
{
	va_list args;
	CTime ctTime = CTime::GetCurrentTime();
	CString csTime = ctTime.Format("[%Y-%m-%d %H:%M:%S]");
	
	char szBuf[1024];
	va_start(args, fmt);
	vsprintf(szBuf,fmt,args);
	va_end(args);

	csTime = csTime + "  " + szBuf;
	
	if(m_pMsgList->GetCount() > MAXSHOWLINES-1){
		m_pMsgList->DeleteString(0);
	}
	m_pMsgList->AddString(csTime);
	WriteLog(szBuf);
}


//功能:写LOG
//参数:sLogFile为Log文件名,sFileName指名哪个文件写LOG
//参数:nLine表明在第X行写LOG,fmt见printf...
BOOL GobangDeal::WriteLog(LPCTSTR fmt , ...)
{
	va_list args;
	FILE *fp;
	time_t t;
	struct tm *ptm;
		time(&t);
	ptm = localtime(&t);
	if((fp = fopen(logfile, "a+t")) == NULL)
		return FALSE;
	fprintf(fp,"[%04d%02d%02d %02d:%02d:%02d] ",
		ptm->tm_year + 1900,
		ptm->tm_mon +1,
		ptm->tm_mday,
		ptm->tm_hour,
		ptm->tm_min,
		ptm->tm_sec);
	va_start(args, fmt);
	vfprintf(fp,fmt,args);
	fprintf(fp,"\n");
	va_end(args);
	fclose(fp);
	return TRUE;
}


/************************************************************************
函数功能:获取房间列表信息

************************************************************************/
void GobangDeal::GetRoomList(TDBPEx *dbp,NODE_STRUCT recvnode){ 
	char sqlbuf[1024]={0};
	char *tempstr;
	char *body;
	CString roomid,capacity,usernum,roominfo;
	CString userid;
	body = recvnode.body;
	tempstr=split(body,SUBDIVISION);
	userid = tempstr;
	//调整五子棋用户信息表
	sprintf( sqlbuf, 
		"select userid from gobang_userinfo where userid = '%s'",userid);
	dbp->SQLExecDirect(sqlbuf,FALSE);
	if(dbp->SQLFetch() == PBL_Error_OK)
	{
		//五子棋用户信息表更新
		dbp->SQLFreeStmt();
		sprintf( sqlbuf, "update gobang_userinfo set status='01',queuenum=%d,ipaddress='%s',\
			connectport=%d  where userid='%s'",recvnode.queuenum,recvnode.clientip,recvnode.clientport,userid);
		dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
	}
	else
	{
		dbp->SQLFreeStmt();
		sprintf( sqlbuf, "insert into gobang_userinfo(userid,status,queuenum,ipaddress,connectport) \
			values('%s','01',%d,'%s',%d)",userid, recvnode.queuenum,recvnode.clientip,recvnode.clientport);
		dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
	}

	//获取房间列表信息
	sprintf( sqlbuf, 
		"select roomid,capacity,usernum  from Gobang_roominfo");
	dbp->SQLExecDirect(sqlbuf,FALSE);
	roominfo="";
	while(dbp->SQLFetch() == PBL_Error_OK)
	{
		dbp->SQLGetDataStr(1,roomid);
		dbp->SQLGetDataStr(2,capacity);
		dbp->SQLGetDataStr(3,usernum);
		roominfo =roominfo+roomid+"$"+capacity+"$"+usernum+";";
		
	}
	dbp->SQLFreeStmt();
	//响应信息:是否获取成功(0:成功 1:失败)
	sprintf( recvnode.body, "%s;%s;", "0", roominfo );
	this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
	this->WriteLog("body:%s",recvnode.body);
	if(recvnode.queuenum < 0) { //玩家为机器人
		svr_robot_queue->Insert(&recvnode);
	}else{
		svr_send_queue->Insert(&recvnode);
	}
	
}


/************************************************************************
函数功能:获取用户游戏统计信息

************************************************************************/
void GobangDeal::GetCountInfo(TDBPEx *dbp,NODE_STRUCT recvnode){ 
	char sqlbuf[1024]={0};
	char *tempstr;
	char *body;
	CString integral,gamelevel,Allcount,wincount;
	CString equalcount,failcount,countgroup="";
	CString userid;
	body = recvnode.body;
	tempstr=split(body,SUBDIVISION);
	userid = tempstr;
	//更新用户的socket连接
	sprintf( sqlbuf, "update gobang_userinfo set status='01',queuenum=%d,ipaddress='%s',\
			connectport=%d  where userid='%s'",recvnode.queuenum,recvnode.clientip,recvnode.clientport,userid);
	dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
	sprintf( sqlbuf, 
		"select a.integral,b.gamelevel,a.Allcount,a.wincount,a.equalcount,a.failcount  \
		   from gobang_userinfo a, gobang_level b where  b.integral =(select max(c.integral) \
		   from gobang_level c  where a.integral >= c.integral) and a.userid ='%s'",userid);
	dbp->SQLExecDirect(sqlbuf,FALSE);
	if(dbp->SQLFetch() == PBL_Error_OK)
	{
		dbp->SQLGetDataStr(1,integral);
		dbp->SQLGetDataStr(2,gamelevel);
		dbp->SQLGetDataStr(3,Allcount);
		dbp->SQLGetDataStr(4,wincount);
		dbp->SQLGetDataStr(5,equalcount);
		dbp->SQLGetDataStr(6,failcount);
		countgroup =integral+"$"+gamelevel+"$"+Allcount+"$"+wincount+"$"+failcount+"$"+equalcount;
		//响应信息:是否成功(0:成功 1:失败)
		sprintf( recvnode.body, "%s;%s;", "0", countgroup);
	}
	else
	{
		//响应信息:是否成功(0:成功 1:失败)
		sprintf( recvnode.body, "%s;", "1");
	}
	
	dbp->SQLFreeStmt();
	this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
	this->WriteLog("body:%s",recvnode.body);
	if(recvnode.queuenum < 0) { //玩家为机器人
		svr_robot_queue->Insert(&recvnode);
	}else{
		svr_send_queue->Insert(&recvnode);
	}
}



/************************************************************************
函数功能:获取大厅信息

************************************************************************/
void GobangDeal::GetHallInfo(TDBPEx *dbp,NODE_STRUCT recvnode){ 
	char sqlbuf[1024]={0};
	char *tempstr;
	char *body;
	CString tableid,tableseq,status;
	CString nickname,picture,usertype;
	CString otheruserid,userid,roomnum,userinfo="";
	body = recvnode.body;
	tempstr=split(body,SUBDIVISION);
	userid = tempstr;
	tempstr=split(body,SUBDIVISION);
	roomnum = tempstr;
	//更新用户的socket连接和用户状态
	sprintf( sqlbuf, "update gobang_userinfo set status='01',queuenum=%d,ipaddress='%s',\
			connectport=%d  where userid='%s'",recvnode.queuenum,recvnode.clientip,\
			recvnode.clientport,userid);
	dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
	sprintf(sqlbuf,"select userid from gobang_hallinfo where userid = '%s'",userid);
	dbp->SQLExecDirect(sqlbuf,false);
	if(dbp->SQLFetch()==PBL_Error_OK){
		dbp->SQLFreeStmt();
		sprintf(sqlbuf,"delete from gobang_hallinfo where userid = '%s'",userid);
		dbp->SQLExecDirect(sqlbuf);
	}
	
	//向大厅信息表里插入用户数据
	sprintf( sqlbuf, "insert into gobang_hallinfo(userid,roomid) values('%s','%s')",userid,roomnum);
		dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
	
	//获取已经坐下了的用户信息
	sprintf( sqlbuf, 
		"select a.userid,a.tableid,a.tableseq,a.status,b.nickname,b.picture,b.usertype \
		  from Gobang_hallinfo a, User_info b where  b.userid = a.userid and \
		  a.status<>'00' and a.roomid = '%s'",roomnum);
	dbp->SQLExecDirect(sqlbuf,FALSE);
	while(dbp->SQLFetch() == PBL_Error_OK)
	{
		dbp->SQLGetDataStr(1,otheruserid);
		dbp->SQLGetDataStr(2,tableid);
		dbp->SQLGetDataStr(3,tableseq);
		dbp->SQLGetDataStr(4,status);
		dbp->SQLGetDataStr(5,nickname);
		dbp->SQLGetDataStr(6,picture);
		dbp->SQLGetDataStr(7,usertype);
		if(strcmp(otheruserid,"101")==0){
			int aa=0;
		}
		userinfo = userinfo+otheruserid+"$"+nickname+"$"+picture+"$"+usertype+"$"+status
				+"$"+tableid+"$"+tableseq+";";
	}
	dbp->SQLFreeStmt();
	//响应信息:是否获取成功(0:成功 1:失败)
	sprintf( recvnode.body, "%s;%s", "0", userinfo);
	this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
	this->WriteLog("body:%s",recvnode.body);
	if(recvnode.queuenum < 0) { //玩家为机器人
		svr_robot_queue->Insert(&recvnode);
	}else{
		svr_send_queue->Insert(&recvnode);
	}
	//更新用户状态
	sprintf( sqlbuf, "update gobang_userinfo set roomid='%s',tableid = 0,status='02' where userid='%s'",roomnum,userid);
	dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
	RadioRoomInfo(dbp,roomnum,"502");
	
}


⌨️ 快捷键说明

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