www.pudn.com > 3D_OnlineGame_Humen.rar > ChessWnd.cpp


#include "stdafx.h" 
#include "XMudClient.h" 
#include "ChessWnd.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
extern char g_tszPathName[256]; 
BYTE gInitField[10][9]= { 
	{13,14,15,16,17,16,15,14,13}, 
	{0,0,0,0,0,0,0,0,0}, 
	{0,12,0,0,0,0,0,12,0}, 
	{11,0,11,0,11,0,11,0,11}, 
	{0,0,0,0,0,0,0,0,0}, 
	{0,0,0,0,0,0,0,0,0}, 
	{1,0,1,0,1,0,1,0,1}, 
	{0,2,0,0,0,0,0,2,0}, 
	{0,0,0,0,0,0,0,0,0}, 
	{3,4,5,6,7,6,5,4,3} 
}; 
 
 
CChessWnd::CChessWnd() 
{ 
} 
 
CChessWnd::~CChessWnd() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CChessWnd, CWnd) 
	ON_WM_PAINT() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_MOUSEMOVE() 
	ON_WM_RBUTTONDOWN() 
	ON_WM_DESTROY() 
END_MESSAGE_MAP() 
 
void CChessWnd::PrepareChess() 
{ 
	char szChessbmpfile[256]; 
	strcpy(szChessbmpfile,g_tszPathName); 
	strcat(szChessbmpfile,"\\media\\cchess1.ppp"); 
	m_Background = (HBITMAP)LoadImage(0,szChessbmpfile,IMAGE_BITMAP,640,520,LR_LOADFROMFILE); 
	if(m_Background == NULL)return; 
	bMoveTurnOn = FALSE; 
	gbIsRed = TRUE; 
	gbFirst = TRUE; 
	gChessFieldRect.left=FrameXpos; 
	gChessFieldRect.right=FrameXpos+9*ChessSize; 
	gChessFieldRect.top=FrameYpos; 
	gChessFieldRect.bottom=FrameYpos+10*ChessSize; 
 
	gLpOriginalCrossNum=(LPMOUSEPOSITION)GlobalAlloc(GMEM_ZEROINIT,sizeof(MOUSEPOSITION)); 
	gLpFinalCrossNum   =(LPMOUSEPOSITION)GlobalAlloc(GMEM_ZEROINIT,sizeof(MOUSEPOSITION)); 
 
	InitOurField(); 
	bMoveTurnOn = TRUE; 
	gnGameState = GS_IsOurTurn; 
} 
void CChessWnd::InitOurField() 
{ 
	int i,j; 
	for(j=0;j<10;j++)         
		for(i=0;i<9;i++) 
			gField[j][i]=gInitField[j][i]; 
} 
 
