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

📄 gobangdeal.cpp

📁 java程序五子棋源代码。 java程序五子棋源代码。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				dbp->SQLFreeStmt();
			 //更新用户和对手的游戏状态
				sprintf( sqlbuf, "update gobang_hallinfo set status = '01' where tableid = '%s' \
					and roomid='%s'", tableid,roomid);
				dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
			}
			CString strtemp;
			
			sprintf(recvnode.body,"0;%d;%s;%s",stepflag,countgroup,oppcountgroup);
			//更新棋盘表信息
			sprintf( sqlbuf, "update gobang_gameinfo set content = '%s',prestep='%s',stepnum=%d, \
				 Prefun = '00' where seqid='%s'", chesscontent,prethrstepstr,stepnum,seqnum);
			dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
			
			//发送下子响应信息
			if(recvnode.queuenum <= 0) { //玩家为机器人
					svr_robot_queue->Insert(&recvnode);
			}else{
					svr_send_queue->Insert(&recvnode);
			}
			
			//给对家响应
			strcpy(recvnode.operate_id,"509");
			strtemp.Format("%d;%d;%d;%d;%d;%s;%s",stepflag,stepnum,x,y,colorflag,oppcountgroup,countgroup);
			strcpy(recvnode.body,strtemp);
			//获取对家连接信息
			sprintf( sqlbuf, "select queuenum,ipaddress,connectport from Gobang_userinfo where roomid = '%s' \
				and tableid = '%s' and userid <> '%s'",roomid,tableid,userid);
			dbp->SQLExecDirect(sqlbuf,FALSE);
			if(dbp->SQLFetch() == PBL_Error_OK)
			{	
				dbp->SQLGetDataSInt(1,queuenum);
				dbp->SQLGetDataStr(2,ipaddress);
				dbp->SQLGetDataUInt(3,connectport);
				recvnode.queuenum=queuenum;
				recvnode.clientport = connectport;
				strcpy(recvnode.clientip,ipaddress);
				//给对家发送下子响应信息
				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);
				}
			}
			dbp->SQLFreeStmt();
		}
	}

}


