www.pudn.com > fchess_src.zip > fchesvw.cpp


// fchesvw.cpp : implementation of the CFchessView class 
// 
 
#include "stdafx.h" 
#include "winsock.h" 
#include "fchess.h" 
#include ".\tcpsock\ts.h" 
#include "fchesdoc.h" 
#include "messageb.h" 
#include "fchesvw.h" 
//#include "estdlg.h" 
//#include          // MFC extensions 
char szYourTurn[10][40]= 
{"该你了,加油啊...", 
"该你了,这小子挺难对付的...", 
"该你了,看来你要认真思考一下了...", 
"该你了,这难不倒你的...", 
"该你了,你可是天下第一哦...", 
"该你了,加油啊...", 
"该你了,加油啊...", 
"该你了,加油啊...", 
"该你了,加油啊...", 
"该你了,加油啊..."}; 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char BASED_CODE THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CFchessView 
 
 
IMPLEMENT_DYNCREATE(CFchessView, CView) 
 
BEGIN_MESSAGE_MAP(CFchessView, CView) 
	ON_MESSAGE(WSA_READ, OnWSARead) 
	//{{AFX_MSG_MAP(CFchessView) 
	ON_COMMAND(ID_GAME_NEW, OnGameNew) 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_RBUTTONDOWN() 
	ON_WM_DESTROY() 
	ON_COMMAND(ID_FUNCTION_SENDMESSAGETOOTHER, OnFunctionSendMessage) 
	ON_UPDATE_COMMAND_UI(ID_FUNCTION_SENDMESSAGETOOTHER, OnUpdateFunctionSendMessage) 
	ON_WM_SETCURSOR() 
	ON_COMMAND(ID_GAME_QUITCURRENTGAME, OnAbortGame) 
	ON_UPDATE_COMMAND_UI(ID_GAME_QUITCURRENTGAME, OnUpdateAbortGame) 
	ON_COMMAND(IDM_BEEP, OnBeep) 
	ON_UPDATE_COMMAND_UI(IDM_BEEP, OnUpdateBeep) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CFchessView construction/destruction 
 
