效果图

支持两人联网的五子棋程序。
代码不错,张贴部分示例一下:
- ////////////////////////////////////////////////////////////////////////////
- //同时负责己方和对方落子后棋盘的更新,由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;
- }
点击这里下载源码
|