//游戏中的用户放弃操作请求
void GobangDeal::GamingGiveUp(TDBPEx *dbp,NODE_STRUCT	recvnode){
	char sqlbuf[1024]={0};
	char *tempstr;
	char *body;
	short queuenum;
	ULONG connectport;
	CString ipaddress,seqnum,func;
	short stepnum,orignstepnum;
	CString presecstepstr="",prethistepstr="",prethrstepstr = "";
	char prestep[50]={0};
	CString userid,roomid,tableid;
	body = recvnode.body;
	tempstr=split(body,SUBDIVISION);
	userid = tempstr;
	tempstr=split(body,SUBDIVISION);
	stepnum = atoi(tempstr);
	tempstr=split(body,SUBDIVISION);
	roomid = tempstr;
	tempstr=split(body,SUBDIVISION);
	tableid = tempstr;
	seqnum = roomid+tableid;
	strcpy(recvnode.body,"0");
	svr_send_queue->Insert(&recvnode);
	strcpy(recvnode.operate_id,"510");
	//更新用户的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 prestep,stepnum,prefun from Gobang_gameinfo where seqid='%s'",seqnum);
	dbp->SQLExecDirect(sqlbuf,FALSE);
	if(dbp->SQLFetch() == PBL_Error_OK)
	{
		dbp->SQLGetDataStr(1,prethrstepstr);
		dbp->SQLGetDataSInt(2,orignstepnum);
		dbp->SQLGetDataStr(3,func);
		strcpy(prestep,prethrstepstr);
		char *temppre = prestep;
		tempstr=split(temppre,DIVISION);
		presecstepstr = tempstr;   //取倒数第二步
		tempstr=split(temppre,DIVISION);
		prethistepstr = tempstr;   //取倒数第三步
		prethrstepstr = "0;0;0|"+presecstepstr+"|"+prethistepstr;//设置前两步
		dbp->SQLFreeStmt();
		if(stepnum == orignstepnum){  //该数据是重发数据,且对家还没采取对应的动作
			return;
		}else if(stepnum < orignstepnum){ //该数据是重发数据,且对家已采取对应的动作,不过玩家没收到
			SalveDeal(dbp,recvnode,userid,roomid,tableid,orignstepnum,func);
			
		}else{
			//更新棋盘表信息
			sprintf( sqlbuf, "update gobang_gameinfo set prestep='%s',stepnum=%d, \
				 Prefun = '00' where seqid='%s'", prethrstepstr,stepnum,seqnum);
			dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
			//获取对家连接信息
			sprintf( sqlbuf, "select queuenum,ipaddress,connectport from Gobang_userinfo where roomid = '%s' \
				and tableid = '%s' and userid <> '%s'",roomid,tableid,userid);
			dbp->SQLExecDirect(sqlbuf,FALSE);
			if(dbp->SQLFetch()==PBL_Error_OK){
				dbp->SQLGetDataSInt(1,queuenum);
				dbp->SQLGetDataStr(2,ipaddress);
				dbp->SQLGetDataUInt(3,connectport);
			}
			dbp->SQLFreeStmt();
			recvnode.queuenum=queuenum;
			recvnode.clientport = connectport;
			strcpy(recvnode.clientip,ipaddress);
			sprintf(recvnode.body,"%d",stepnum);
			//给对家发送下子响应信息
			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::GamingRegret(TDBPEx *dbp,NODE_STRUCT	recvnode){
	char sqlbuf[1024]={0};
	char *tempstr;
	char *body;
	short queuenum;
	ULONG connectport;
	CString ipaddress,seqnum,func;
	short stepnum,orignstepnum;
	CString userid,roomid,tableid;
	body = recvnode.body;
	tempstr=split(body,SUBDIVISION);
	userid = tempstr;
	tempstr=split(body,SUBDIVISION);
	stepnum = atoi(tempstr);
	tempstr=split(body,SUBDIVISION);
	roomid = tempstr;
	tempstr=split(body,SUBDIVISION);
	tableid = tempstr;
	seqnum = roomid+tableid;
	strcpy(recvnode.operate_id,"524");
		//更新用户的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 stepnum,Prefun from Gobang_gameinfo where seqid='%s'",seqnum);
	dbp->SQLExecDirect(sqlbuf,FALSE);
	if(dbp->SQLFetch() == PBL_Error_OK)
	{
		dbp->SQLGetDataSInt(1,orignstepnum);
		dbp->SQLGetDataStr(2,func);
		dbp->SQLFreeStmt();
		if(stepnum == orignstepnum){  //该数据是重发数据,且对家还没采取对应的动作
			return;
		}else if(stepnum < orignstepnum){ //该数据是重发数据,且对家已采取对应的动作,不过玩家没收到
			SalveDeal(dbp,recvnode,userid,roomid,tableid,orignstepnum,func);
		}

		//更新棋盘表信息
		sprintf( sqlbuf, "update gobang_gameinfo set stepnum=%d,Prefun = '01' where seqid='%s'",stepnum,seqnum);
		dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
		//获取对家连接信息
		sprintf( sqlbuf, "select queuenum,ipaddress,connectport from Gobang_userinfo where roomid = '%s' \
			and tableid = '%s' and userid <> '%s'",roomid,tableid,userid);
		dbp->SQLExecDirect(sqlbuf,FALSE);
		if(dbp->SQLFetch()==PBL_Error_OK){
			dbp->SQLGetDataSInt(1,queuenum);
			dbp->SQLGetDataStr(2,ipaddress);
			dbp->SQLGetDataUInt(3,connectport);
		
		}
		dbp->SQLFreeStmt();
		recvnode.queuenum=queuenum;
		recvnode.clientport = connectport;
		strcpy(recvnode.clientip,ipaddress);
		sprintf(recvnode.body,"%d",stepnum);
		//给对家发送下子响应信息
		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::RegretRespond(TDBPEx *dbp,NODE_STRUCT	recvnode){
	char sqlbuf[1024]={0};
	char *tempstr;
	char *body;
	short queuenum;
	ULONG connectport;
	CString ipaddress,seqnum;
	short stepnum,orignstepnum;
	CString func;
	char chesscontent[227] = {0};
	CString chesstemp,prestepstr="",prethistepstr="";
	char prestep[50]={0};
	CString userid,oppmind,roomid,tableid;
	body = recvnode.body;
	tempstr=split(body,SUBDIVISION);
	userid = tempstr;
	tempstr=split(body,SUBDIVISION);
	stepnum = atoi(tempstr);
	tempstr=split(body,SUBDIVISION);
	oppmind = tempstr;
	tempstr=split(body,SUBDIVISION);
	roomid = tempstr;
	tempstr=split(body,SUBDIVISION);
	tableid = tempstr;
	seqnum = roomid+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 stepnum,Prefun from Gobang_gameinfo where seqid='%s'",seqnum);
	dbp->SQLExecDirect(sqlbuf,FALSE);
	if(dbp->SQLFetch() == PBL_Error_OK)
	{
		dbp->SQLGetDataSInt(1,orignstepnum);
		dbp->SQLGetDataStr(2,func);
		dbp->SQLFreeStmt();
		if(stepnum == orignstepnum){  //该数据是重发数据,且对家还没采取对应的动作
			return;
		}else if(stepnum < orignstepnum){ //该数据是重发数据,且对家已采取对应的动作,不过玩家没收到
			SalveDeal(dbp,recvnode,userid,roomid,tableid,orignstepnum,func);
		}else{
			//获取发起悔棋请求的用户信息
			sprintf( sqlbuf, "select queuenum,ipaddress,connectport from Gobang_userinfo where roomid = '%s' \
				and tableid = '%s' and userid <> '%s'",roomid,tableid,userid);
			dbp->SQLExecDirect(sqlbuf,FALSE);
			if(dbp->SQLFetch()==PBL_Error_OK){
				dbp->SQLGetDataSInt(1,queuenum);
				dbp->SQLGetDataStr(2,ipaddress);
				dbp->SQLGetDataUInt(3,connectport);
				dbp->SQLFreeStmt();
				//判断是否同意悔棋
				if(strcmp(oppmind,"0")==0){  //同意悔棋
					//获取棋盘中的前两步棋
					sprintf( sqlbuf, "select content,prestep 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,prestepstr);
						strcpy(prestep,prestepstr);
						int x1,y1,x2,y2,x3,y3;
						x3=y3=0;
						char *temppre = prestep;
						char *tempsecpre;
						tempstr=split(temppre,DIVISION);
						tempsecpre=split(tempstr,SUBDIVISION);
						x1 = atoi(tempsecpre);   //取前一步x
						tempsecpre=split(tempstr,SUBDIVISION);
						y1 = atoi(tempsecpre);   //取前一步y
						chesscontent[(x1-1)*15+y1] = '0';   //更改棋盘当前的状态
						tempstr=split(temppre,DIVISION);
						tempsecpre=split(tempstr,SUBDIVISION);
						x2 = atoi(tempsecpre);   //取倒数第二步x
						tempsecpre=split(tempstr,SUBDIVISION);
						y2 = atoi(tempsecpre);   //取倒数第二步y
						chesscontent[(x2-1)*15+y2] = '0';   //更改棋盘当前的状态
						tempstr=split(temppre,DIVISION);
						tempsecpre=split(tempstr,SUBDIVISION);
						if(strcmp(tempsecpre,"")!=0)
							x3 = atoi(tempsecpre);   //取倒数第三步x
						tempsecpre=split(tempstr,SUBDIVISION);
						if(strcmp(tempsecpre,"")!=0)
							y3 = atoi(tempsecpre);   //取倒数第三步y
						prestepstr.Format("%d;%d;%d;%d;%d;%d",x1,y1,x2,y2,x3,y3); //设置前三步
					}
					dbp->SQLFreeStmt();
					//更改数据库中的棋盘信息
					sprintf( sqlbuf, "update gobang_gameinfo set content = '%s',stepnum=%d,prefun = '02' \
						where seqid='%s'", chesscontent,stepnum,seqnum);
					dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);

					//发送倒数前两步数据
					strcpy(recvnode.body,prestepstr);
					strcpy(recvnode.operate_id,"534");
					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,"014");
					recvnode.queuenum=queuenum;
					recvnode.clientport = connectport;
					strcpy(recvnode.clientip,ipaddress);
					sprintf(recvnode.body,"0;%d;%s",stepnum,prestepstr);
					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_gameinfo set stepnum=%d,Prefun = '03' \
						where seqid='%s'",stepnum,seqnum);
					dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
					//给发起悔棋请求的用户发数据
					recvnode.queuenum=queuenum;
					recvnode.clientport = connectport;
					strcpy(recvnode.clientip,ipaddress);
					sprintf(recvnode.body,"1;%d",stepnum);
					strcpy(recvnode.operate_id,"014");
					//给对家发送下子响应信息
					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);
					}

				}

			}
	
		}
	}
}

//游戏中的对对家求和请求的响应

⌨️ 快捷键说明

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