📄 gobangdeal.cpp
字号:
函数功能:用户站起
************************************************************************/
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 + -