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

📄 robotdeal.cpp

📁 java程序五子棋源代码。 java程序五子棋源代码。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	//没有子
	x = y = 0;
	if(stepnum==2){//对家一开始游戏就放弃
		fivestone.points[8][8] = 2;
		chesscontent[113] = '2';
		x=y=8;
		char temp1[50]={0};
		sprintf(temp1,"%s;%s;%d;8;8;2",userid,seqnum,stepnum);
		strcpy(recvNode.body,temp1);
	}else{
		if (colorflag == 1)    //计算机先走
			fivestone.getpoint(x,y,1,false);
		else 
			fivestone.getpoint(x,y,2,false);
		if (x!=0) 
		{	
			stepnum++;
			if (colorflag == 1) 
			{
				fivestone.points[x][y] = 1;
				chesscontent[(x-1)*15+y] = '1';
				char temp1[50]={0};
				sprintf(temp1,"%s;%s;%d;%d;%d;1",userid,seqnum,stepnum,x,y);
				strcpy(recvNode.body,temp1);
			}
			else 
			{
				fivestone.points[x][y] = 2;
				chesscontent[(x-1)*15+y] = '2';
				char temp1[50]={0};
				sprintf(temp1,"%s;%s;%d;%d;%d;2",userid,seqnum,stepnum,x,y);
				strcpy(recvNode.body,temp1);
			}
		}
	}
		AddMsg("计算机走棋%s:(%d,%d)!",userid,x,y);	
		sprintf(sqlbuf,"update gobang_robotinfo set content='%s' where userid='%s'",chesscontent,userid);
		dbp->SQLExecDirect(sqlbuf,true,true);
		//	Sleep(5000);
			//把服务程序处理好后的棋盘状态等信息放入共享内存
		strcpy(recvNode.operate_id,"009");
		if(svr_send_queue->Insert(&recvNode) == FALSE){
			AddMsg("写发送共享内存错误!");
		}

}

//对家请求悔棋
void  RobotDeal::OppRegret(TDBPEx *dbp,NODE_STRUCT recvNode){
	char sqlbuf[1024]={0};
	char *tempstr;
	CString userid;
	int stepnum;
	CString roomid,tableid,tableseq;
	int tempid = 0 - recvNode.queuenum;
	char *body;
	body = recvNode.body;
	tempstr = split(body,SUBDIVISION);
	stepnum = atoi(tempstr);
	stepnum++;
	userid.Format("%d",tempid);
	//获取机器人的信息
	sprintf(sqlbuf,"select roomid,tableid from gobang_robotinfo where userid = '%s'",userid);
	dbp->SQLExecDirect(sqlbuf,false);
	if(dbp->SQLFetch() == PBL_Error_OK){
		dbp->SQLGetDataStr(1,roomid);
		dbp->SQLGetDataStr(2,tableid);
	}
	dbp->SQLFreeStmt();
	sprintf(recvNode.body,"%s;%d;1;%s;%s",userid,stepnum,roomid,tableid);
	if(svr_send_queue->Insert(&recvNode) == FALSE){

	}
		
}

//对家请求和棋操作
void  RobotDeal::OppRequestTie(TDBPEx *dbp,NODE_STRUCT recvNode){
	char sqlbuf[1024]={0};
	char *tempstr;
	CString userid;
	int stepnum;
	char *body;
	CString roomid,tableid,tableseq;
	int tempid = 0 - recvNode.queuenum;
	body = recvNode.body;
	tempstr = split(body,SUBDIVISION);
	stepnum = atoi(tempstr);
	stepnum++;
	userid.Format("%d",tempid);
	//获取机器人的信息
	sprintf(sqlbuf,"select roomid,tableid from gobang_robotinfo where userid = '%s'",userid);
	dbp->SQLExecDirect(sqlbuf,false);
	if(dbp->SQLFetch() == PBL_Error_OK){
		dbp->SQLGetDataStr(1,roomid);
		dbp->SQLGetDataStr(2,tableid);
	}
	dbp->SQLFreeStmt();
	sprintf(recvNode.body,"%s;%d;1;%s;%s",userid,stepnum,roomid,tableid);
	if(svr_send_queue->Insert(&recvNode) == FALSE){

	}
}

