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

📄 wuziqidlg.cpp

📁 基于BHRTI开发环境的简单五子棋游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -