📄 robotdeal.cpp
字号:
//没有子
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 + -