//对家认输请求
void  RobotDeal::OppSurrender(TDBPEx *dbp,NODE_STRUCT recvNode){
	char sqlbuf[1024]={0};
	char chesscontent[227] = {0};
	CString chesstemp;
	CString userid;
	CString roomid,tableid,tableseq;
	int tempid = 0 - recvNode.queuenum;
	userid.Format("%d",tempid);
	
	//获取机器人的信息
	sprintf(sqlbuf,"select roomid,tableid,tableseq from gobang_robotinfo where userid = '%s'",userid);
	dbp->SQLExecDirect(sqlbuf,false);
	if(dbp->SQLFetch() == PBL_Error_OK){
		dbp->SQLGetDataStr(1,roomid);
		dbp->SQLGetDataStr(2,tableid);
		dbp->SQLGetDataStr(3,tableseq);
	}
	dbp->SQLFreeStmt();
	//初始化棋盘
	chesscontent[0] = '0';
	for(int i = 1; i < 16 ; i++) //初始化棋盘
		for(int j = 1; j < 16 ; j++)
		{
			chesscontent[(i-1)*15+j] = '0';
		}
		chesscontent[226] = '\0';
	//更新用户状态
	sprintf(sqlbuf,"update gobang_robotinfo set content='%s',colorflag = 3-colorflag \
		where userid='%s'",chesscontent,userid);
	dbp->SQLExecDirect(sqlbuf,true,true);
	strcpy(recvNode.operate_id,"007");   //用户准备好
	sprintf(recvNode.body,"%s;%s;%s;%s",userid,roomid,tableid,tableseq);
	if(svr_send_queue->Insert(&recvNode) == FALSE){
	}
}

//所有机器人退出房间
void RobotDeal::RobotDealExit(){
	char sqlbuf[1024]={0};
	UINT exitcode;
	TDBPEx * dbp;  //
	NODE_STRUCT offlinenode;
	CString userid;
	memset(&offlinenode,0,sizeof offlinenode);
	strcpy(offlinenode.err_code,"000");
	strcpy(offlinenode.service_id,"001");
	strcpy(offlinenode.operate_id,"012");
	dbp = new TDBPEx("GobangRobot",database,dbusername,dbpassword,logdir);
	if (dbp && dbp->IsReady())
	{
		AddMsg(" 创建机器人退出dbp对象成功!");
	}
	else
	{
		AddMsg("创建机器人退出dbp对象失败!");
	}
	dbp->Run();
	if (dbp->Connect() == PBL_Error_FAIL)
	{
		AddMsg("[RobotDeal]: dbp连接数据库失败!");
	}
	else
	{
		AddMsg("[RobotDeal]:  dbp连接数据库成功!");
	}
	strcpy(sqlbuf,"select userid,roomid,tableid,tableseq from gobang_robotinfo where status != '0'");
	dbp->SQLExecDirect(sqlbuf,FALSE);
	while(dbp->SQLFetch() == PBL_Error_OK){
		dbp->SQLGetDataStr(1,userid);
		strcpy(offlinenode.body,userid);
		svr_send_queue->Insert(&offlinenode);  //向服务程序发送用户退出通知
	}
	dbp->SQLFreeStmt();
	dbp->DisConnect();

	//结束线程
	for(int i = 0; i < threadnum; i++)
	{
		TerminateThread(pRecvThread[i],exitcode);
	}
}

/*****************************************************
函数名:	split
输入参数:	char* &text,const char *seps
返回值:	每次分割得到的字符串
功能描述:	将字符串text使用seps进行分割
			例如:	text = "123;456;;789"
					seps = ";"
			结果:	123
					456

					789
使用方法:
			char* input = text;
			char* output = NULL;
			while( input != NULL )
			{
				output = split( input, seps );
				printf( " %s\n", output );
			}
注意:		输入参数text将被改变
*****************************************************/
char* split(char* &text,const char *seps)
{
	if(text == NULL){
		return NULL;
	}
	char* ret = text;
	char* tmp = strstr(text,seps);
	if (tmp != NULL)
	{
		text = tmp + strlen(seps);
		*tmp = '\0';
	}
	else
		text = NULL;
	return ret;
}







