📄 wuziqidlg.cpp
字号:
rtiAmb.resignFederationExecution(RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES);//调用RTI的退出联盟函数
m_fedcount=0; //清除本盟员的盟员信息表
CRect rect;
GetClientRect(rect);
InvalidateRect(rect);
UpdateWindow();
}
catch(RTI::Exception &e)
{
AfxMessageBox(e._name);
}
}
void CWuziqiDlg::sendResignMsg(char *myname)
{
char newMessage[200];
int namelen=0,msglen=0;
RTI::ParameterHandleValuePairSet* parameters = RTI::ParameterSetFactory::create(2);
namelen=strlen(myname);
strcpy(newMessage,"resign");
msglen=strlen(newMessage);
parameters->add( m_parameterIdMessage, newMessage, msglen+1); //第一个参数置为"resign"
parameters->add( m_parameterIdFederateName,myname,namelen); //第二个参数置为盟员的name
//调用RTI的发送交互函数,第一个参数为交互类句柄,第二个参数为属性集,第三个参数为0
try
{
rtiAmb.sendInteraction(ms_commTypeId,*parameters,0);
}
catch (RTI::Exception &e )
{
AfxMessageBox(e._name);
}
delete parameters; //释放内存
}
void CWuziqiDlg::sendFedName(const char *myname)
{
int namelen=0,msglen=0;
char newMessage[200];
RTI::ParameterHandleValuePairSet* parameters=RTI::ParameterSetFactory::create(2);
namelen=strlen(myname);
strcpy(newMessage,"Fed's name"); //将参数0置为"Fed's name"
msglen=strlen(newMessage);
parameters->add( m_parameterIdMessage, newMessage, msglen+1); //参数0是message
parameters->add( m_parameterIdFederateName,myname,namelen);//将参数2置为本盟员name
//调用RTI的发送交互函数,第一个参数为交互类句柄,第二个参数为属性集,第三个参数为0
//AfxMessageBox("run to here");
try
{
rtiAmb.sendInteraction(ms_commTypeId,*parameters,0);
}
catch (RTI::Exception &e )
{
AfxMessageBox(e._name);
}
delete parameters; //释放内存
}
void CWuziqiDlg::sendCommInteraction(const char *strMessage)
{
char newMessage[200];
int msglen=0,namelen=0;
RTI::ParameterHandleValuePairSet* parameters = RTI::ParameterSetFactory::create(2);
// add parameters in order
// 0: message, 1: federateName
namelen=strlen(myname);
strcpy(newMessage,strMessage);
msglen=strlen(newMessage);
parameters->add( m_parameterIdMessage, newMessage, msglen+1); //将参数0置为消息的内容
parameters->add( m_parameterIdFederateName,myname,namelen); //将参数1置为本盟员name
//调用RTI的发送交互函数,第一个参数为交互类句柄,第二个参数为属性集,第三个参数为0
try
{
rtiAmb.sendInteraction(ms_commTypeId, *parameters,0);
}
catch (RTI::Exception &e )
{
AfxMessageBox(e._name);
}
delete parameters; //释放内存
}
void CWuziqiDlg::drawqipan(CDC *pDC, CPoint point)
{
CPoint tmppoint,tmp;
tmp=point;
pDC->MoveTo(point);
for(int i=0;i<=NUM_QIGE;i++)
{
pDC->MoveTo(tmp);
tmppoint.x=tmp.x;
tmppoint.y=tmp.y+NUM_QIGE*WIDTH_QIGE;
pDC->LineTo(tmppoint);
tmp.x=tmppoint.x+WIDTH_QIGE;
}
tmp=point;
for(i=0;i<=NUM_QIGE;i++)
{
pDC->MoveTo(tmp);
tmppoint.y=tmp.y;
tmppoint.x=tmp.x+NUM_QIGE*WIDTH_QIGE;
pDC->LineTo(tmppoint);
tmp.y=tmppoint.y+WIDTH_QIGE;
}
}
int CWuziqiDlg::judgewin(int x, int y, unsigned int color)
{
struct direction{
int x;
int y;
}d[4]={{0,1},{1,1},{1,0},{-1,1}};//四个方向
int num; //记录一个方向上相同的子数
int cx,cy;
for(int i=0; i<4; i++)
{
num= 1;
cx = x +d[i].x; //求一个方向上相同的子数
cy =y+d[i].y;
while(qipan[cx][cy]==color){
num++;
cx += d[i].x;
cy += d[i].y;
}
cx = x - d[i].x; //求反方向上相同的子数
cy = y - d[i].y;
while(qipan[cx][cy]==color){
num++;
cx -= d[i].x;
cy -= d[i].y;
}
if(num>=5)return 1;
}
return 0;
}
void CWuziqiDlg::receiveMessage( RTI::InteractionClassHandle theInteraction, // supplied C1
const RTI::ParameterHandleValuePairSet& theParameters, // supplied C4
const char *theTag)
throw
(
RTI::InteractionClassNotKnown,
RTI::InteractionParameterNotKnown,
RTI::FederateInternalError
)
{
try
{
if ( theInteraction == ms_commTypeId)
{
char winmessage[200];
char* message = ""; //message
char* federateName = ""; //federate name who send this interaction
unsigned long tmpLength=0;
// get parameters in order
message = theParameters.getValuePointer(0, tmpLength); // 0 is message
if(strcmp(message,"Fed's name")==0)
{
//AfxMessageBox("receive name");
federateName = theParameters.getValuePointer( 1, tmpLength); // 1 is federateName
federateName[ tmpLength ] = '\0';
for(int i=0;i<m_fedcount;i++)
if(!strcmp(fedmember[i].fedname,federateName))
break;
//若在自己的盟员表中查找不到发送方的名字,则说明有新的盟员加入
//则将新盟员的名字加入自己的盟员表中并把自己的名字发给新盟员
if(i>=m_fedcount)
{
strcpy(fedmember[m_fedcount].fedname,federateName);
m_fedcount++;
sendFedName(myname);
CRect rect;
GetClientRect(rect);
InvalidateRect(rect);//窗口局部刷新
UpdateWindow();
}
//否则若查到此名字,则说明是其他盟员发来的更新头像消息
}
//若受到其他盟员的退出联盟消息则将该盟员从其盟员信息表中删除
else if(!strcmp(message,"resign"))
{
federateName = theParameters.getValuePointer( 1, tmpLength); // 1 is federateName
federateName[ tmpLength ] = '\0';
for(int i=1;i<m_fedcount;i++)
if(!strcmp(fedmember[i].fedname,federateName))
break;
if(i<m_fedcount)
{
for(int j=i;j<=m_fedcount;j++) //退出联盟
{
strcpy(fedmember[j].fedname,fedmember[j+1].fedname);
}
m_fedcount--;
CRect rect;
GetClientRect(rect);
InvalidateRect(rect);//窗口局部刷新
UpdateWindow();
}
}
else if(!strcmp(message,"win"))
{
federateName = theParameters.getValuePointer( 1, tmpLength); // 1 is federateName
federateName[ tmpLength ] = '\0';
for(int i=1;i<m_fedcount;i++)
if(!strcmp(fedmember[i].fedname,federateName))
break;
if(i<m_fedcount)
{
strcpy(winmessage,fedmember[i].fedname);
strcat(winmessage," win!");
turnflag=0;
AfxMessageBox(winmessage);
CRect rect;
GetClientRect(rect);
InvalidateRect(rect);//窗口局部刷新
UpdateWindow();
}
}
//普通的交互信息
else
{
//AfxMessageBox("receive commmesg");
int cx,cy,msglen;
msglen=strlen(message);
federateName = theParameters.getValuePointer( 1, tmpLength); // 1 is federateName
federateName[ tmpLength ] = '\0';
for(int i=0;i<m_fedcount;i++)
if(!(strcmp(fedmember[i].fedname,federateName)))
break;
if(i<m_fedcount)
{
turnnum++;
CWuziqiDlg::coordinate *p;
CWuziqiDlg::coordinate tmp={0,0,0};
p=&tmp;
stringtostruct(message,msglen,p);
fedmember[i].color=p->color;
cx=p->x/WIDTH_QIGE-1;
cy=p->y/WIDTH_QIGE-1;
qipan[cx][cy]=p->color;
if(turnnum=m_fedcount)
{
turnflag=1;
turnnum=0;
}
CRect rect;
GetClientRect(rect);
InvalidateRect(rect);//窗口局部刷新
UpdateWindow();
}
}
}
}
catch (RTI::Exception& e)
{
AfxMessageBox(e._name);
}
}
void CWuziqiDlg::OnSelchangeComboColorsel()
{
// TODO: Add your control notification handler code here
CRect rect;
int flag=1;
char color[10];
m_colorsel.GetLBText(m_colorsel.GetCurSel(),color);
if(!strcmp(color,"蓝色"))
qizicolor=RGB(0,0,255);
else if(!strcmp(color,"黑色"))
qizicolor=RGB(0,0,0);
else if(!strcmp(color,"黄色"))
qizicolor=RGB(255,255,0);
else if(!strcmp(color,"红色"))
qizicolor=RGB(255,0,0);
if(qizicolor!=fedmember[0].color)
{
for(int i=0;i<m_fedcount;i++) //判断是否与其他盟友颜色一样
{
if(qizicolor==fedmember[i].color)
flag=0;
break;
}
if(flag)
fedmember[0].color=qizicolor;
}
}
void CWuziqiDlg::structtostring(CWuziqiDlg::coordinate *p1)
{
char x[60],y[20],color[20];
itoa(p1->x,x,10);
itoa(p1->y,y,10);
itoa(p1->color,color,10);
strcat(x,"&");
strcat(x,y);
strcat(x,"&");
strcat(x,color);
strcpy(commmessage,x);
}
void CWuziqiDlg::stringtostruct(char p1[], int n,CWuziqiDlg::coordinate *ziqiinfo)
{
int tmp1,tmp2,i,j;
char x[20],y[20],color[20];
for( i=0;i<n;i++)
{
if(p1[i]!='&')
{
x[i]=p1[i];
}
else
{
x[i]='\0';
tmp1=i;
break;
}
}
for(i=tmp1+1,j=0;i<n;i++,j++)
{
if(p1[i]!='&')
y[j]=p1[i];
else
{
y[j]='\0';
tmp2=i;
break;
}
}
for(i=tmp2+1,j=0;i<n;i++,j++)
{
if(p1[i]!='\0')
color[j]=p1[i];
else
{
color[j]='\0';
break;
}
}
//AfxMessageBox(x);
//AfxMessageBox(y);
//AfxMessageBox(color);
ziqiinfo->x=atoi(x);
ziqiinfo->y=atoi(y);
ziqiinfo->color=atoi(color);
}
void CWuziqiDlg::sendwinmsg(const char *myname)
{
int namelen=0,msglen=0;
char newMessage[200];
RTI::ParameterHandleValuePairSet* parameters=RTI::ParameterSetFactory::create(2);
namelen=strlen(myname);
strcpy(newMessage,"win"); //将参数0置为"Fed's name"
msglen=strlen(newMessage);
parameters->add( m_parameterIdMessage, newMessage, msglen+1); //参数0是message
parameters->add( m_parameterIdFederateName,myname,namelen);//将参数2置为本盟员name
//调用RTI的发送交互函数,第一个参数为交互类句柄,第二个参数为属性集,第三个参数为0
//AfxMessageBox("run to here");
try
{
rtiAmb.sendInteraction(ms_commTypeId,*parameters,0);
}
catch (RTI::Exception &e )
{
AfxMessageBox(e._name);
}
delete parameters; //释放内存
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -