首    页 界面/窗口 网络/通讯 数据库 组件开发 图像/多媒体 NET/Web 其它技术 源码下载 资料下载 软件共享 软件外包 曲艺杂谈
栏目导航:  首    页  |  网络/通讯  |  棋牌游戏


联网五子棋程序


原作者:不详    源出处:VCer    发布者:施昌权    发布类型:转载    发布日期:2009-03-21


  

效果图

  
   支持两人联网的五子棋程序。

   代码不错,张贴部分示例一下:

    • ////////////////////////////////////////////////////////////////////////////   
    • //同时负责己方和对方落子后棋盘的更新,由g_bData判断是上述哪种情况         //   
    • ////////////////////////////////////////////////////////////////////////////   
    • void CAppleChessDlg::OnLButtonDown(UINT nFlags, CPoint point)    
    • {   
    •     if( g_bStart && !m_bFinish)   
    •     {   
    •         CPoint ptOrigin;   
    •         int counter;   
    •         if( !g_bData )   
    •         {   
    •             if( m_bIsBlack != g_bOwnBlack ) return;   
    •             if((point.x < 15) || (point.x > 255) || (point.y < 15) || (point.y >255))    
    •             {   
    •                 m_strState = "请在棋盘内落子";    
    •                 UpdateData(FALSE);   
    •                 return;   
    •             }   
    •             ptOrigin.x = (point.y - 15) / 30;   
    •             ptOrigin.y = (point.x - 15) / 30;   
    •                
    •             if(m_nChessArray[ptOrigin.x][ptOrigin.y] != 0)    
    •             {   
    •                 m_strState = "请在空格处下子";   
    •                 UpdateData(FALSE);   
    •                 return;   
    •             }   
    •             counter = Check(ptOrigin);   
    •             if(counter == 0)    
    •             {      
    •                 m_bIsBlack ? (m_strState = "黑方:") : (m_strState = "白方:");   
    •                 m_strState = m_strState + "\r\n不构成杀棋,请重新下子";   
    •                 UpdateData(FALSE);   
    •                 return;   
    •             }   
    •             g_acRecvBuf[0] = (char)ptOrigin.x;   
    •             g_acRecvBuf[1] = (char)ptOrigin.y;   
    •             g_acRecvBuf[2] = (char)(ptOrigin.x + ptOrigin.y);   
    •             g_socket.SendData(g_acRecvBuf);   
    •         }   
    •         else  
    •         {   
    •             counter = Check(CPoint(g_acRecvBuf[0],g_acRecvBuf[1]));   
    •             ptOrigin.x = g_acRecvBuf[0];   
    •             ptOrigin.y = g_acRecvBuf[1];   
    •         }   
    •   
    •         CString temp;   
    •         temp.Format("(%d, %d)\n", ptOrigin.x, ptOrigin.y);   
    •         TRACE(temp);   
    •   
    •         CClientDC dc(this);   
    •         CBrush brushWhite, brushBlack, *pOldBrush;   
    •         brushWhite.CreateSolidBrush(RGB(255, 255, 255));   
    •         brushBlack.CreateSolidBrush(RGB(0, 0, 0));   
    •         if(m_bIsBlack)   
    •             pOldBrush = dc.SelectObject(&brushBlack);   
    •         else  
    •             pOldBrush = dc.SelectObject(&brushWhite);   
    •         CPoint ptDest, ptTemp;   
    •         for(int i = 0; i < counter; i++)   
    •         {   
    •             ptDest = m_ptArray.GetAt(i);   
    •             ptTemp.x = ptDest.x - ptOrigin.x;   
    •             ptTemp.y = ptDest.y - ptOrigin.y;   
    •             int step = abs(ptTemp.x);   
    •             if(abs(ptTemp.y) > step) step = abs(ptTemp.y);   
    •             if(ptTemp.x != 0) ptTemp.x /= abs(ptTemp.x);   
    •             if(ptTemp.y != 0) ptTemp.y /= abs(ptTemp.y);   
    •             int row, col;   
    •             for(int j = 0; j < step; j++)   
    •             {   
    •                 row = ptOrigin.x + j*ptTemp.x;   
    •                 col = ptOrigin.y + j*ptTemp.y;   
    •                 dc.Ellipse((col+1) * 30 - 10, (row+1) * 30 - 10, (col+1) * 30 + 10, (row+1) * 30 + 10);   
    •                 m_bIsBlack ? (m_nChessArray[row][col] = -1) : (m_nChessArray[row][col] = 1);   
    •             }   
    •         }   
    •            
    •         m_bIsBlack = !m_bIsBlack;   
    •         m_bIsBlack ? (m_strState = "黑方下子...") : (m_strState = "白方下子...");   
    •         int black = 0, white = 0;   
    •         for( int row = 0; row < 8; row++)   
    •             for(int col = 0; col < 8; col++)   
    •                 if( m_nChessArray[row][col] == 1 ) white++;   
    •                 else if( m_nChessArray[row][col] == -1) black++;   
    •         if(white == 0)   
    •         {   
    •             m_strState = "白方中盘认输";   
    •             m_bFinish = TRUE;   
    •             OnGameOver();   
    •             CWnd *pWnd = GetDlgItem(IDC_BLACK);   
    •             pWnd->EnableWindow();   
    •             pWnd = GetDlgItem(IDC_WHITE);   
    •             pWnd->EnableWindow();   
    •             pWnd = GetDlgItem(IDC_PASS);   
    •             pWnd->EnableWindow();   
    •         }   
    •         if(black == 0)   
    •         {   
    •             m_strState = "黑方中盘认输";   
    •             m_bFinish = TRUE;   
    •             OnGameOver();   
    •             CWnd *pWnd = GetDlgItem(IDC_BLACK);   
    •             pWnd->EnableWindow();   
    •             pWnd = GetDlgItem(IDC_WHITE);   
    •             pWnd->EnableWindow();   
    •             pWnd = GetDlgItem(IDC_PASS);   
    •             pWnd->EnableWindow();   
    •         }   
    •            
    •         CString State;   
    •         State.Format("\r\n黑方:%d目\r\n白方:%d目", black, white);   
    •   
    •         m_strState += State;   
    •         if( (black + white) == 64 )   
    •         {   
    •             m_bFinish = TRUE;   
    •             OnGameOver();   
    •             if( black > white ) m_strState += "\r\n黑方胜";   
    •             else if( white > black ) m_strState += "\r\n白方胜";   
    •             else m_strState += "平局@_@";   
    •   
    •   
    •             CWnd *pWnd = GetDlgItem(IDC_BLACK);   
    •             pWnd->EnableWindow();   
    •             pWnd = GetDlgItem(IDC_WHITE);   
    •             pWnd->EnableWindow();   
    •         }   
    •         UpdateData(FALSE);   
    •            
    •         dc.SelectObject(pOldBrush);   
    •         brushBlack.DeleteObject();   
    •         brushWhite.DeleteObject();   
    •     }   
    •     if( !g_bData )   
    •         CDialog::OnLButtonDown(nFlags, point);   
    •     g_bData = FALSE;   
    •     ::Sleep(100);   
    • }   
    •   
    • /////////////////////////////////////////////////////////////////////////   
    • //行棋规则的实现。记录落子后每一个需要改变的位置的坐标                 //   
    • //落子后在8个方向上判断哪些位置需要改变,返回需要改变的位置的个数      //   
    • /////////////////////////////////////////////////////////////////////////   
    • int CAppleChessDlg::Check(const CPoint& point)   
    • {   
    •     m_ptArray.RemoveAll();   
    •     int checkcolor, counter = 0;   
    •     if( m_bIsBlack ) checkcolor = -1;   
    •     else checkcolor = 1;   
    •     CPoint ptTemp(point);   
    •     while( --ptTemp.x >= 0 )   
    •     {      
    •         if(m_nChessArray[ptTemp.x][ptTemp.y] == 0) break;   
    •         if( m_nChessArray[ptTemp.x][ptTemp.y] == checkcolor )   
    •         {   
    •             if( point.x - ptTemp.x >= 2 )   
    •             {   
    •                 m_ptArray.Add(ptTemp);   
    •                 counter++;   
    •             }   
    •             break;   
    •         }   
    •     }   
    •     ptTemp.x = point.x, ptTemp.y = point.y;   
    •     while( (--ptTemp.x >= 0) && (--ptTemp.y >= 0) )   
    •     {      
    •         if(m_nChessArray[ptTemp.x][ptTemp.y] == 0) break;   
    •         if( m_nChessArray[ptTemp.x][ptTemp.y] == checkcolor )   
    •         {   
    •             if( point.x - ptTemp.x >= 2 )   
    •             {   
    •                 m_ptArray.Add(ptTemp);   
    •                 counter++;   
    •             }   
    •             break;   
    •         }   
    •     }   
    •     ptTemp.x = point.x, ptTemp.y = point.y;   
    •     while( --ptTemp.y >= 0 )   
    •     {      
    •         if(m_nChessArray[ptTemp.x][ptTemp.y] == 0) break;   
    •         if( m_nChessArray[ptTemp.x][ptTemp.y] == checkcolor )   
    •         {   
    •             if( point.y - ptTemp.y >= 2 )   
    •             {   
    •                 m_ptArray.Add(ptTemp);   
    •                 counter++;   
    •             }   
    •             break;   
    •         }   
    •     }   
    •     ptTemp.x = point.x, ptTemp.y = point.y;   
    •     while( (--ptTemp.y >= 0) && (++ptTemp.x <= 7) )   
    •     {      
    •         if(m_nChessArray[ptTemp.x][ptTemp.y] == 0) break;   
    •         if( m_nChessArray[ptTemp.x][ptTemp.y] == checkcolor )   
    •         {   
    •             if( point.y - ptTemp.y >= 2 )   
    •             {   
    •                 m_ptArray.Add(ptTemp);   
    •                 counter++;   
    •             }   
    •             break;   
    •         }   
    •     }   
    •     ptTemp.x = point.x, ptTemp.y = point.y;   
    •     while( ++ptTemp.x <= 7 )   
    •     {      
    •         if(m_nChessArray[ptTemp.x][ptTemp.y] == 0) break;   
    •         if( m_nChessArray[ptTemp.x][ptTemp.y] == checkcolor )   
    •         {   
    •             if( ptTemp.x - point.x >= 2 )   
    •             {   
    •                 m_ptArray.Add(ptTemp);   
    •                 counter++;   
    •             }   
    •             break;   
    •         }   
    •     }   
    •     ptTemp.x = point.x, ptTemp.y = point.y;   
    •     while( (++ptTemp.y <= 7) && (++ptTemp.x <= 7) )   
    •     {      
    •         if(m_nChessArray[ptTemp.x][ptTemp.y] == 0) break;   
    •         if( m_nChessArray[ptTemp.x][ptTemp.y] == checkcolor )   
    •         {   
    •             if( ptTemp.y - point.y >= 2 )   
    •             {   
    •                 m_ptArray.Add(ptTemp);   
    •                 counter++;   
    •             }   
    •             break;   
    •         }   
    •     }      
    •     ptTemp.x = point.x, ptTemp.y = point.y;   
    •     while( ++ptTemp.y <= 7 )   
    •     {      
    •         if(m_nChessArray[ptTemp.x][ptTemp.y] == 0) break;   
    •         if( m_nChessArray[ptTemp.x][ptTemp.y] == checkcolor )   
    •         {   
    •             if( ptTemp.y - point.y >= 2 )   
    •             {   
    •                 m_ptArray.Add(ptTemp);   
    •                 counter++;   
    •             }   
    •             break;   
    •         }   
    •     }   
    •     ptTemp.x = point.x, ptTemp.y = point.y;   
    •     while( (--ptTemp.x >= 0) && (++ptTemp.y <= 7) )   
    •     {      
    •         if(m_nChessArray[ptTemp.x][ptTemp.y] == 0) break;   
    •         if( m_nChessArray[ptTemp.x][ptTemp.y] == checkcolor )   
    •         {   
    •             if( point.x - ptTemp.x >= 2 )   
    •             {   
    •                 m_ptArray.Add(ptTemp);   
    •                 counter++;   
    •             }   
    •             break;   
    •         }   
    •     }   
    •     return counter;   
    • }  


    点击这里下载源码




关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    Email:scq2099yt@163.com    MSN:scq2099yt@live.cn    QQ:14046300    本站QQ群:67202409
Copyright © 2008     卓为VC(www.joyvc.cn)    All Rights Reserved    建议分辨率 1024×768
本站由施昌权制作维护
京ICP备09012297号