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

📄 wuzidlg.cpp

📁 一个局域网的五子棋程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   }
   else//对方获胜消息
   {
m_Startpt.x = ((CPoint*)pbuf)->x;
		m_Startpt.y = ((CPoint*)pbuf)->y;
		
		m_Endpt.x =  ((CPoint*)(pbuf+sizeof(CPoint)))->x;
		m_Endpt.y =  ((CPoint*)(pbuf+sizeof(CPoint)))->y;

		delete pbuf;
		m_IsDown = FALSE;
		m_IsStart = FALSE;

		m_IsWin = TRUE;
		Invalidate();
		MessageBox("你输了!!!");
		//KillTimer(1);
		m_betime.SetWindowText("");
		m_IsWin = FALSE;
		InitAllInfo();
		Invalidate();
		
   }
}

}

void CWuziDlg::OnAccept()
{ 
	if(m_serconsock!=NULL)
	{
	m_serconsock.Close();
	}
	m_sersock.Accept(m_serconsock);
	CString str;
	GetParIp();
	str.Format("%s邀请游戏",m_parip);
	
    if (MessageBox(str,"提示",MB_YESNO)==IDYES)
	{
		m_run=TRUE;
		GetDlgItem(IDC_CONNECT)->EnableWindow(false);
        GetDlgItem(IDC_SEND)->EnableWindow(true);
GetDlgItem(IDC_IPADDRESS1)->EnableWindow(false);
GetDlgItem(IDC_CUT)->EnableWindow(true);
m_IsServer=TRUE;
GetDlgItem(IDC_START)->EnableWindow(false);
m_serconsock.Send("开始",4);

     
	}
else
{
GetDlgItem(IDC_CONNECT)->EnableWindow(true);
m_parip="";
m_serconsock.Send("拒绝",4);
m_serconsock.Close();
}
m_IsServer=TRUE;
}

void CWuziDlg::Send()
{

}




NODE* CWuziDlg::GetNode(CPoint pt)//通过坐标获得棋子编号
{
CPoint temp;
	
	for (int i = 0 ;i<row+1;i++)
		for (int j = 0; j<col+1;j++)
		{
			temp = nodes[i][j].m_Point;
			CRect rect(temp.x-10,temp.y-10,temp.x+10,temp.y+10);		
			if (rect.PtInRect(pt))//判断点是否在矩形中
				return &nodes[i][j];
		}
	return NULL;
}

void CWuziDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CPoint pt;
	
	pt=point;
	if(m_IsStart==FALSE)
	return;
	if(m_IsDown==TRUE)
	{
	NODE* temnode=GetNode(pt);
	if(temnode!=NULL)
	{
		if(temnode->m_Color==nNone)
		{
	

    m_IsDown=FALSE;
	if(m_IsServer)
	{
		temnode->m_Color=nWhite;
    OnPaint();
		m_serconsock.Send((void*)&temnode->m_Point,sizeof(temnode->m_Point));
		if (IsWin(temnode)!= NULL)
				{
					m_IsWin = TRUE;
					m_IsStart = FALSE;
					Invalidate();

					Sleep(1000);
					CPoint pts[2] = {m_Startpt,m_Endpt};					
					
					
					m_serconsock.Send(pts,sizeof(pts));
					
					MessageBox("恭喜你,赢了!!!");
					//KillTimer(1);
					m_betime.SetWindowText("");
					m_IsWin = FALSE;
					InitAllInfo();
					Invalidate();
				}
		GetDlgItem(IDC_START)->EnableWindow(true);
	}
	else
	{
		temnode->m_Color=nBlack;
    OnPaint();
		m_cliensock.Send((void*)&temnode->m_Point,sizeof(temnode->m_Point));
	if (IsWin(temnode)!= NULL)
				{
					m_IsWin = TRUE;
					m_IsStart = FALSE;
					Invalidate();

					Sleep(1000);
					CPoint pts[2] = {m_Startpt,m_Endpt};					
					
					
					m_cliensock.Send(pts,sizeof(pts));
					
					MessageBox("恭喜你,赢了!!!");
				//	KillTimer(1);
					m_betime.SetWindowText("");
					m_IsWin = FALSE;
					InitAllInfo();
					Invalidate();
				}
	}
	
		}
	}
	}
	CDialog::OnLButtonDown(nFlags, point);
}

void CWuziDlg::InitAllInfo()
{
for (int i = 0 ;i<row+1;i++)
		for (int j = 0; j<col+1;j++)
		{
			nodes[i][j].m_Color = nNone;	
		}
	//m_IsDown = TRUE;
	//OnPaint();
}