void CChessWnd::OnPaint()  
{ 
	CPaintDC dc(this); 
	int i,j,Temp; 
	RECT	rcRect; 
	CDC tmpDC; 
	CBitmap *tmpBmp; 
	CBitmap* OldBmp; 
	tmpDC.CreateCompatibleDC(&dc); 
	tmpBmp=CBitmap::FromHandle(m_Background); 
	OldBmp=tmpDC.SelectObject(tmpBmp); 
	dc.BitBlt(0,0,520,480,&tmpDC,0,0,SRCCOPY); 
 
	if(true){ 
		for(j=0;j<10;j++){ 
			for(i=0;i<9;i++){ 
				if(gField[j][i] != NoChess){ 
					if(gnGameState == GS_ChessSelected){ 
						if(i == gLpOriginalCrossNum->x && j == gLpOriginalCrossNum->y) 
							continue; 
					} 
					if(gbIsRed){ 
						if(gField[j][i] < 10){ 
							rcRect.left   = (gField[j][i]-1)*40; 
							rcRect.top    = 480; 
							rcRect.right  = (gField[j][i]-1)*40 + 39; 
							rcRect.bottom = 39 + 480; 
						}else{ 
							rcRect.left   = (gField[j][i]-11)*40+280; 
							rcRect.top    = 480; 
							rcRect.right  = (gField[j][i]-11)*40+280+39; 
							rcRect.bottom = 39 + 480; 	 
						} 
					}else{ 
						if(gField[j][i] < 10){ 
							rcRect.left   = (gField[j][i]-1)*40+280; 
							rcRect.top    = 480; 
							rcRect.right  = (gField[j][i]-1)*40+280+39; 
							rcRect.bottom = 39 + 480; 
						}else{ 
							rcRect.left   = (gField[j][i]-11)*40; 
							rcRect.top    = 480; 
							rcRect.right  = (gField[j][i]-11)*40 + 39; 
							rcRect.bottom = 39 + 480; 	 
						} 
					} 
					dc.BitBlt(i*40+FrameXpos,FrameYpos+j*40,40,40,&tmpDC,rcRect.left,480,SRCINVERT); 
					dc.BitBlt(i*40+FrameXpos,FrameYpos+j*40,40,40,&tmpDC,562,480,SRCAND); 
					dc.BitBlt(i*40+FrameXpos,FrameYpos+j*40,40,40,&tmpDC,rcRect.left,480,SRCINVERT); 
				} 
			} 
		} 
	} 
	if(gnGameState == GS_ChessSelected){ 
		j=gLpOriginalCrossNum->y; 
		i=gLpOriginalCrossNum->x; 
		if(gbIsRed) 
			Temp = 0; //red 
		else 
			Temp = 7*40; //black 
		rcRect.left   = (gField[j][i]-1)*40+Temp; 
		rcRect.top    = 480; 
		rcRect.right  = (gField[j][i]-1)*40+39+Temp; 
		rcRect.bottom = 39 + 480; 
		dc.BitBlt(gLpFinalCrossNum->x*40+FrameXpos,FrameYpos+gLpFinalCrossNum->y*40,40,40,&tmpDC,rcRect.left,480,SRCINVERT); 
		dc.BitBlt(gLpFinalCrossNum->x*40+FrameXpos,FrameYpos+gLpFinalCrossNum->y*40,40,40,&tmpDC,562,480,SRCAND); 
		dc.BitBlt(gLpFinalCrossNum->x*40+FrameXpos,FrameYpos+gLpFinalCrossNum->y*40,40,40,&tmpDC,rcRect.left,480,SRCINVERT); 
	} 
	tmpDC.SelectObject(OldBmp); 
} 
 
void CChessWnd::DoMoving() 
{ 
	int i,j,k,l; 
	BYTE Temp; 
	i =  gLpOriginalCrossNum->x; 
	j =  gLpOriginalCrossNum->y; 
	k =  gLpFinalCrossNum->x; 
	l =  gLpFinalCrossNum->y; 
	Temp = gField[l][k]; 
	gMoveMsg.byOriginalXpos = i; 
	gMoveMsg.byOriginalYpos = j; 
	gMoveMsg.byFinalXpos=k; 
	gMoveMsg.byFinalYpos=l; 
 
	gField[l][k] = gField[j][i]; //Move Chess 
	gField[j][i] = NoChess; 
	if(Temp == 17){  
		MessageBox("You Win !","Game Message",MB_OK); 
		gbIsRed = FALSE; 
		gbFirst = TRUE; 
		gnGameState = GS_GameNotStart; 
		InitOurField(); 
	} 
} 
 
void CChessWnd::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	if(!bMoveTurnOn)return; 
	if((gnGameState == GS_IsOurTurn)&&(GetMouseLocation(point,gLpOriginalCrossNum)==TRUE)){ 
		if(gField[gLpOriginalCrossNum->y][gLpOriginalCrossNum->x]>10){ 
			return; 
		} 
		gnGameState = GS_ChessSelected; 
		bCheck = FALSE; 
		gLpFinalCrossNum->x = gLpOriginalCrossNum->x; 
		gLpFinalCrossNum->y = gLpOriginalCrossNum->y; 
	} 
	if(gnGameState == GS_ChessSelected && bCheck){ 
		int i,j; 
		GetMouseLocation(point,gLpFinalCrossNum); 
		if(CheckMoving()==TRUE){ 
			j=gLpFinalCrossNum->y; 
			i=gLpFinalCrossNum->x; 
			DoMoving(); 
			CRect aaa(i*40+FrameXpos,FrameYpos+j*40,i*40+FrameXpos+40,FrameYpos+j*40+40); 
			InvalidateRect(aaa); 
			gnGameState = GS_GameStart; 
		}else{ 
			j=gLpFinalCrossNum->y; 
			i=gLpFinalCrossNum->x; 
			CRect aaa(i*40+FrameXpos,FrameYpos+j*40,i*40+FrameXpos+40,FrameYpos+j*40+40); 
			InvalidateRect(aaa); 
			gLpFinalCrossNum->x = gLpOriginalCrossNum->x; 
			gLpFinalCrossNum->y = gLpOriginalCrossNum->y; 
			j=gLpFinalCrossNum->y; 
			i=gLpFinalCrossNum->x; 
			CRect bbb(i*40+FrameXpos,FrameYpos+j*40,i*40+FrameXpos+40,FrameYpos+j*40+40); 
			InvalidateRect(bbb); 
			gnGameState = GS_IsOurTurn; 
		} 
	} 
	CWnd::OnLButtonDown(nFlags, point); 
} 
 
void CChessWnd::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	if(gnGameState == GS_ChessSelected){	 
		bCheck = TRUE; 
	} 
	CWnd::OnLButtonUp(nFlags, point); 
} 
 
void CChessWnd::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	int i,j; 
	if(gnGameState == GS_ChessSelected){ 
		j=gLpFinalCrossNum->y; 
		i=gLpFinalCrossNum->x; 
		CRect bbb(i*40+FrameXpos,FrameYpos+j*40,i*40+FrameXpos+40,FrameYpos+j*40+40); 
		InvalidateRect(bbb); 
		GetMouseLocation(point,gLpFinalCrossNum); 
		j=gLpFinalCrossNum->y; 
		i=gLpFinalCrossNum->x; 
		CRect aaa(i*40+FrameXpos,FrameYpos+j*40,i*40+FrameXpos+40,FrameYpos+j*40+40); 
		InvalidateRect(aaa); 
	} 
	CWnd::OnMouseMove(nFlags, point); 
} 
 
void CChessWnd::OnRButtonDown(UINT nFlags, CPoint point)  
{ 
	int i,j; 
	if(gnGameState == GS_ChessSelected){	 
		j=gLpFinalCrossNum->y; 
		i=gLpFinalCrossNum->x; 
		CRect aaa(i*40+FrameXpos,FrameYpos+j*40,i*40+FrameXpos+40,FrameYpos+j*40+40); 
		InvalidateRect(aaa); 
		gLpFinalCrossNum->x = gLpOriginalCrossNum->x; 
		gLpFinalCrossNum->y = gLpOriginalCrossNum->y; 
		j=gLpFinalCrossNum->y; 
		i=gLpFinalCrossNum->x; 
		CRect bbb(i*40+FrameXpos,FrameYpos+j*40,i*40+FrameXpos+40,FrameYpos+j*40+40); 
		InvalidateRect(bbb); 
		gnGameState = GS_IsOurTurn; 
	}	 
	CWnd::OnRButtonDown(nFlags, point); 
} 
 
