📄 wuzidlg.cpp
字号:
}
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 + -