CFchessView::CFchessView() 
{ 
	srand(time(NULL)); 
	// TODO: add construction code here 
	m_fSound=AfxGetApp()->GetProfileInt("config","sound",1); 
	m_iTotalWin=AfxGetApp()->GetProfileInt("config","tw",0); 
	m_iTotalLost=AfxGetApp()->GetProfileInt("config","tl",0); 
	m_fFirstDeside=m_fEst=m_fCanDeside=FALSE; 
	for(int i=0;iWriteProfileInt("config","sound",m_fSound); 
	AfxGetApp()->WriteProfileInt("config","tw",m_iTotalWin); 
	AfxGetApp()->WriteProfileInt("config","tl",m_iTotalLost); 
} 
BOOL is_five(int* piF) 
{ 
	for(int i=0;i<5;i++) 
	{ 
		if(piF[i]==0) 
			return FALSE; 
	} 
	return TRUE; 
} 
BOOL is_six(int* piF) 
{ 
	for(int i=0;i<4;i++) 
	{ 
		if(piF[i]==0) 
			return FALSE; 
	} 
	return TRUE; 
} 
BOOL CFchessView::IsMatch(const int iX,const int iY) 
{//判断是否连续五颗 
   int fRes[6]; 
   int x,y,i; 
    
   memset(fRes,0,sizeof(int)*5); 
   for(x=iX;x=0 && yiX-5 ;x--,y++)// left down 
   { 
	   fRes[y-iY]=(m_bChessArray[iX][iY]==m_bChessArray[x][y])?1:0; 
   } 
   if(is_five(fRes)) 
	   return TRUE; 
 
   memset(fRes,0,sizeof(int)*5); 
   for(x=iX,y=iY;x0 && m_bChessArray[iX-1][iY]==0 && iX+50 && m_bChessArray[iX][iY-1]==0 && iY+5=0 && yiX-4 ;x--,y++)// left down 
   { 
	   fRes[y-iY]=(m_bChessArray[iX][iY]==m_bChessArray[x][y])?1:0; 
   } 
   if(is_six(fRes)) 
   { 
	   if(iX>0 && iY+50 && m_bChessArray[iX+4][iY-1]==0) 
		return TRUE; 
   } 
 
   memset(fRes,0,sizeof(int)*4); 
   for(x=iX,y=iY;x0 && iY>0&& m_bChessArray[iX-1][iY-1]==0  
		   && iX+5SelectObject(&penNew); 
	int iX,iY; 
	iX=iY=XSIZE; 
	for(int i=0;iMoveTo(XSTART+iX*i,YSTART+0); 
	   pDC->LineTo(XSTART+iX*i,YSTART+iY*(YVALUE-1)); 
	} 
	for(int j=0;jMoveTo(XSTART+0,YSTART+iY*j); 
	   pDC->LineTo(XSTART+iX*(XVALUE-1),YSTART+iY*j); 
	} 
	pDC->SelectObject(ppenOld); 
} 
void CFchessView::DrawChess(CDC* pDC) 
{ 
	HICON hiconB=AfxGetApp()->LoadIcon(IDI_BLACK); 
	HICON hiconW=AfxGetApp()->LoadIcon(IDI_WHITE); 
	HICON hiconLB=AfxGetApp()->LoadIcon(IDI_LASTB); 
	HICON hiconLW=AfxGetApp()->LoadIcon(IDI_LASTW); 
	int iX,iY; 
	iX=iY=XSIZE; 
 
	for(int i=0;iDrawIcon(i*iX,j*iY,hiconB); 
				if(i==m_CPLast.bX && j==m_CPLast.bY) 
					pDC->DrawIcon(i*iX,j*iY,hiconLB); 
				break; 
				case WHITE_CHESS: 
				pDC->DrawIcon(i*iX,j*iY,hiconW); 
				if(i==m_CPLast.bX && j==m_CPLast.bY) 
					pDC->DrawIcon(i*iX,j*iY,hiconLW); 
				break; 
				default: 
				break; 
	         }		  
		  } 
} 
void CFchessView::DrawCurrent(CDC* pDC) 
{ 
	DrawBoard(pDC); 
	DrawChess(pDC); 
} 
void CFchessView::OnDraw(CDC* pDC) 
{ 
	CFchessDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	DrawCurrent(pDC); 
	// TODO: add draw code for native data here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CFchessView diagnostics 
 
#ifdef _DEBUG 
void CFchessView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CFchessView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CFchessDoc* CFchessView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFchessDoc))); 
	return (CFchessDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CFchessView message handlers 
 
void CFchessView::OnGameNew()  
{ 
	//Sleep(40); 
	//m_tsComm.Close(); 
	//m_fFirstDeside=m_fEst=m_fCanDeside=FALSE; 
	for(int i=0;iGetDescendantWindow(IDD_MESSAGEBAR); 
	if(pBar) 
	    pBar->SetRecv(szMess); 
} 
void CFchessView::ReadMessage(void) 
{ 
	WORD wSize; 
	m_tsComm.Read((LPSTR)&wSize,sizeof(wSize)); 
	LPSTR lpszRead=new char[wSize+1]; 
	m_tsComm.Read(lpszRead,wSize); 
	lpszRead[wSize]='\0'; 
	SetMess(lpszRead); 
	PlayMessage(); 
    delete lpszRead; 
} 
LONG CFchessView::OnWSARead(UINT uP,LONG lP) 
{ 
    ASSERT(m_fEst); 
	if(WSAGETSELECTERROR(lP)!=0) 
	   return 0L; 
	if(WSAGETSELECTEVENT(lP)==FD_READ) 
	{ 
	    if(m_fLastMessage) 
		{ 
		   m_fLastMessage=FALSE; 
		   ReadMessage(); 
		   return 0L; 
		} 
	    int iR=m_tsComm.Read((LPSTR)&m_CP,sizeof(m_CP)); 
		if(iR==-1) 
		   return 0L; 
	    if(IsMessage(m_CP)) 
	    { 
	       m_fLastMessage=TRUE; 
	       return 0L; 
	    } 
	    if(IsNew(m_CP)) 
		{ 
		   AskNew(); 
		   return 0L; 
		} 
	    if(IsAskToQuit(m_CP)) 
	    { 
           m_fFirstDeside=m_fCanDeside=FALSE; 
	         for(int i=0;iGetDescendantWindow(IDD_MESSAGEBAR); 
	 if(pBar) 
	     pBar->GetSend(szSend); 
	 WORD wS=szSend.GetLength(); 
	 if(wS) 
	 { 
	     CHESSPOS CP; 
		 SetMessage(CP); 
		 m_tsComm.Write((LPCSTR)&CP,sizeof(CP)); 
		 Sleep(1000); 
		 char *pszSend=new char[wS+sizeof(CP)]; 
		 memcpy(pszSend,&wS,sizeof(wS)); 
		 memcpy(pszSend+sizeof(wS),szSend,wS); 
		 m_tsComm.Write((LPCSTR)pszSend,sizeof(wS)+wS); 
		 delete pszSend; 
	 } 
} 
 
void CFchessView::OnUpdateFunctionSendMessage(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_fEst);	 
} 
 
BOOL CFchessView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)  
{ 
	if(m_fEst&&m_fFirstDeside) 
	{ 
	    SetCursor(AfxGetApp()->LoadCursor( 
	                      (m_tsComm.IsListenSide())? 
	                            IDC_CHESSB:IDC_CHESSW)); 
		return TRUE; 
	} 
	   else 
	      return CView::OnSetCursor(pWnd, nHitTest, message); 
} 
 
void CFchessView::OnAbortGame()  
{ 
	SetQuit(m_CP); 
	m_tsComm.Write((LPCSTR)&m_CP,sizeof(m_CP)); 
    m_fFirstDeside=m_fCanDeside=FALSE; 
	for(int i=0;iEnable(m_fEst);	 
} 
 
void CFchessView::OnBeep()  
{ 
	m_fSound=!m_fSound;	 
} 
 
void CFchessView::OnUpdateBeep(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(m_fSound); 
}