www.pudn.com > XmudOSr.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;
}