NODE* CWuziDlg::IsWin(NODE *pCur)
{
int num = 0; //计数

	m_Startpt = pCur->m_Point;
	m_Endpt = pCur->m_Point;

	//按垂直方向判断在当前节点按上下两个方向遍历	
	NODE* temp = pCur->m_pRecents[1]; //获得当前节点的上方节点
	
	while (temp != NULL && temp->m_Color==pCur->m_Color) //遍历上方节点
	{
		m_Startpt = temp->m_Point;
		num+=1;
		if (num>=4)
			return temp;
		temp = temp->m_pRecents[1];
	}

	temp = pCur->m_pRecents[6]; //获得当前节点的下方节点
	while (temp != NULL && temp->m_Color==pCur->m_Color) //遍历上方节点
	{
		m_Endpt = temp->m_Point;
		num+=1;
		if (num>=4)
			return temp;
		temp = temp->m_pRecents[6];
	}
	//按水平方向判断在当前节点,按左右两个方向遍历
	num = 0;
	temp = pCur->m_pRecents[3]; //遍历左节点
	while (temp != NULL && temp->m_Color==pCur->m_Color)
	{
		m_Startpt = temp->m_Point;
		num+=1;
		if (num>=4)
			return temp;
		temp = temp->m_pRecents[3];
	}

	temp = pCur->m_pRecents[4]; //遍历右节点
	while (temp != NULL && temp->m_Color==pCur->m_Color)
	{
		m_Endpt = temp->m_Point;
		num+=1;
		if (num>=4)
			return temp;
		temp = temp->m_pRecents[4];
	}

	//按135度斜角遍历
	num = 0;
	temp = pCur->m_pRecents[0]; //遍历斜上方节点
	while (temp != NULL && temp->m_Color==pCur->m_Color)
	{
		m_Startpt = temp->m_Point;
		num+=1;
		if (num>=4)
			return temp;
		temp = temp->m_pRecents[0];
	}

	temp = pCur->m_pRecents[7]; //遍历斜下方节点
	while (temp != NULL && temp->m_Color==pCur->m_Color)
	{
		m_Endpt = temp->m_Point;	
		num+=1;
		if (num>=4)
			return temp;
		temp = temp->m_pRecents[7];
	}	

	//按45度斜角遍历
	num = 0;
	temp = pCur->m_pRecents[2]; //遍历斜上方节点
	while (temp != NULL && temp->m_Color==pCur->m_Color)
	{
		m_Startpt = temp->m_Point;
		num+=1;
		if (num>=4)
			return temp;
		temp = temp->m_pRecents[2];
	}	
	temp = pCur->m_pRecents[5]; //遍历斜下方节点
	while (temp != NULL && temp->m_Color==pCur->m_Color)
	{
		m_Endpt = temp->m_Point;
		num+=1;
		if (num>=4)
			return temp;
		temp = temp->m_pRecents[5];
	}	
	return NULL;
}

void CWuziDlg::SetRecentNode(NODE *node)
{
	CPoint pt = node->m_Point;
//左上方的临近节点
	CPoint pt1 = CPoint(pt.x-cx,pt.y-cy);
	node->m_pRecents[0]= GetNodeFromPoint(pt1);
	//上方临近节点
	CPoint pt2 = CPoint(pt.x,pt.y-cy);
	node->m_pRecents[1]= GetNodeFromPoint(pt2);
	//右上方临近节点
	CPoint pt3 = CPoint(pt.x+cx,pt.y-cy);
	node->m_pRecents[2]= GetNodeFromPoint(pt3);

	//左方节点临近节点
	CPoint pt4 = CPoint(pt.x-cx,pt.y);
	node->m_pRecents[3]= GetNodeFromPoint(pt4);
	//右方节点临近节点
	CPoint pt5 = CPoint(pt.x+cy,pt.y);
	node->m_pRecents[4]= GetNodeFromPoint(pt5);
	//左下方临近节点
	CPoint pt6 = CPoint(pt.x-cx,pt.y+cy);
	node->m_pRecents[5]= GetNodeFromPoint(pt6);
	//下方临近节点
	CPoint pt7 = CPoint(pt.x,pt.y+cy);
	node->m_pRecents[6]= GetNodeFromPoint(pt7);
	//右下方临近节点
	CPoint pt8 = CPoint(pt.x+cx,pt.y+cy);
	node->m_pRecents[7]= GetNodeFromPoint(pt8);

}

