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

📄 gobangdeal.cpp

📁 java程序五子棋源代码。 java程序五子棋源代码。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
函数功能:用户站起

************************************************************************/
void GobangDeal::UserUp(TDBPEx *dbp,NODE_STRUCT recvnode){ 
	char sqlbuf[1024]={0};
	char *tempstr;
	char *body;
	CString tableid,tableseq,status;
	CString userid,roomnum,userinfo="";
	body = recvnode.body;
	tempstr=split(body,SUBDIVISION);
	userid = tempstr;
	tempstr=split(body,SUBDIVISION);
	roomnum = tempstr;
	tempstr=split(body,SUBDIVISION);
	tableid = tempstr;
	tempstr=split(body,SUBDIVISION);
	tableseq = 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, "update gobang_hallinfo set status='00',tableid='0',tableseq='' where userid='%s'",userid);
	dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
	//更新五子棋信息表中用户信息
	sprintf( sqlbuf, "update gobang_userinfo set status='02',tableid='0',tableseq='' where userid='%s'",userid);
	dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
	//响应信息:(0:成功 1:失败)
	sprintf( recvnode.body, "%s;", "0");
	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);
	}
	
	//给其他同房间用户发送信息
	strcpy(recvnode.operate_id,"505");
	userinfo =  userid+";"+tableid+";"+tableseq;
	//获取所有在房间里的用户
	SendRoomUser(dbp,recvnode,userinfo,userid,roomnum);
}


/************************************************************************
函数功能:用户准备好请求

************************************************************************/
void GobangDeal::UserReady(TDBPEx *dbp,NODE_STRUCT recvnode){ 
	char sqlbuf[1024]={0};
	char *tempstr;
	char *body;
	CString tableid,tableseq,opptableid;
	CString oppuserid,userid,roomnum,status="",userinfo="";
	body = recvnode.body;
	tempstr=split(body,SUBDIVISION);
	userid = tempstr;
	tempstr=split(body,SUBDIVISION);
	roomnum = tempstr;
	tempstr=split(body,SUBDIVISION);
	tableid = tempstr;
	tempstr=split(body,SUBDIVISION);
	tableseq = tempstr;
	CString seqid = roomnum + tableid;
	//更新用户的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,status from Gobang_hallinfo where roomid = '%s' \
			and tableid = '%s' and userid <>  '%s'",roomnum,tableid,userid);
	dbp->SQLExecDirect(sqlbuf,FALSE);
	if(dbp->SQLFetch() == PBL_Error_OK){
		dbp->SQLGetDataStr(1,oppuserid);
		dbp->SQLGetDataStr(2,status);
	}
	dbp->SQLFreeStmt();
	userinfo =  oppuserid+";"+tableid+";"+tableseq+";";
	if(strcmp(status,"03")==0){ //对家已经开始游戏
			//下面从数据库中取出已经进行中的棋盘内容和前两步棋的内容。
		sprintf(sqlbuf,"select Prefun from Gobang_gameinfo where seqid='%s'",seqid);
		dbp->SQLExecDirect(sqlbuf,FALSE);
		if(dbp->SQLFetch() == PBL_Error_OK)
		{
			CString func="";
			dbp->SQLGetDataStr(1,func);
		 	SalveDeal(dbp,recvnode,userid,roomnum,tableid,0,func);
		}
	}else if(strcmp(status,"02")==0){  //对家已经准备好,游戏开始
		strcpy(recvnode.operate_id,"508");
		//更新大厅信息表中用户信息
		sprintf( sqlbuf, "update gobang_hallinfo set status='03' where roomid='%s' and tableid ='%s'",roomnum,tableid);
			if(dbp->SQLExecDirect(sqlbuf,TRUE,TRUE)==PBL_Error_OK){
			sprintf( recvnode.body, "%s", userinfo);  	//响应信息:(0:成功 1:失败)
		}
		else{
				sprintf( recvnode.body, "%s", "1");  	//响应信息:(0:成功 1:失败)
		}
		
		//初始化棋盘
		Qipaninit(dbp,seqid);
		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);
		}
			
	}else{  //对家没准备好
		//更新大厅信息表中用户信息
		sprintf( sqlbuf, "update gobang_hallinfo set status='02' where userid='%s'",userid);
		if(dbp->SQLExecDirect(sqlbuf,TRUE,TRUE)==PBL_Error_OK){
			sprintf( recvnode.body, "%s;", "0");  	//响应信息:(0:成功 1:失败)
		}
		else{
				sprintf( recvnode.body, "%s;", "1");  	//响应信息:(0:成功 1:失败)
		}
		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);
		}
		//给其他同房间用户发送信息
		strcpy(recvnode.operate_id,"507");
	}
	userinfo =  userid+";"+tableid+";"+tableseq;
	SendRoomUser(dbp,recvnode,userinfo,userid,roomnum);
	

}



/************************************************************************
函数功能:用户开始游戏请求

************************************************************************/
void GobangDeal::UserStart(TDBPEx *dbp,NODE_STRUCT recvnode){ 
	char sqlbuf[1024]={0};
	char *tempstr;
	char *body;
	CString tableid,tableseq,opptableid;
	CString userid,roomnum,userinfo="";
	body = recvnode.body;
	tempstr=split(body,SUBDIVISION);
	userid = tempstr;
	tempstr=split(body,SUBDIVISION);
	roomnum = tempstr;
	tempstr=split(body,SUBDIVISION);
	tableid = tempstr;
	tempstr=split(body,SUBDIVISION);
	tableseq = 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, "update gobang_hallinfo set status='03' where userid='%s'",userid);
	dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
	sprintf( recvnode.body, "%s;", "0");  	//响应信息:(0:成功 1:失败)
	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);
	}
	//初始化棋盘
	CString seqid = roomnum + tableid;
	Qipaninit(dbp,seqid);
	
	//给其他同房间用户发送信息
	strcpy(recvnode.operate_id,"508");
	userinfo =  userid+";"+tableid+";"+tableseq;
	SendRoomUser(dbp,recvnode,userinfo,userid,roomnum);
}



/************************************************************************
函数功能:用户下子操作

************************************************************************/
void GobangDeal::UserPlay(TDBPEx *dbp,NODE_STRUCT recvnode){
	char sqlbuf[1024]={0};
	char *tempstr=NULL;
	int points[16][16] = {0};//所有的子,1代表黑色棋,2代表白色棋,0代表没有子
	char *body = NULL;
	short queuenum;
	ULONG connectport;
	NODE_STRUCT toothernode;  //给房间里其他用户发送信息的节点
	CString oppcountgroup="",countgroup="";
	CString integral,gamelevel,Allcount,wincount;
	CString equalcount,failcount;
	char chesscontent[227] = {0};
	CString chesstemp,presecstepstr="",prethistepstr="",prethrstepstr = "";
	char prestep[50]={0};
	CString seqnum;
	short stepnum,orignstepnum;
	CString roomid,tableid,ipaddress;
	CString func;
	int x,y,colorflag,stepflag;
	CString userid,roomnum,userinfo="";
	body = recvnode.body;
	tempstr=split(body,SUBDIVISION);
	userid = tempstr;
	tempstr=split(body,SUBDIVISION);
	seqnum = tempstr;
	tempstr=split(body,SUBDIVISION);
	stepnum = atoi(tempstr);
	tempstr=split(body,SUBDIVISION);
	x = atoi(tempstr);
	tempstr=split(body,SUBDIVISION);
	y = atoi(tempstr);
	tempstr=split(body,SUBDIVISION);
	colorflag = atoi(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 roomid,tableid from Gobang_userinfo where userid = '%s'",userid);
	dbp->SQLExecDirect(sqlbuf,FALSE);
	if(dbp->SQLFetch() == PBL_Error_OK){
		dbp->SQLGetDataStr(1,roomid);
		dbp->SQLGetDataStr(2,tableid);
		
	}
	dbp->SQLFreeStmt();
	WriteLog("sdfsdfdsfdfd2:  %s",recvnode.body);
	//下面从数据库中取出已经进行中的棋盘内容和前两步棋的内容。
	sprintf(sqlbuf,"select content,prestep,stepnum,Prefun from Gobang_gameinfo where seqid='%s'",seqnum);
	dbp->SQLExecDirect(sqlbuf,FALSE);
	if(dbp->SQLFetch() == PBL_Error_OK)
	{
		dbp->SQLGetDataStr(1,chesstemp);
		strcpy(chesscontent,chesstemp);
		dbp->SQLGetDataStr(2,prethrstepstr);
		dbp->SQLGetDataSInt(3,orignstepnum);
		dbp->SQLGetDataStr(4,func);
		strcpy(prestep,prethrstepstr);
		char *temppre = prestep;
		tempstr=split(temppre,DIVISION);
		presecstepstr = tempstr;   //取倒数第二步
		tempstr=split(temppre,DIVISION);
		prethistepstr = tempstr;   //取倒数第三步
		CString prefirstep="";
		prefirstep.Format(_T("%d;%d;%d|"),x,y,colorflag);
		prethrstepstr = prefirstep+presecstepstr+"|"+prethistepstr;//设置前三两步
		dbp->SQLFreeStmt();
		if(stepnum == orignstepnum){  //该数据是重发数据,且对家还没采取对应的动作
			return;
		}else if(stepnum < orignstepnum){ //该数据是重发数据,且对家已采取对应的动作,不过玩家没收到
			SalveDeal(dbp,recvnode,userid,roomid,tableid,orignstepnum,func);
		}else{
			points[0][0] = '0';
			for(int i = 1; i < 16 ; i++)
				for(int j = 1; j < 16 ; j++)
				{
					points[i][j] = chesscontent[(i-1)*15+j]-48;
				}
			chesscontent[(x-1)*15+y] = colorflag+48;   //更改棋盘当前的状态
			stepflag = 0;
			if(has_five(points,x,y,colorflag)){ //判断是否已经获胜
				stepflag = colorflag;
				//更新用户的统计数据
				sprintf( sqlbuf,"update gobang_userinfo set allcount = allcount+1,wincount = wincount+1,\
					integral = integral+2 where userid = '%s'",userid);
				dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);

				//更新对手的统计数据
				sprintf( sqlbuf,"update gobang_userinfo set allcount = allcount+1,failcount = failcount+1,\
					integral = integral-2 where userid <>'%s'  and tableid = '%s' and roomid = '%s'",
					userid,tableid,roomid);
				dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
				
				
				
			}else if(has_tie(points)){//是否平棋
				stepflag = 3;
				//更新双方的统计数据
				sprintf( sqlbuf,"update gobang_userinfo set allcount = allcount+1,equalcount = equalcount+1 \
					 where and tableid = '%s' and roomid = '%s'",
					userid,tableid,roomid);
				dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
			}
			if(stepflag!=0){//一盘游戏结束
				//通知房间里的其他用户
				memset(&toothernode,0,sizeof toothernode);
				strcpy(toothernode.err_code,"000");
				strcpy(toothernode.service_id,"001");
				strcpy(toothernode.operate_id,"519");
				strcpy(toothernode.body,tableid);
				sprintf(sqlbuf,"select queuenum, ipaddress,connectport from gobang_userinfo where roomid = '%s' \
					and tableid <> '%s'",roomid,tableid);
				dbp->SQLExecDirect(sqlbuf,false);
				while (dbp->SQLFetch()==PBL_Error_OK) {
					dbp->SQLGetDataSInt(1,queuenum);
					dbp->SQLGetDataStr(2,ipaddress);
					dbp->SQLGetDataUInt(3,connectport);
					toothernode.queuenum=queuenum;
					toothernode.clientport = connectport;
					strcpy(toothernode.clientip,ipaddress);
								
				//发送响应信息
					if(recvnode.queuenum <= 0) { //玩家为机器人
							svr_robot_queue->Insert(&toothernode);
					}else{
							svr_send_queue->Insert(&toothernode);
					}
				}
				
				dbp->SQLFreeStmt();
				//获取用户的统计
				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;
				}
				dbp->SQLFreeStmt();
				//获取对手的统计
				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' \
				   and tableid='%s' and roomid='%s'",userid,tableid,roomid);
				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);
					oppcountgroup =integral+"$"+gamelevel+"$"+Allcount+"$"+wincount+"$"+failcount+"$"+equalcount;
				}

⌨️ 快捷键说明

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