📄 gobangdeal.cpp
字号:
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 + -