NODE* CWuziDlg::GetNodeFromPoint(CPoint pt)
{
for (int i = 0 ;i<row+1;i++)
		for (int j = 0; j<col+1;j++)
		{
			if (nodes[i][j].m_Point==pt)
				return &nodes[i][j];
		}
	return NULL;
}

void CWuziDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	m_time="";
	CString str;
	SYSTEMTIME   CurTime;   
GetLocalTime(&CurTime);   

str.Format("%d:%02d:%02d",CurTime.wHour,CurTime.wMinute,CurTime.wSecond);  //加02保证显示两位数
m_time.Format("%02d-%02d-%02d %02d:%02d:%02d",CurTime.wYear,CurTime.wMonth,CurTime.wDay,CurTime.wHour,CurTime.wMinute,CurTime.wSecond);
	m_curtime.SetWindowText(str);

		CDialog::OnTimer(nIDEvent);
}

void CWuziDlg::OnClose()
{
	m_run=FALSE;
	if(m_serconsock!=NULL)
			m_serconsock.Close();
		if(m_cliensock!=NULL)
			m_cliensock.Close();
		m_cliensock.Create();
		//KillTimer(1);
		
	
		
		m_parip="";
		m_IsDown=FALSE;
		shu=1;
m_IsServer=TRUE;
m_betime.SetWindowText("");

	InitAllInfo();
		Invalidate();
GetDlgItem(IDC_CUT)->EnableWindow(false);
GetDlgItem(IDC_SEND)->EnableWindow(false);
GetDlgItem(IDC_START)->EnableWindow(true);
			GetDlgItem(IDC_CONNECT)->EnableWindow(true);
	GetDlgItem(IDC_IPADDRESS1)->EnableWindow(true);
}

void CWuziDlg::IsConnect(bool bl)
{
if(bl==true)
{
	MessageBox("连接成功");
m_run=TRUE;
m_IsServer=FALSE;
GetDlgItem(IDC_CUT)->EnableWindow(true);
}
  else
  {
	  MessageBox("连接失败");
	  m_sersock.Create(1000);
		 m_sersock.Listen();
	  GetDlgItem(IDC_IPADDRESS1)->EnableWindow(true);
  GetDlgItem(IDC_CONNECT)->EnableWindow(true);
m_cliensock.Close();
	m_cliensock.Create();
  }
}



void CWuziDlg::ShowMsg(CString str)//把信息显示在编辑框中
{
CString buf,timebuf;
buf+="\r\n";
timebuf=m_time+buf;
m_show+=timebuf+str+buf;
UpdateData(FALSE);
}

void CWuziDlg::GetHost()
{
char*name=new char[100];
CString str;
gethostname(name,100);
phost=gethostbyname(name);
for(int i=0;i<4;i++)
{
	CString addr;
	if(i>0)
		str+=".";
	addr.Format("%u",(unsigned int)((unsigned char*)phost->h_addr_list[0])[i]);
	str+=addr;
}
m_host=str;
}

void CWuziDlg::GetParIp()//获得套接字端地址
{
CString   strIP;   
  struct   sockaddr_in   sin;   
  memset((char*)&sin,0,sizeof(sin));   
int   addrlen=sizeof(sin);   
int   result=getpeername(m_serconsock,(struct sockaddr*)&sin,&addrlen);                           
        if(result!=SOCKET_ERROR)//如果没有错误   
  { strIP=inet_ntoa(sin.sin_addr);//获得与m_serconsock相连的端地址   
  
  }   
m_parip=strIP;
}


void CWuziDlg::OnCut() 
{
	// TODO: Add your control notification handler code here
	if (MessageBox("是否断开连接?","提示",MB_YESNO)==IDYES)
	{
	OnClose();
	
	}
	

}

BOOL CWuziDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
if(pMsg->wParam==VK_RETURN )
{  

      OnSend();
   return TRUE;
}


	return CDialog::PreTranslateMessage(pMsg);
}


void CWuziDlg::CreateFolder()
{

}


void CAboutDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	CDC* pDC = GetDC();//IDB_BITMAP2
	CBitmap bk;
	CDC memdc;
	memdc.CreateCompatibleDC(pDC);
	
	
	bk.LoadBitmap(IDB_BITMAP4);
	memdc.SelectObject(&bk);
	pDC->BitBlt(0,0,400,100,&memdc,0,0,SRCCOPY);
	// Do not call CDialog::OnPaint() for painting messages
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -