fchesvw.cpp
上传用户:hy11688
上传日期:2007-01-08
资源大小:81k
文件大小:14k
源码类别:

棋牌游戏

开发平台:

Visual C++

  1. // fchesvw.cpp : implementation of the CFchessView class
  2. //
  3. #include "stdafx.h"
  4. #include "winsock.h"
  5. #include "fchess.h"
  6. #include ".tcpsockts.h"
  7. #include "fchesdoc.h"
  8. #include "messageb.h"
  9. #include "fchesvw.h"
  10. //#include "estdlg.h"
  11. //#include <afxext.h>         // MFC extensions
  12. char szYourTurn[10][40]=
  13. {"该你了,加油啊...",
  14. "该你了,这小子挺难对付的...",
  15. "该你了,看来你要认真思考一下了...",
  16. "该你了,这难不倒你的...",
  17. "该你了,你可是天下第一哦...",
  18. "该你了,加油啊...",
  19. "该你了,加油啊...",
  20. "该你了,加油啊...",
  21. "该你了,加油啊...",
  22. "该你了,加油啊..."};
  23. #ifdef _DEBUG
  24. #undef THIS_FILE
  25. static char BASED_CODE THIS_FILE[] = __FILE__;
  26. #endif
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CFchessView
  29. IMPLEMENT_DYNCREATE(CFchessView, CView)
  30. BEGIN_MESSAGE_MAP(CFchessView, CView)
  31. ON_MESSAGE(WSA_READ, OnWSARead)
  32. //{{AFX_MSG_MAP(CFchessView)
  33. ON_COMMAND(ID_GAME_NEW, OnGameNew)
  34. ON_WM_LBUTTONDOWN()
  35. ON_WM_LBUTTONUP()
  36. ON_WM_RBUTTONDOWN()
  37. ON_WM_DESTROY()
  38. ON_COMMAND(ID_FUNCTION_SENDMESSAGETOOTHER, OnFunctionSendMessage)
  39. ON_UPDATE_COMMAND_UI(ID_FUNCTION_SENDMESSAGETOOTHER, OnUpdateFunctionSendMessage)
  40. ON_WM_SETCURSOR()
  41. ON_COMMAND(ID_GAME_QUITCURRENTGAME, OnAbortGame)
  42. ON_UPDATE_COMMAND_UI(ID_GAME_QUITCURRENTGAME, OnUpdateAbortGame)
  43. ON_COMMAND(IDM_BEEP, OnBeep)
  44. ON_UPDATE_COMMAND_UI(IDM_BEEP, OnUpdateBeep)
  45. //}}AFX_MSG_MAP
  46. END_MESSAGE_MAP()
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CFchessView construction/destruction
  49. CFchessView::CFchessView()
  50. {
  51. srand(time(NULL));
  52. // TODO: add construction code here
  53. m_fSound=AfxGetApp()->GetProfileInt("config","sound",1);
  54. m_iTotalWin=AfxGetApp()->GetProfileInt("config","tw",0);
  55. m_iTotalLost=AfxGetApp()->GetProfileInt("config","tl",0);
  56. m_fFirstDeside=m_fEst=m_fCanDeside=FALSE;
  57. for(int i=0;i<XVALUE;i++)
  58.   for(int j=0;j<YVALUE;j++)
  59.      m_bChessArray[i][j]=0;
  60. }
  61. CFchessView::~CFchessView()
  62. {
  63. AfxGetApp()->WriteProfileInt("config","sound",m_fSound);
  64. AfxGetApp()->WriteProfileInt("config","tw",m_iTotalWin);
  65. AfxGetApp()->WriteProfileInt("config","tl",m_iTotalLost);
  66. }
  67. BOOL is_five(int* piF)
  68. {
  69. for(int i=0;i<5;i++)
  70. {
  71. if(piF[i]==0)
  72. return FALSE;
  73. }
  74. return TRUE;
  75. }
  76. BOOL is_six(int* piF)
  77. {
  78. for(int i=0;i<4;i++)
  79. {
  80. if(piF[i]==0)
  81. return FALSE;
  82. }
  83. return TRUE;
  84. }
  85. BOOL CFchessView::IsMatch(const int iX,const int iY)
  86. {//判断是否连续五颗
  87.    int fRes[6];
  88.    int x,y,i;
  89.    
  90.    memset(fRes,0,sizeof(int)*5);
  91.    for(x=iX;x<iX+5 && x<XVALUE;x++)// to right
  92.    {
  93.    fRes[x-iX]=(m_bChessArray[iX][iY]==m_bChessArray[x][iY])?1:0;
  94.    }
  95.    if(is_five(fRes))
  96.    return TRUE;
  97.    memset(fRes,0,sizeof(int)*5);
  98.    for(y=iY;y<iY+5 &&  y<YVALUE;y++)// to down
  99.    {
  100.    fRes[y-iY]=(m_bChessArray[iX][iY]==m_bChessArray[iX][y])?1:0;
  101.    }
  102.    if(is_five(fRes))
  103.    return TRUE;
  104.    memset(fRes,0,sizeof(int)*5);
  105.    for(x=iX,y=iY;x>=0 && y<YVALUE && x>iX-5 ;x--,y++)// left down
  106.    {
  107.    fRes[y-iY]=(m_bChessArray[iX][iY]==m_bChessArray[x][y])?1:0;
  108.    }
  109.    if(is_five(fRes))
  110.    return TRUE;
  111.    memset(fRes,0,sizeof(int)*5);
  112.    for(x=iX,y=iY;x<XVALUE && y<YVALUE && y<iY+5 ;x++,y++)// right down
  113.    {
  114.    fRes[x-iX]=(m_bChessArray[iX][iY]==m_bChessArray[x][y])?1:0;
  115.    }
  116.    if(is_five(fRes))
  117.    return TRUE;
  118.    return FALSE;
  119. }
  120. BOOL CFchessView::IsMatch2(const int iX,const int iY)
  121. {//判断是否连续四颗
  122.    int fRes[6];
  123.    int x,y,i;
  124.    
  125.    memset(fRes,0,sizeof(int)*4);
  126.    for(x=iX;x<iX+4 && x<XVALUE;x++)// to right
  127.    {
  128.    fRes[x-iX]=(m_bChessArray[iX][iY]==m_bChessArray[x][iY] )?1:0;
  129.    }
  130.    if(is_six(fRes))
  131.    {
  132.    if(iX>0 && m_bChessArray[iX-1][iY]==0 && iX+5<XVALUE && m_bChessArray[iX+4][iY]==0)
  133. return TRUE;
  134.    }
  135.    memset(fRes,0,sizeof(int)*4);
  136.    for(y=iY;y<iY+4 &&  y<YVALUE;y++)// to down
  137.    {
  138.    fRes[y-iY]=(m_bChessArray[iX][iY]==m_bChessArray[iX][y])?1:0;
  139.    }
  140.    if(is_six(fRes))
  141.    {
  142.    if(iY>0 && m_bChessArray[iX][iY-1]==0 && iY+5<YVALUE && m_bChessArray[iX][iY+4]==0)
  143. return TRUE;
  144.    }
  145.    memset(fRes,0,sizeof(int)*4);
  146.    for(x=iX,y=iY;x>=0 && y<YVALUE && x>iX-4 ;x--,y++)// left down
  147.    {
  148.    fRes[y-iY]=(m_bChessArray[iX][iY]==m_bChessArray[x][y])?1:0;
  149.    }
  150.    if(is_six(fRes))
  151.    {
  152.    if(iX>0 && iY+5<YVALUE && m_bChessArray[iX-1][iY+4]==0 
  153.    && iX+5<XVALUE &&iY>0 && m_bChessArray[iX+4][iY-1]==0)
  154. return TRUE;
  155.    }
  156.    memset(fRes,0,sizeof(int)*4);
  157.    for(x=iX,y=iY;x<XVALUE && y<YVALUE && y<iY+4 ;x++,y++)// right down
  158.    {
  159.    fRes[x-iX]=(m_bChessArray[iX][iY]==m_bChessArray[x][y])?1:0;
  160.    }
  161.    if(is_six(fRes))
  162.    {
  163.    if(iX>0 && iY>0&& m_bChessArray[iX-1][iY-1]==0 
  164.    && iX+5<XVALUE && iY+5<YVALUE && m_bChessArray[iX+4][iY+4]==0)
  165. return TRUE;
  166.    }
  167.    return FALSE;
  168. }
  169. BOOL CFchessView::IsWin(int iChessValue)
  170. {
  171.    for(int y=0;y<YVALUE;y++)
  172.   for(int x=0;x<XVALUE;x++)
  173.   {
  174.  if(m_bChessArray[x][y]==iChessValue)
  175.    if(IsMatch(x,y))
  176.       return TRUE;
  177.   }
  178.    for(int y1=1;y1<YVALUE;y1++)
  179.   for(int x1=1;x1<XVALUE;x1++)
  180.   {
  181.  if(m_bChessArray[x1][y1]==iChessValue)
  182.    if(IsMatch2(x1,y1))
  183.       return TRUE;
  184.   }
  185.    return FALSE;
  186. }
  187. BOOL CFchessView::JudgeWin(void)
  188. {
  189.    int iCV=(m_tsComm.IsListenSide())?BLACK_CHESS:WHITE_CHESS;
  190.    return IsWin(iCV);
  191. }
  192. BOOL CFchessView::JudgeLost(void)
  193. {
  194.    int iCV=(!m_tsComm.IsListenSide())?BLACK_CHESS:WHITE_CHESS;
  195.    return IsWin(iCV);
  196. }
  197. /////////////////////////////////////////////////////////////////////////////
  198. // CFchessView drawing
  199. void CFchessView::PlayMessage(void)
  200. {
  201. if(m_fSound)
  202. MessageBeep(MB_ICONQUESTION);
  203. }
  204. void CFchessView::DrawBoard(CDC* pDC)
  205. {
  206. CPen penNew(PS_SOLID,1,RGB(0,0,0)),*ppenOld;
  207. ppenOld=pDC->SelectObject(&penNew);
  208. int iX,iY;
  209. iX=iY=XSIZE;
  210. for(int i=0;i<XVALUE;i++)
  211. {//draw |
  212.    pDC->MoveTo(XSTART+iX*i,YSTART+0);
  213.    pDC->LineTo(XSTART+iX*i,YSTART+iY*(YVALUE-1));
  214. }
  215. for(int j=0;j<YVALUE;j++)
  216. {
  217.    pDC->MoveTo(XSTART+0,YSTART+iY*j);
  218.    pDC->LineTo(XSTART+iX*(XVALUE-1),YSTART+iY*j);
  219. }
  220. pDC->SelectObject(ppenOld);
  221. }
  222. void CFchessView::DrawChess(CDC* pDC)
  223. {
  224. HICON hiconB=AfxGetApp()->LoadIcon(IDI_BLACK);
  225. HICON hiconW=AfxGetApp()->LoadIcon(IDI_WHITE);
  226. HICON hiconLB=AfxGetApp()->LoadIcon(IDI_LASTB);
  227. HICON hiconLW=AfxGetApp()->LoadIcon(IDI_LASTW);
  228. int iX,iY;
  229. iX=iY=XSIZE;
  230. for(int i=0;i<XVALUE;i++)
  231.    for(int j=0;j<YVALUE;j++)
  232.       {
  233.          switch(m_bChessArray[i][j])
  234.          {
  235. case BLACK_CHESS:
  236. pDC->DrawIcon(i*iX,j*iY,hiconB);
  237. if(i==m_CPLast.bX && j==m_CPLast.bY)
  238. pDC->DrawIcon(i*iX,j*iY,hiconLB);
  239. break;
  240. case WHITE_CHESS:
  241. pDC->DrawIcon(i*iX,j*iY,hiconW);
  242. if(i==m_CPLast.bX && j==m_CPLast.bY)
  243. pDC->DrawIcon(i*iX,j*iY,hiconLW);
  244. break;
  245. default:
  246. break;
  247.          }  
  248.   }
  249. }
  250. void CFchessView::DrawCurrent(CDC* pDC)
  251. {
  252. DrawBoard(pDC);
  253. DrawChess(pDC);
  254. }
  255. void CFchessView::OnDraw(CDC* pDC)
  256. {
  257. CFchessDoc* pDoc = GetDocument();
  258. ASSERT_VALID(pDoc);
  259. DrawCurrent(pDC);
  260. // TODO: add draw code for native data here
  261. }
  262. /////////////////////////////////////////////////////////////////////////////
  263. // CFchessView diagnostics
  264. #ifdef _DEBUG
  265. void CFchessView::AssertValid() const
  266. {
  267. CView::AssertValid();
  268. }
  269. void CFchessView::Dump(CDumpContext& dc) const
  270. {
  271. CView::Dump(dc);
  272. }
  273. CFchessDoc* CFchessView::GetDocument() // non-debug version is inline
  274. {
  275. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFchessDoc)));
  276. return (CFchessDoc*)m_pDocument;
  277. }
  278. #endif //_DEBUG
  279. /////////////////////////////////////////////////////////////////////////////
  280. // CFchessView message handlers
  281. void CFchessView::OnGameNew() 
  282. {
  283. //Sleep(40);
  284. //m_tsComm.Close();
  285. //m_fFirstDeside=m_fEst=m_fCanDeside=FALSE;
  286. for(int i=0;i<XVALUE;i++)
  287.   for(int j=0;j<YVALUE;j++)
  288.      m_bChessArray[i][j]=0;
  289. if(!m_fEst)
  290.    EstNew();
  291.   else
  292.   {
  293.   MakeNew(m_CP);
  294.   m_tsComm.Write((LPCSTR)&m_CP,sizeof(m_CP));
  295.   }
  296.     m_fLastMessage=FALSE;
  297. m_fFirstDeside=FALSE;
  298. m_fCanDeside=(m_tsComm.IsListenSide())?TRUE:FALSE;
  299. Invalidate(TRUE);
  300. }
  301. void CFchessView::AskNew(void)
  302. {
  303. for(int i=0;i<XVALUE;i++)
  304.   for(int j=0;j<YVALUE;j++)
  305.      m_bChessArray[i][j]=0;
  306. m_fLastMessage=FALSE;
  307. m_fFirstDeside=FALSE;
  308. m_fCanDeside=(m_tsComm.IsListenSide())?TRUE:FALSE;
  309. //AfxMessageBox("New game");
  310. SetMess("New Game !");
  311. m_CPLast.bX=m_CPLast.bY=(BYTE)-1;
  312. Invalidate(TRUE);
  313. }
  314. void CFchessView::EstNew(void)
  315. {
  316. //CEstDlg dlg(&m_tsComm,NULL,0X3000);
  317. m_CPLast.bX=m_CPLast.bY=(BYTE)-1;
  318. if(::EstComm(&m_tsComm,0X3000,NULL)==IDOK)
  319.   {
  320.     m_tsComm.Established(GetSafeHwnd());
  321.     //AfxMessageBox("Let's begin !",MB_OK);
  322. SetMess("Let's Begin !");
  323. m_fEst=TRUE;
  324. m_fLastMessage=FALSE;
  325. m_fFirstDeside=FALSE;
  326. m_fCanDeside=(m_tsComm.IsListenSide())?TRUE:FALSE;
  327.   }
  328. }
  329. void CFchessView::SetMess(const char* pszMess)
  330. {
  331.     CFrameWnd* pP=GetParentFrame();
  332. CString szMess(pszMess);
  333. CMessageBar* pBar=(CMessageBar*)pP->GetDescendantWindow(IDD_MESSAGEBAR);
  334. if(pBar)
  335.     pBar->SetRecv(szMess);
  336. }
  337. void CFchessView::ReadMessage(void)
  338. {
  339. WORD wSize;
  340. m_tsComm.Read((LPSTR)&wSize,sizeof(wSize));
  341. LPSTR lpszRead=new char[wSize+1];
  342. m_tsComm.Read(lpszRead,wSize);
  343. lpszRead[wSize]='';
  344. SetMess(lpszRead);
  345. PlayMessage();
  346.     delete lpszRead;
  347. }
  348. LONG CFchessView::OnWSARead(UINT uP,LONG lP)
  349. {
  350.     ASSERT(m_fEst);
  351. if(WSAGETSELECTERROR(lP)!=0)
  352.    return 0L;
  353. if(WSAGETSELECTEVENT(lP)==FD_READ)
  354. {
  355.     if(m_fLastMessage)
  356. {
  357.    m_fLastMessage=FALSE;
  358.    ReadMessage();
  359.    return 0L;
  360. }
  361.     int iR=m_tsComm.Read((LPSTR)&m_CP,sizeof(m_CP));
  362. if(iR==-1)
  363.    return 0L;
  364.     if(IsMessage(m_CP))
  365.     {
  366.        m_fLastMessage=TRUE;
  367.        return 0L;
  368.     }
  369.     if(IsNew(m_CP))
  370. {
  371.    AskNew();
  372.    return 0L;
  373. }
  374.     if(IsAskToQuit(m_CP))
  375.     {
  376.            m_fFirstDeside=m_fCanDeside=FALSE;
  377.          for(int i=0;i<XVALUE;i++)
  378.            for(int j=0;j<YVALUE;j++)
  379.               m_bChessArray[i][j]=0;
  380.        SetMess("Other abort !");
  381.    m_fLastMessage=FALSE;
  382.        Invalidate(TRUE);
  383.    if(m_tsComm.IsListenSide())
  384.         m_fCanDeside=TRUE;
  385.     }
  386.         else
  387.         {
  388.           ASSERT(IsValid(m_CP));
  389.   m_CPLast=m_CP;
  390.           m_bChessArray[m_CP.bX][m_CP.bY]=
  391.               (m_tsComm.IsListenSide())?
  392.                   WHITE_CHESS:BLACK_CHESS;
  393.           //MessageBeep(MB_ICONQUESTION);
  394.   PlayMessage();
  395.   SetMess(szYourTurn[rand()%10]);
  396.   if(JudgeLost())
  397.   {
  398.  AskNew();
  399.  AfxMessageBox("You Lost !");
  400.  m_iTotalLost++;
  401.   //SetMess("You Lost !");
  402.   }
  403.           Invalidate(FALSE);
  404.           m_fCanDeside=TRUE;
  405.         }
  406. }
  407. else
  408. {
  409.              for(int i=0;i<XVALUE;i++)
  410.             for(int j=0;j<YVALUE;j++)
  411.                m_bChessArray[i][j]=0;
  412.          m_tsComm.Close();
  413.  if(m_fEst)
  414.     SetMess("Connect Lost !");
  415.  m_fLastMessage=FALSE;
  416.          m_fFirstDeside=m_fEst=m_fCanDeside=FALSE;
  417.          Invalidate(TRUE);
  418. }
  419. return 0L;
  420. }
  421. void CFchessView::OnLButtonDown(UINT nFlags, CPoint point) 
  422. {
  423. if(m_fEst&&
  424.    m_fCanDeside&&
  425.    point.x<XSIZE*(XVALUE)&&
  426.    point.y<XSIZE*(YVALUE))
  427. {
  428.    int iX,iY;
  429.    iX=point.x/XSIZE;
  430.    iY=point.y/XSIZE;
  431.    if(m_bChessArray[iX][iY]==0)
  432.    {
  433.        m_fFirstDeside=TRUE;
  434.        m_CP.bX=iX;
  435.        m_CP.bY=iY;
  436.        CPoint ptC(iX*XSIZE-3,iY*XSIZE-3);
  437.        ClientToScreen(&ptC);
  438.        ::SetCursorPos(ptC.x+5,ptC.y+5);
  439.        CRect rcC(ptC,CSize(XSIZE,XSIZE));
  440.        rcC+=CPoint(1,1);
  441.        ClipCursor(rcC);
  442.    }
  443. }
  444.   else
  445.      //MessageBeep(MB_ICONQUESTION);
  446.  PlayMessage();
  447. CView::OnLButtonDown(nFlags, point);
  448. }
  449. void CFchessView::OnLButtonUp(UINT nFlags, CPoint point) 
  450. {
  451. if(m_fEst&&m_fFirstDeside)
  452. {
  453.    m_fFirstDeside=FALSE;
  454.    m_fCanDeside=FALSE;
  455.    m_bChessArray[m_CP.bX][m_CP.bY]=
  456.                 (m_tsComm.IsListenSide())?
  457.                      BLACK_CHESS:WHITE_CHESS;
  458.    Invalidate(FALSE);
  459.    m_tsComm.Write((LPCSTR)&m_CP,sizeof(m_CP));
  460.    ClipCursor(NULL);
  461.    SetMess("等待对方落棋...");
  462.    if(JudgeWin())
  463.    {
  464.    AskNew();
  465.    AfxMessageBox("You Win !");
  466.    m_iTotalWin++;
  467.    //SetMess("You Win !");
  468.    }
  469. }
  470. CView::OnLButtonUp(nFlags, point);
  471. }
  472. void CFchessView::OnRButtonDown(UINT nFlags, CPoint point) 
  473. {
  474. if(m_fEst&&m_fFirstDeside)
  475. {
  476.    m_fFirstDeside=FALSE;
  477.    m_fCanDeside=TRUE;
  478.    ClipCursor(NULL);
  479. }
  480. CView::OnRButtonDown(nFlags, point);
  481. }
  482. void CFchessView::OnDestroy() 
  483. {
  484. CView::OnDestroy();
  485. if(m_fEst)
  486. {
  487.    m_CP.bX=m_CP.bY=0XFF;
  488.    m_tsComm.Write((LPCSTR)&m_CP,sizeof(m_CP));
  489.    Sleep(40);
  490.    m_tsComm.Close();
  491. }
  492. }
  493. void CFchessView::OnFunctionSendMessage() 
  494. {
  495.  CString szSend;
  496.  CFrameWnd* pP=GetParentFrame();
  497.  CMessageBar* pBar=(CMessageBar*)pP->GetDescendantWindow(IDD_MESSAGEBAR);
  498.  if(pBar)
  499.      pBar->GetSend(szSend);
  500.  WORD wS=szSend.GetLength();
  501.  if(wS)
  502.  {
  503.      CHESSPOS CP;
  504.  SetMessage(CP);
  505.  m_tsComm.Write((LPCSTR)&CP,sizeof(CP));
  506.  Sleep(1000);
  507.  char *pszSend=new char[wS+sizeof(CP)];
  508.  memcpy(pszSend,&wS,sizeof(wS));
  509.  memcpy(pszSend+sizeof(wS),szSend,wS);
  510.  m_tsComm.Write((LPCSTR)pszSend,sizeof(wS)+wS);
  511.  delete pszSend;
  512.  }
  513. }
  514. void CFchessView::OnUpdateFunctionSendMessage(CCmdUI* pCmdUI) 
  515. {
  516. pCmdUI->Enable(m_fEst);
  517. }
  518. BOOL CFchessView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  519. {
  520. if(m_fEst&&m_fFirstDeside)
  521. {
  522.     SetCursor(AfxGetApp()->LoadCursor(
  523.                       (m_tsComm.IsListenSide())?
  524.                             IDC_CHESSB:IDC_CHESSW));
  525. return TRUE;
  526. }
  527.    else
  528.       return CView::OnSetCursor(pWnd, nHitTest, message);
  529. }
  530. void CFchessView::OnAbortGame() 
  531. {
  532. SetQuit(m_CP);
  533. m_tsComm.Write((LPCSTR)&m_CP,sizeof(m_CP));
  534.     m_fFirstDeside=m_fCanDeside=FALSE;
  535. for(int i=0;i<XVALUE;i++)
  536.    for(int j=0;j<YVALUE;j++)
  537.       m_bChessArray[i][j]=0;
  538. SetMess("Abort !");
  539. m_fLastMessage=FALSE;
  540. Invalidate(TRUE);
  541. if(m_tsComm.IsListenSide())
  542.    m_fCanDeside=TRUE;
  543. }
  544. void CFchessView::OnUpdateAbortGame(CCmdUI* pCmdUI) 
  545. {
  546. pCmdUI->Enable(m_fEst);
  547. }
  548. void CFchessView::OnBeep() 
  549. {
  550. m_fSound=!m_fSound;
  551. }
  552. void CFchessView::OnUpdateBeep(CCmdUI* pCmdUI) 
  553. {
  554. pCmdUI->SetCheck(m_fSound);
  555. }