//五子棋服务程序处理线程
UINT RecvThreadFunc(LPVOID pParam)
{
	char sqlbuf[1024]={0};
	time_t tCurTime,tPreTime=time(NULL);
	BOOL first = false;//表示计算机是否先走
	HANDLE cvscThread = NULL;
	int threadno;     //表示当前线程编号
	CString database,dbusername,dbpassword,logdir;
	CString userid;
	BOOL stop=true;
	int nNodeLength; 	//判断存在共享内存的节点数
	char chesscontent[227] = {0};
	CString chesstemp;
	char			service_id[NODE_SERVICEID_LENGTH];			//业务代码
	char			operate_id[NODE_OPERATEID_LENGTH];			//各业务操作码(00:表示进入房间,01:表示用户离开房间  02:表示开始游戏	03:表示游戏操作
	NODE_STRUCT recvNode,offlinenode;
	TDBPEx * dbp;
	RobotDeal *robotdeal=(RobotDeal *)pParam;
	memset(&recvNode,0,sizeof recvNode);
	memset(&offlinenode,0,sizeof offlinenode);
	strcpy(offlinenode.err_code,"000");
	strcpy(offlinenode.service_id,"001");
	strcpy(offlinenode.operate_id,"012");
	threadno = robotdeal->GetThreadNo();
	robotdeal->GetDataBasepara(database,dbusername,dbpassword,logdir);
	//创建数据库连接对象
	dbp = new TDBPEx("RobotDealThread"+threadno,database,dbusername,dbpassword,logdir);
	if (dbp && dbp->IsReady())
	{
		robotdeal->AddMsg("线程%d 创建dbp对象成功!",threadno);
	}
	else
	{
		robotdeal->AddMsg("线程%d 创建dbp对象失败!",threadno);
	}
	dbp->Run();
	while(true)
	{
		if (dbp)
		{
		
			if (!dbp->IsConnect())
			{
				if (dbp->Connect() == PBL_Error_FAIL)
				{
					robotdeal->AddMsg("[RecvThreadFunc]:线程%d dbp连接数据库失败!",threadno);
					Sleep(1000);
					continue;
				}
				else
				{
					robotdeal->AddMsg("[RecvThreadFunc]:线程%d dbp连接数据库成功!",threadno);
				}
			}
		}
		
		tCurTime = time(NULL);
		if(tCurTime - tPreTime>60){//每两分钟检测一下有没用户断线
			strcpy(sqlbuf,"update gobang_hallinfo set onlineflag=onlineflag+1 \
				where userid not in(select userid from gobang_robotinfo)");
			dbp->SQLExecDirect(sqlbuf,true,true);
			strcpy(sqlbuf,"select userid from  gobang_hallinfo where onlineflag>=3");
			dbp->SQLExecDirect(sqlbuf,false);
			while(dbp->SQLFetch() == PBL_Error_OK){
				dbp->SQLGetDataStr(1,userid);
				strcpy(offlinenode.body,userid);
				svr_send_queue->Insert(&offlinenode);  //向服务程序发送用户断线通知
			}
			dbp->SQLFreeStmt();
			tPreTime =  time(NULL);
		}
		nNodeLength = svr_recv_queue->GetLength();
		if(nNodeLength == 0){
			Sleep(100);
			continue;
		} 
		nNodeLength = svr_recv_queue->GetNodes(&recvNode,1);
		if(nNodeLength != 0)
		{
			strcpy(service_id, recvNode.service_id);
			strcpy(operate_id, recvNode.operate_id);
			
		}
		else
		{
			continue;
		}
		if(strcmp(operate_id,"000") == 0)   //获取房间列表响应
		{
			robotdeal->GetRoomListRespond(dbp,recvNode.body,recvNode.queuenum);
		}
		else if(strcmp(operate_id,"002") == 0)   //获取大厅信息响应
		{
			robotdeal->GetHallInfoRespond(dbp,recvNode.body,recvNode.queuenum);
		}
		else if(strcmp(operate_id,"003")==0)   //退出房间响应
		{
			robotdeal->ToExitRoomRespond(dbp,recvNode.body,recvNode.queuenum);
		}
		else if(strcmp(operate_id,"004")==0)   //用户坐下响应
		{
			robotdeal->UserSitRespond(dbp,recvNode.body,recvNode.queuenum);
		}
		else if(strcmp(operate_id,"005")==0)   //用户站起响应
		{
			robotdeal->UserUpRespond(dbp,recvNode.body,recvNode.queuenum);
		}
		else if(strcmp(operate_id,"007")==0){  //用户准备好响应
			robotdeal->UserReadyRespond(dbp,recvNode.body,recvNode.queuenum);
		}
		else if(strcmp(operate_id,"008")==0){  //用户开始游戏响应
			robotdeal->UserStartRespond(dbp,recvNode.body,recvNode.queuenum);
		}
		else if(strcmp(operate_id,"504")==0)   //对家坐下响应
		{
			robotdeal->OppSitRespond(dbp,recvNode.body,recvNode.queuenum);
		}
		else if(strcmp(operate_id,"505")==0)   //对家站起响应
		{
			robotdeal->OppUpRespond(dbp,recvNode);
		}
		else if(strcmp(operate_id,"507")==0){  //对家准备好响应
			robotdeal->OppReadyRespond(dbp,recvNode.body,recvNode.queuenum);
		}
		else if(strcmp(operate_id,"508")==0){  //对家开始游戏响应
			robotdeal->OppStartRespond(dbp,recvNode);
		}	
		else if(strcmp(operate_id,"509")==0){  //对家走子响应
			robotdeal->OppPlayRespond(dbp,recvNode);
		
		}else if(strcmp(operate_id,"009")==0){  //用户走子响应
			robotdeal->UserPlayRespond(dbp,recvNode);
	
		}else if(strcmp(operate_id,"510")==0){  //对家放弃下子
			robotdeal->OppGiveUp(dbp,recvNode);

		}else if(strcmp(operate_id,"524")==0){  //对家悔棋请求
			robotdeal->OppRegret(dbp,recvNode);

		}else if(strcmp(operate_id,"525")==0){  //对家求和请求
			robotdeal->OppRequestTie(dbp,recvNode);
		
		}else if(strcmp(operate_id,"513")==0){  //对家认输请求
			robotdeal->OppSurrender(dbp,recvNode);
		}
		
		
	}

	return 0;
}


⌨️ 快捷键说明

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