BOOL CChessWnd::CheckMoving() 
{ 
	BYTE origin,final; 
	int temp_max,temp_min,i,j,k,l,m,n; 
	BYTE EnemyKingXpos,EnemyKingYpos; 
	BOOL bNotKingKillKing;		 
 
	origin=gField[gLpOriginalCrossNum->y][gLpOriginalCrossNum->x]; 
	final =gField[gLpFinalCrossNum->y][gLpFinalCrossNum->x]; 
	if(origin > 10) return(FALSE); 
	switch(origin){ 
	case 1: //ping 
		if(gLpFinalCrossNum->y > 4){ 
			if(gLpFinalCrossNum->x != gLpOriginalCrossNum->x) 
				return(FALSE); 
			if(gLpFinalCrossNum->y != (gLpOriginalCrossNum->y - 1) ) 
				return(FALSE); 
		} 
		else{ 
			switch(gLpFinalCrossNum->x - gLpOriginalCrossNum->x ){ 
			case 0: 
				if(gLpFinalCrossNum->y - gLpOriginalCrossNum->y != -1) 
					return(FALSE); 
				break; 
			case -1: 
			case 1: 
				if(gLpFinalCrossNum->y != gLpOriginalCrossNum->y) 
					return(FALSE); 
				break; 
			default: 
				return(FALSE); 
			} 
		} 
		break; 
 
	case 2: //pao 
		if((gLpFinalCrossNum->y != gLpOriginalCrossNum->y) && (gLpFinalCrossNum->x != gLpOriginalCrossNum->x ))  
			return(FALSE); 
		if(gLpFinalCrossNum->y != gLpOriginalCrossNum->y){ 
			temp_max=max(gLpFinalCrossNum->y , gLpOriginalCrossNum->y); 
			temp_min=min(gLpFinalCrossNum->y , gLpOriginalCrossNum->y);  
			j=0; 
			for(i=temp_min+1;ix] != NoChess) j++; 
		} 
		if(gLpFinalCrossNum->x != gLpOriginalCrossNum->x){ 
			temp_max=max(gLpFinalCrossNum->x , gLpOriginalCrossNum->x); 
			temp_min=min(gLpFinalCrossNum->x , gLpOriginalCrossNum->x);  
			j=0; 
			for(i=temp_min+1;iy][i] != NoChess) j++; 
		} 
		if(final == NoChess){   
			if(j != 0) return(FALSE); //must have not chess between two pos 
		}else{ 
			if(j != 1) return(FALSE);//must exist one chess between two pos 
		} 
		break; 
 
	case 3://ju 
		if((gLpFinalCrossNum->y != gLpOriginalCrossNum->y) && (gLpFinalCrossNum->x != gLpOriginalCrossNum->x ))  
			return(FALSE); 
		if(gLpFinalCrossNum->y != gLpOriginalCrossNum->y){ 
			temp_max=max(gLpFinalCrossNum->y , gLpOriginalCrossNum->y); 
			temp_min=min(gLpFinalCrossNum->y , gLpOriginalCrossNum->y);  
			j=0; 
			for(i=temp_min+1;ix] != NoChess) j++; 
		} 
		if(gLpFinalCrossNum->x != gLpOriginalCrossNum->x){ 
			temp_max=max(gLpFinalCrossNum->x , gLpOriginalCrossNum->x); 
			temp_min=min(gLpFinalCrossNum->x , gLpOriginalCrossNum->x);  
			j=0; 
			for(i=temp_min+1;iy][i] != NoChess) j++; 
		} 
		if( j!=0 ) return(FALSE);//must have not chess between two pos   
		break; 
 
	case 4://ma 
		i = gLpFinalCrossNum->x - gLpOriginalCrossNum->x; 
		j = gLpFinalCrossNum->y - gLpOriginalCrossNum->y; 
		switch(i){ 
		case 2: 
			if(abs(j) != 1) return(FALSE); 
			if( gField[gLpOriginalCrossNum->y][gLpOriginalCrossNum->x + 1] != NoChess) 
				return(FALSE); 
			break; 
		case -2: 
				if(abs(j) != 1) return(FALSE); 
				if( gField[gLpOriginalCrossNum->y][gLpOriginalCrossNum->x - 1] != NoChess) 
					return(FALSE); 
			break; 
		case 1: 
		case -1: 
			if(abs(j) != 2) return(FALSE); 
			break; 
		default: 
			return(FALSE); 
		} 
		switch(j){ 
		case 2: 
			if(abs(i) != 1) return(FALSE); 
			if( gField[gLpOriginalCrossNum->y + 1][gLpOriginalCrossNum->x] != NoChess) 
				return(FALSE); 
			break; 
		case -2: 
			if(abs(i) != 1) return(FALSE); 
			if( gField[gLpOriginalCrossNum->y - 1][gLpOriginalCrossNum->x] != NoChess) 
				return(FALSE); 
			break; 
		case 1: 
		case -1: 
			if(abs(i) != 2) return(FALSE); 
			break; 
		default: 
			return(FALSE); 
		} 
		break; 
	 
	case 5://xiang 
		i = gLpOriginalCrossNum->x; 
		j = gLpOriginalCrossNum->y; 
		k = gLpFinalCrossNum->x; 
		l = gLpFinalCrossNum->y; 
 
		switch(i){ 
		case 0: 
			if( j != 7) return(FALSE); 
			if( k != 2){ 
				return(FALSE); 
			}else{ 
				if(l != 9 && l != 5) return(FALSE); 
				if(l == 9 && gField[8][1] != NoChess) return(FALSE);	 
				if(l == 5 && gField[6][1] != NoChess) return(FALSE); 
			} 
			break; 
		case 2: 
			if( l != 7) return(FALSE); 
			if( k != 0 && k != 4) return(FALSE); 
			switch(j){ 
			case 9: 
				if( k == 0 && gField[8][1] != NoChess) return(FALSE); 
				if( k == 4 && gField[8][3] != NoChess) return(FALSE); 
				break; 
			case 5: 
				if( k == 0 && gField[6][1] != NoChess) return(FALSE); 
				if( k == 4 && gField[6][3] != NoChess) return(FALSE); 
				break; 
			default: 
				return(FALSE); 
			} 
			break; 
		case 4: 
			if( j != 7 ) return(FALSE); 
			switch(k){ 
			case 2: 
			case 6: 
				if( l != 5 && l != 9 ) return(FALSE); 
				break; 
			default: 
				return(FALSE); 
			} 
			if( k == 2 && l == 5 && gField[6][3] != NoChess) 
				return(FALSE); 
			if( k == 2 && l == 9 && gField[8][3] != NoChess) 
				return(FALSE); 
			if( k == 6 && l == 5 && gField[6][5] != NoChess) 
				return(FALSE); 
			if( k == 6 && l == 9 && gField[8][5] != NoChess) 
				return(FALSE); 
			break; 
		case 6: 
			if( l != 7) return(FALSE); 
			if( k != 8 && k != 4) return(FALSE); 
			switch(j){ 
			case 9: 
				if( k == 8 && gField[8][7] != NoChess) return(FALSE); 
				if( k == 4 && gField[8][5] != NoChess) return(FALSE); 
				break; 
			case 5: 
				if( k == 8 && gField[6][7] != NoChess) return(FALSE); 
				if( k == 4 && gField[6][5] != NoChess) return(FALSE); 
				break; 
			default: 
				return(FALSE); 
			} 
			break; 
		case 8: 
			if( j != 7) return(FALSE); 
			if( k != 6){ 
				return(FALSE); 
			}else{ 
				if(l != 9 && l != 5) return(FALSE); 
				if(l == 9 && gField[8][7] != NoChess) return(FALSE);	 
				if(l == 5 && gField[6][7] != NoChess) return(FALSE); 
			} 
			break; 
		default: 
			return(FALSE); 
		} 
		break; 
		 
	case 6: 
		i = gLpOriginalCrossNum->x; 
		j = gLpOriginalCrossNum->y; 
		k = gLpFinalCrossNum->x; 
		l = gLpFinalCrossNum->y; 
		switch(i){ 
		case 3: 
		case 5: 
			if( j != 9 && j != 7) return(FALSE); 
			if( k != 4 || l != 8) return(FALSE); 
			break; 
		case 4: 
			if( j != 8) return(FALSE); 
			if( k != 3 && k != 5) return(FALSE); 
			if( l != 7 && l != 9) return(FALSE); 
			break; 
		default: 
			return(FALSE); 
		} 
		break; 
 
	case 7: 
		i = gLpOriginalCrossNum->x; 
		j = gLpOriginalCrossNum->y; 
		k = gLpFinalCrossNum->x; 
		l = gLpFinalCrossNum->y; 
		for(m=3;m<6;m++) 
		for(n=0;n<3;n++) 
		if( gField[n][m] == 17)	{ 
			EnemyKingXpos =m; 
			EnemyKingYpos =n; 
		} 
		if(i == EnemyKingXpos)	{ 
			bNotKingKillKing = FALSE; 
			for(n=EnemyKingYpos+1;n gChessFieldRect.left)&&(Pos.x < gChessFieldRect.right) 
		&&(Pos.y > gChessFieldRect.top)&&(Pos.y < gChessFieldRect.bottom) ){	 
		TempX = (Pos.x-gChessFieldRect.left) / ChessSize; 
		TempY = (Pos.y-gChessFieldRect.top) / ChessSize; 
		LpChessCrossNum->x = TempX; 
		LpChessCrossNum->y = TempY; 
		if( gField[TempY][TempX] != NoChess ){ 
			return TRUE; 
		}else  
			return FALSE; 
	}else 
		return FALSE; 
} 
 
void CChessWnd::OnDestroy()  
{ 
	CWnd::OnDestroy(); 
	if(gLpOriginalCrossNum) 
        GlobalFree(gLpOriginalCrossNum); 
	if(gLpFinalCrossNum) 
		GlobalFree(gLpFinalCrossNum); 
	m_Background = NULL; 
}