www.pudn.com > Chesssource.rar > Chess.cpp


#include "stdafx.h" 
#include "ChessDef.h" 
 
FLOAT Timer(); 
float  ROTATE = 0.0f; 
 
cChess::cChess() 
{ 
	m_Pick = 0; 
	m_PickGreenDisplay[0] = TRUE; 
	for( long i=1; i<30; i++ ) 
		m_PickGreenDisplay[i] = FALSE; 
	for( long j=0; j<8; j++ ) 
		m_PickRedDisplay[j] = FALSE; 
	for( long n=0; n<33; n++ ) 
		m_IsFirstMove[n] = FALSE; 
	m_IsPick				= FALSE; 
	m_CalcuateMoveChessman	= 0; 
	m_FPS					= 0.0f; 
	m_Side					= 0; 
	m_xPos					= -2.6f; 
	m_zPos					= -2.6f; 
	m_xTarget				= m_zTarget			= -1; 
	m_xSource				= m_zSource			= -1; 
	m_CalcuateXMove			= m_CalcuateZMove	= 0.0f; 
	m_bEndGame				= FALSE; 
	m_bMyWin				= FALSE; 
	m_AppState				= APPSTATE_GAMEMENU; 
} 
 
cChess::~cChess() 
{ 
	Shutdown(); 
} 
 
BOOL cChess::Init(HWND hWnd, HINSTANCE hInstance) 
{ 
	m_Graphics.SetMode(hWnd, TRUE); 
	m_Font.Create( &m_Graphics, "Arial"); 
	m_StateFont.Create( &m_Graphics, "Arial", 48 ); 
 
	// 菜单 
	typedef struct  
	{ 
		float x, y, z; 
		float u, v; 
	} sMenuVertex; 
 
	long MenuFVF = (D3DFVF_XYZ | D3DFVF_TEX1); 
 
	sMenuVertex Verts[4] =  
	{ 
		{ -130.0f,  100.0f, 1.0f, 0.0f, 0.0f }, 
		{  130.0f,  100.0f, 1.0f, 1.0f, 0.0f }, 
		{ -130.0f, -100.0f, 1.0f, 0.0f, 1.0f }, 
		{  130.0f, -100.0f, 1.0f, 1.0f, 1.0f } 
	}; 
 
    m_MenuVB.Create(&m_Graphics, 4, MenuFVF, sizeof(sMenuVertex)); 
    m_MenuVB.Set(0,4,Verts); 
 
    // 加载菜单纹理 
    m_MenuTexture.Load(&m_Graphics, "Data\\splash.png"); 
    m_MenuButtons.Load(&m_Graphics, "Data\\b_main_sm_hover.tga"); 
    m_MenuSelect.Load(&m_Graphics, "Data\\b_main_sm_hover_pressed.tga"); 
    m_MenuFont.Create(&m_Graphics, "Arial", 24); 
 
	m_Sound.Init( hWnd, 22050, 1, 16 ); 
	m_SoundChannel.Create( &m_Sound, 22050, 1, 16 ); 
	m_MusicChannel.Create( &m_Sound ); 
 
	m_Input.Init( hWnd, hInstance ); 
	m_Mouse.Create( &m_Input, 2, TRUE ); 
	m_Keyboard.Create( &m_Input, 1 ); 
 
	m_Light.SetType( D3DLIGHT_POINT ); 
	m_Light.SetDiffuseColor(150, 150, 150 ); 
	m_Light.SetAmbientColor( 40, 40, 40 ); 
	m_Light.SetSpecularColor( 80, 80, 80 ); 
	m_Light.SetAttenuation0( 1.0f ); 
	m_Light.SetRange( 100.0f ); 
	m_Light.Move( 0.0f, 5.0f, 0.0f ); 
	m_Graphics.Get3DDevice()->SetLight(0, m_Light.GetLight()); 
	m_Graphics.Get3DDevice()->LightEnable(0, TRUE); 
 
	//PlayMusic(0); 
	return TRUE; 
} 
 
BOOL cChess::Frame() 
{   
	m_Keyboard.Acquire(TRUE);  
	m_Keyboard.Read(); 
	m_Mouse.Acquire(TRUE); 
	m_Mouse.Read(); 
 
	static DWORD UpdateTimer = timeGetTime(); 
 
	if(timeGetTime() < UpdateTimer + 40) 
		return TRUE; 
	UpdateTimer = timeGetTime(); 
 
	if(m_Keyboard.GetKeyState(DIK_ESCAPE) == TRUE) 
	{ 
		return FALSE; 
	} 
 
	static DWORD Timer = timeGetTime(); 
	float Elapsed; 
 
	Elapsed = (timeGetTime() - Timer)/800.0; 
	Timer = timeGetTime(); 
 
	switch(m_AppState) 
	{ 
	case APPSTATE_SELF: 
		RenderFrame( Elapsed ); 
		return TRUE; 
	case APPSTATE_AI: 
		RenderThinkFrame( Elapsed ); 
		return TRUE; 
	case APPSTATE_GAMEOVER: 
		GameOver( Elapsed ); 
		return TRUE; 
	case APPSTATE_ANIMATION: 
		RenderAnimationFrame( Elapsed ); 
		return TRUE; 
	case APPSTATE_GAMEMENU: 
		return GameMenu(); 
	} 
	return TRUE; 
} 
 
BOOL cChess::Shutdown() 
{ 
	short int i; 
 
	for( i=0; i<33; i++ ) 
		m_ChessObjects[i].Free(); 
	for( i=0; i<7; i++ ) 
		m_ChessMeshes[i].Free(); 
 
	m_PickMeshes[0].Free(); 
	m_PickMeshes[1].Free(); 
	for( i=0; i<30; i++ ) 
		m_PickGreenObjects[i].Free(); 
	for( i=0; i<8; i++ ) 
		m_PickRedObjects[i].Free(); 
 
	m_Buttons[0].Free(); 
	m_Buttons[1].Free(); 
	m_Buttons[2].Free(); 
	m_Buttons[3].Free(); 
 
	m_MenuButtons.Free(); 
    m_MenuVB.Free(); 
    m_MenuTexture.Free(); 
    m_MenuSelect.Free(); 
    m_MenuFont.Free(); 
 
	// 释放声音 
	m_MusicChannel.Free(); 
	m_SoundChannel.Free(); 
	m_Sound.Shutdown(); 
 
	m_Font.Free(); 
	m_StateFont.Free(); 
	m_Mouse.Free(); 
	m_Keyboard.Free(); 
	m_Input.Shutdown(); 
 
	m_Graphics.Shutdown(); 
 
	return TRUE; 
} 
 
BOOL cChess::GameMenu() 
{ 
	long x, y; 
	BOOL PreOne,PreTwo,PreThe; 
	BOOL PickOne,PickTwo,PickThe; 
 
	PreOne = PreTwo = PreThe = PickOne = PickTwo = PickThe = FALSE; 
	x = m_Mouse.GetXPos(); 
	y = m_Mouse.GetYPos(); 
 
	if(x >= 450 && x < 578 && y >= 310 && y < 334) 
	{ 
		if(m_Mouse.GetButtonState(0)) 
			PreOne = TRUE; 
		PickOne = TRUE; 
	} 
	if(x >= 450 && x < 578 && y >= 350 && y < 374) 
	{ 
		if(m_Mouse.GetButtonState(0)) 
			PreTwo = TRUE; 
		PickTwo = TRUE; 
	} 
	if(x >= 450 && x < 578 && y >= 390 && y < 414) 
	{ 
		if(m_Mouse.GetButtonState(0)) 
			PreThe = TRUE; 
		PickThe = TRUE; 
	} 
 
	if(PreOne) 
	{ 
		m_Graphics.Get3DDevice()->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(128,128,128,255), 1.0f, 0); 
		if(SUCCEEDED(m_Graphics.Get3DDevice()->BeginScene()))  
		{ 
			m_StateFont.Print("正在加载...",0,0,m_Graphics.GetWidth(),m_Graphics.GetHeight() , 0xffffff00,DT_CENTER|DT_VCENTER); 
			m_Font.Print("左键选棋子\n右键移动\nR 重整棋盘位置",0,m_Graphics.GetHeight()-100,m_Graphics.GetWidth(),m_Graphics.GetHeight(),0xffffff00,DT_CENTER); 
 
			m_Graphics.Get3DDevice()->EndScene(); 
		} 
		m_Graphics.Get3DDevice()->Present(NULL, NULL, NULL, NULL); 
 
		m_Buttons[0].Load(&m_Graphics, "Data\\b_rotl_pressed.tga", D3DCOLOR_RGBA(0,0,0,255)); 
		m_Buttons[1].Load(&m_Graphics, "Data\\b_rotr_pressed.tga", D3DCOLOR_RGBA(0,0,0,255)); 
		m_Buttons[2].Load(&m_Graphics, "Data\\b_rotl_hover_pressed.tga", D3DCOLOR_RGBA(0,0,0,255)); 
		m_Buttons[3].Load(&m_Graphics, "Data\\b_rotr_hover_pressed.tga", D3DCOLOR_RGBA(0,0,0,255)); 
 
		m_ChessMeshes[0].Load( &m_Graphics, "Data\\棋盘.x", "Data\\" ); 
		m_ChessMeshes[1].Load( &m_Graphics, "Data\\车.x", "Data\\" ); 
		m_ChessMeshes[2].Load( &m_Graphics, "Data\\马.x", "Data\\" ); 
		m_ChessMeshes[3].Load( &m_Graphics, "Data\\象.x", "Data\\" ); 
		m_ChessMeshes[4].Load( &m_Graphics, "Data\\王后.x", "Data\\" ); 
		m_ChessMeshes[5].Load( &m_Graphics, "Data\\国王.x", "Data\\" ); 
		m_ChessMeshes[6].Load( &m_Graphics, "Data\\兵.x", "Data\\" ); 
		m_PickMeshes[0].Load( &m_Graphics, "Data\\PickGreen.x", "Data\\" ); 
		m_PickMeshes[1].Load( &m_Graphics, "Data\\PickRed.x", "Data\\" ); 
		OriginalPosition(); 
		m_Graphics.EnableZBuffer(TRUE); 
		m_Graphics.Get3DDevice()->SetRenderState(D3DRS_LIGHTING, true); 
		m_AppState = APPSTATE_SELF; 
		return TRUE; 
	} 
	if(PreThe) 
		return FALSE; 
 
    m_MenuCam.Point(0.0f, 0.0f, -350.0f, 0.0f, 0.0f, 0.0f); 
	m_Graphics.Get3DDevice()->SetRenderState(D3DRS_LIGHTING, false); 
	m_Graphics.Get3DDevice()->SetTransform( D3DTS_VIEW, m_MenuCam.GetMatrix()); 
	m_Graphics.Get3DDevice()->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_RGBA(128,128,128,255), 1.0f, 0); 
	m_Graphics.Get3DDevice()->BeginScene(); 
 
	m_Graphics.EnableZBuffer(FALSE); 
	m_Graphics.Get3DDevice()->SetTexture(0, m_MenuTexture.GetTexDevice()); 
	m_MenuVB.Render(0, 2, D3DPT_TRIANGLESTRIP); 
	m_MenuButtons.Blit(450,310,0,0); 
	m_MenuButtons.Blit(450,350,0,0); 
	m_MenuButtons.Blit(450,390,0,0); 
 
	if(PickOne) 
		m_MenuSelect.Blit(450,310,0,0); 
	if(PickTwo) 
		m_MenuSelect.Blit(450,350,0,0); 
	if(PickThe) 
		m_MenuSelect.Blit(450,390,0,0); 
 
	m_MenuFont.Print("开新局", 450, 310, 128, 30, 0xFFFFFF00, DT_CENTER|DT_VCENTER); 
	m_MenuFont.Print("棋局设置",450,350,128,30,0xFFFFFF00,DT_CENTER|DT_VCENTER); 
	m_MenuFont.Print("退出",450,390,128,30,0xFFFFFF00,DT_CENTER|DT_VCENTER); 
	m_MenuFont.Print("V 0.8",0,400,100,100); 
	m_Graphics.Get3DDevice()->EndScene(); 
	m_Graphics.Get3DDevice()->Present(NULL, NULL, NULL, NULL); 
	return TRUE; 
} 
 
BOOL cChess::GameOver( float Elapsed ) 
{ 
	char Stats[1024]; 
	DWORD i,j; 
 
	m_Camera.Point( m_xPos * sinf(ROTATE), 3.0f, m_zPos * cosf(ROTATE), 0.0f, 0.0f, 0.0f ); 
	m_Graphics.Get3DDevice()->SetTransform( D3DTS_VIEW, m_Camera.GetMatrix()); 
 
	m_Graphics.Get3DDevice()->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(128,128,128,255), 1.0f, 0); 
	m_Graphics.Get3DDevice()->BeginScene(); 
 
	m_ChessObjects[0].Render( FALSE ); 
	for(i=1; i<17; i++ ) 
		if( g_IsDisplay[i] ) 
			m_ChessObjects[i].Render( TRUE ); 
	for(j=17; j<33; j++ ) 
		if( g_IsDisplay[j] ) 
			m_ChessObjects[j].Render( FALSE ); 
 
	m_Buttons[0].Blit(0,412,0,0); 
	m_Buttons[1].Blit(604,412,0,0); 
 
	if( m_bMyWin ) 
		m_StateFont.Print("Win!",0,0,m_Graphics.GetWidth(),m_Graphics.GetHeight() , 0xffffff00,DT_CENTER|DT_VCENTER); 
	else 
		m_StateFont.Print("Game Over",0,0,m_Graphics.GetWidth(),m_Graphics.GetHeight() , 0xffffff00,DT_CENTER|DT_VCENTER); 
	sprintf(Stats, "FPS:%f", m_FPS ); 
	m_Font.Print(Stats,0,0,400,100); 
 
	m_Graphics.Get3DDevice()->EndScene(); 
	m_Graphics.Get3DDevice()->Present(NULL, NULL, NULL, NULL); 
 
    static FLOAT LastTime = 0.0f; 
    static DWORD Frames  = 0L; 
    FLOAT Time = Timer(); 
    ++Frames; 
 
    if( Time - LastTime > 1.0f ) 
    { 
        m_FPS    = Frames / (Time - LastTime); 
        LastTime = Time; 
        Frames  = 0L; 
    } 
 
	return TRUE; 
} 
 
BOOL cChess::RenderFrame( float Elapsed ) 
{ 
	int i,j; 
	char     Stats[1024]; 
	BOOL RotLeft,RotRight; 
	RotLeft = RotRight = FALSE; 
	long x, y; 
 
	x = m_Mouse.GetXPos(); 
	y = m_Mouse.GetYPos(); 
 
	if( m_Keyboard.GetKeyState( DIK_R ) == TRUE ) 
	{ 
		ROTATE = 0.0f; 
	} 
 
	PickChessman(); 
	PickMove(); 
 
	if(x >= 0 && x < 32 && y >= 412 && y < 444) 
	{ 
		if(m_Mouse.GetButtonState(0)) 
			ROTATE -= 0.087266f; 
		RotLeft = TRUE; 
	} 
 
	if(x >= 604 && x < 636 && y >= 412 && y < 444) 
	{ 
		if(m_Mouse.GetButtonState(0)) 
			ROTATE += 0.087266f; 
		RotRight = TRUE; 
	} 
 
	m_Camera.Point( m_xPos * sinf(ROTATE), 3.0f, m_zPos * cosf(ROTATE), 0.0f, 0.0f, 0.0f ); 
	m_Graphics.Get3DDevice()->SetTransform( D3DTS_VIEW, m_Camera.GetMatrix()); 
	m_Graphics.Get3DDevice()->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(128,128,128,255), 1.0f, 0); 
	m_Graphics.Get3DDevice()->BeginScene(); 
 
	m_ChessObjects[0].Render( FALSE ); 
	for(i=1; i<17; i++ ) 
		if( g_IsDisplay[i] ) 
			m_ChessObjects[i].Render( TRUE ); 
	for(j=17; j<33; j++ ) 
		if( g_IsDisplay[j] ) 
			m_ChessObjects[j].Render( FALSE ); 
 
	m_Buttons[0].Blit(0,412,0,0); 
	m_Buttons[1].Blit(604,412,0,0); 
	if(RotLeft) 
		m_Buttons[2].Blit(0,412,0,0); 
	if(RotRight) 
		m_Buttons[3].Blit(604,412,0,0); 
 
	if( m_Pick ) 
	{ 
		m_Graphics.EnableAlphaTesting(TRUE); 
		m_Graphics.EnableAlphaBlending(TRUE); 
		for( i=0; i<30; i++ ) 
			if( m_PickGreenDisplay[i] ) 
				m_PickGreenObjects[i].Render( FALSE ); 
		for( i=0; i<8; i++ ) 
			if( m_PickRedDisplay[i] ) 
				m_PickRedObjects[i].Render( FALSE ); 
		m_Graphics.EnableAlphaBlending(FALSE); 
		m_Graphics.EnableAlphaTesting(FALSE); 
	} 
 
	sprintf(Stats, "FPS:%f", m_FPS ); 
	m_Font.Print(Stats,0,0,400,100); 
	m_Font.Print("到我走棋啦!",0,20,100,100); 
 
	m_Graphics.Get3DDevice()->EndScene(); 
	m_Graphics.Get3DDevice()->Present(NULL, NULL, NULL, NULL); 
 
    static FLOAT LastTime = 0.0f; 
    static DWORD Frames  = 0L; 
    FLOAT Time = Timer(); 
    ++Frames; 
 
    if( Time - LastTime > 1.0f ) 
    { 
        m_FPS    = Frames / (Time - LastTime); 
        LastTime = Time; 
        Frames  = 0L; 
    } 
 
	return TRUE; 
} 
 
BOOL cChess::RenderThinkFrame( float Elapsed ) 
{ 
	int resultman=0; 
	POINT resultpoint={-1,-1}; 
	BOOL flag; 
	if(SUCCEEDED(m_Graphics.Get3DDevice()->BeginScene()))  
	{ 
		m_Font.Print("AI思考中...",0,20,100,100); 
 
		m_Graphics.Get3DDevice()->EndScene(); 
	} 
	m_Graphics.Get3DDevice()->Present(NULL, NULL, NULL, NULL); 
 
	flag = Think( resultman, resultpoint ); 
 
	if( flag ) 
	{ 
		m_CalcuateXMove = g_XCoordinateToPosition[resultpoint.x]; 
		m_CalcuateZMove = g_ZCoordinateToPosition[resultpoint.y]; 
		m_CalcuateMoveChessman = resultman; 
		m_Pick = resultman; 
		m_Side = 1; 
 
		CalcuateSourceTarget(m_CalcuateXMove, m_CalcuateZMove ); 
		PlaySound(0); 
		m_AppState = APPSTATE_ANIMATION; 
	} 
	else 
	{ 
		m_bEndGame = TRUE; 
		m_bMyWin   = TRUE; 
		StopMusic(); 
		m_AppState = APPSTATE_GAMEOVER; 
	} 
 
	return FALSE; 
} 
void cChess::QuickSort( int A[], int chessman[], POINT targetpoint[], int low, int high ) 
{ 
	int pivot; 
	int pivot_man; 
	POINT pivot_point; 
	int scanUp, scanDown; 
	int mid, k; 
	POINT point; 
 
	if(high-low<=0) return; 
	else 
	{ 
		if(high-low==1) 
		{ 
			if(A[high]>A[low]) 
			{ 
				k=A[high]; 
				A[high]=A[low]; 
				A[low]=k; 
				k=chessman[high]; 
				chessman[high]=chessman[low]; 
				chessman[low]=k; 
				point=targetpoint[high]; 
				targetpoint[high]=targetpoint[low]; 
				targetpoint[low]=point; 
				return; 
			} 
 
		} 
	} 
	mid=(low+high)/2; 
	pivot=A[mid]; 
	pivot_man=chessman[mid]; 
	pivot_point=targetpoint[mid]; 
	k=A[mid]; 
	A[mid]=A[low]; 
	A[low]=k; 
	k=chessman[mid]; 
	chessman[mid]=chessman[low]; 
	chessman[low]=k; 
	point=targetpoint[mid]; 
	targetpoint[mid]=targetpoint[low]; 
	targetpoint[low]=point; 
	scanUp = low+1; 
	scanDown = high; 
	do 
	{ 
		while(scanUp<=scanDown && A[scanUp]>=pivot) 
			scanUp++; 
		while(pivot>A[scanDown]) 
			scanDown--; 
		if(scanUp2) 
		{ 
			int value[125]; 
			cur=0; 
			maxvalue=-10000; 
			while(curmaxvalue)maxvalue=curvalue; 
				cur++; 
			} 
			QuickSort(value,chessman,targetpoint,0,count-1); 
			count/=2; 
		} 
		maxvalue=-10000; 
		cur=0; 
		while(curmaxvalue) 
			{ 
				maxvalue=curvalue; 
				resultman=chessman[cur]; 
				resultpoint=targetpoint[cur]; 
			} 
			cur++; 
		} 
		return TRUE; 
	} 
	else 
	{ 
		if(count>0) 
		{ 
			resultman=chessman[count-1]; 
			resultpoint=targetpoint[count-1]; 
			return TRUE; 
		} 
		else 
		{ 
			resultman=0; 
			resultpoint.x=-1; 
			return FALSE; 
		} 
	} 
} 
 
int cChess::Search( int map[8][8], POINT manposition[33], BOOL tisfirstmove[33],int &tside,int man, POINT point, int upmax, int depth ) 
{ 
	int ate,cur,maxvalue,curvalue,xs,ys; 
	int count; 
 
	ate = 0; 
 
	xs=manposition[man].x;ys=manposition[man].y; 
	if(SideOfMan[map[point.x][point.y]] == !tside)	// 目标点有对方的棋子 
	{ 
		ate=map[point.x][point.y];		// 记录下被吃掉的棋子 
		if(ate==13 || ate==29) 
		{ 
			return 9999; 
		} 
		manposition[ate].x=-1;	// 目标点的棋子被吃掉 
	} 
	depth--; 
	map[point.x][point.y] = man; 
	map[xs][ys] = 0; 
	manposition[man] = point; 
	tisfirstmove[man] = TRUE; 
	tside=!tside;	// 假设对方行一步 
 
	if(depth>0) 
	{ 
		int chessman[125]; 
		POINT targetpoint[125]; 
		if(EnumList(map, manposition, tisfirstmove,tside,chessman, targetpoint, count) ) 
		{ 
			if(depth>=2) 
			{ 
				int value[125]; 
				cur=0; 
				maxvalue=-10000; 
				while(curmaxvalue) maxvalue=curvalue; 
					cur++; 
				} 
				QuickSort(value, chessman, targetpoint, 0, count-1); 
				count/=2; 
			} 
 
			maxvalue=-10000; 
			cur=0; 
			while(curmaxvalue) maxvalue=curvalue; 
				if(curvalue>=-upmax) goto _ENDSUB; 
				cur++; 
			} 
		} 
		else maxvalue=9800; 
	} 
	else 
		maxvalue=Envalue(map, manposition, tisfirstmove,tside); 
 
_ENDSUB: 
	manposition[man].x=xs; 
	manposition[man].y=ys; 
	map[xs][ys]=man; 
	if(SideOfMan[man] ) 
	{ 
		if( manposition[man].y == 6 ) 
			tisfirstmove[man]=FALSE; 
	} 
	else 
	{ 
		if( manposition[man].y == 1 ) 
			tisfirstmove[man]=FALSE; 
	} 
	if(ate!=0) 
	{ 
		manposition[ate]=point; 
		map[point.x][point.y]=ate; 
	} 
	else 
		map[point.x][point.y] = 0; 
	tside = !tside; 
	return -maxvalue; 
} 
 
int cChess::Envalue( int map[8][8], POINT manposition[33], BOOL tisfirstmove[33], int &tside ) 
{ 
	static int k; 
	static int ManExtValue[33]; 
	static int ManBaseValue[33]; 
	static int ManContact[33][33]; 
	static int BeAteCount[33]; 
	static BOOL	OwnSee[33]; 
	for( int n=0; n<33; n++ ) 
	{ 
		ManExtValue[n]=0; 
		ManBaseValue[n]=0; 
		BeAteCount[n]=0; 
		OwnSee[n]=0; 
		for( int m=0; m<33; m++) 
			ManContact[n][m]=0; 
	} 
 
	int maxvalue=0; 
	int i,j; 
 
	ContactV( map, manposition, tisfirstmove, tside, ManBaseValue, ManContact ); 
	// 已方将军 
	for(i=FistOfSide[tside];i<=LastOfSide[tside];i++) 
	{ 
		if(ManContact[i][KingOfSide[!tside]]) 
		{ 
			maxvalue=9700; 
			return maxvalue; 
		} 
	} 
	// 根据每个棋子的活跃度,自身的值,以及所在的位置,来确定最终的值. 
	for(i=1;i<33;i++) 
	{ 
		k=g_ChessmanType[i-1]; 
		ManBaseValue[i]=BV1[k-1]+ManBaseValue[i]*BV2[k-1]; 
		switch(k) 
		{ 
		case 6: ManBaseValue[i]+=BV3[ManBPlus[SideOfMan[i]][manposition[i].x+1][manposition[i].y+1]]; 
			break; 
		} 
	} 
	for(i=1;i<33;i++) 
	{ 
		for(j=1;j<33;j++) 
		{ 
			if(ManContact[i][j]) 
			{ 
				if(SideOfMan[i]==SideOfMan[j]) 
				{ 
					// 第j号棋子被攻击一次 
					BeAteCount[j]++; 
					if(!OwnSee[j]) 
					{ 
						// 得到攻击者的防御值 
						ManExtValue[i]+=ManBaseValue[j]*contactpercent1/100; 
						OwnSee[j]=TRUE; 
					} 
				} 
				else 
				{ 
					ManExtValue[i]+=ManBaseValue[j]*contactpercent2/100; 
					BeAteCount[j]--; 
				} 
			} 
		} 
	} 
	for(i=FistOfSide[tside];i<=LastOfSide[tside];i++) 
	{ 
		if(manposition[i].x!=-1)maxvalue+=ManBaseValue[i]+ManExtValue[i]; 
	} 
	static BOOL flag; 
	flag=FALSE;k=0; 
	for(i=FistOfSide[!tside];i<=LastOfSide[!tside];i++) 
	{ 
		if(manposition[i].x!=-1)maxvalue-=ManBaseValue[i]+ManExtValue[i]; 
		// 对方将军 
		if(ManContact[i][KingOfSide[tside]]) 
		{ 
			flag=TRUE; 
			k=i; 
			break; 
		} 
	} 
	if(flag&&BeAteCount[k]>=0) // 被将,所将军的棋子不能被吃掉 
	{ 
		j=0; 
		for(i=FistOfSide[tside];i<=LastOfSide[tside];i++) 
		{ 
			if(BeAteCount[i]<0 && ManBaseValue[i]>j) 
				j=ManBaseValue[i]; 
		} 
		maxvalue -=j; 
	} 
	else 
	{ 
		j=0; 
		for(i=FistOfSide[!tside];i<=LastOfSide[!tside];i++) 
		{ 
			if(BeAteCount[i]<0 && ManBaseValue[i]>j) 
				j=ManBaseValue[i]; 
		} 
		maxvalue +=j; 
	} 
 
	return maxvalue; 
} 
 
void cChess::ContactV( int map[8][8], POINT manposition[], BOOL tisfirstmove[33],int &tside, int activity[33], int contact[33][33] ) 
{ 
#define CV(man,tx,ty) {k=map[tx][ty];activity[man]+=1;if(k!=0)contact[man][k]=1;} 
 
	static int k; 
	static int i,j,n,x,y; 
	static BOOL flag; 
 
	for(n=1;n<=32;n++) 
	{ 
		x=manposition[n].x; 
		if(x==-1) continue; 
		y=manposition[n].y; 
		switch(g_ChessmanType[n-1]) 
		{ 
		case 1: 
			i=x+1; 
			while(i<=7) 
			{ 
				if(NOMAN(i,y)) CV(n,i,y) 
				else 
				{ 
					CV(n,i,y) 
					break; 
				} 
				i++; 
			} 
			i=x-1; 
			while(i>=0) 
			{ 
				if(NOMAN(i,y)) CV(n,i,y) 
				else 
				{ 
					CV(n,i,y) 
					break; 
				} 
				i--; 
			} 
			j=y+1; 
			while(j<=7) 
			{ 
				if(NOMAN(x,j)) CV(n,x,j) 
				else 
				{ 
					CV(n,x,j) 
					break; 
				} 
				j++; 
			} 
			j=y-1; 
			while(j>=0) 
			{ 
				if(NOMAN(x,j)) CV(n,x,j) 
				else 
				{ 
					CV(n,x,j) 
					break; 
				} 
				j--; 
			} 
			break; 
		case 2: 
			j=y-2;i=x+1;if(j>=0 && i<=7) CV(n,i,j) 
			j=y-2;i=x-1;if(j>=0 && i>=0) CV(n,i,j) 
			j=y-1;i=x+2;if(j>=0 && i<=7) CV(n,i,j) 
			j=y-1;i=x-2;if(j>=0 && i>=0) CV(n,i,j) 
			j=y+1;i=x+2;if(j<=7 && i<=7) CV(n,i,j) 
			j=y+1;i=x-2;if(j<=7 && i>=0) CV(n,i,j) 
			j=y+2;i=x+1;if(j<=7 && i<=7) CV(n,i,j) 
			j=y+2;i=x-1;if(j<=7 && i>=0) CV(n,i,j) 
			break; 
		case 3: 
			j=y+1;i=x+1; // 右下 
			while(j<=7 && i<=7) 
			{ 
				if(NOMAN(i,j)) CV(n,i,j) 
				else 
				{ 
					CV(n,i,j) 
						break; 
				} 
				j++; 
				i++; 
			} 
			j=y+1;i=x-1; // 左下 
			while(j<=7 && i>=0) 
			{ 
				if(NOMAN(i,j)) CV(n,i,j) 
				else 
				{ 
					CV(n,i,j) 
						break; 
				} 
				j++; 
				i--; 
			} 
			j=y-1;i=x+1; 
			while(j>=0 && i<=7) 
			{ 
				if(NOMAN(i,j)) CV(n,i,j) 
				else 
				{ 
					CV(n,i,j) 
						break; 
				} 
				j--; 
				i++; 
			} 
			j=y-1;i=x-1; 
			while(j>=0 && i>=0) 
			{ 
				if(NOMAN(i,j)) CV(n,i,j) 
				else 
				{ 
					CV(n,i,j) 
						break; 
				} 
				j--; 
				i--; 
			} 
			break; 
		case 4: 
			i=x+1; 
			while(i<=7) 
			{ 
				if(NOMAN(i,y)) CV(n,i,y) 
				else 
				{ 
					CV(n,i,y) 
						break; 
				} 
				i++; 
			} 
			i=x-1; 
			while(i>=0) 
			{ 
				if(NOMAN(i,y)) CV(n,i,y) 
				else 
				{ 
					CV(n,i,y) 
						break; 
				} 
				i--; 
			} 
			j=y+1; 
			while(j<=7) 
			{ 
				if(NOMAN(x,j)) CV(n,x,j) 
				else 
				{ 
					CV(n,x,j) 
						break; 
				} 
				j++; 
			} 
			j=y-1; 
			while(j>=0) 
			{ 
				if(NOMAN(x,j)) CV(n,x,j) 
				else 
				{ 
					CV(n,x,j) 
						break; 
				} 
				j--; 
			} 
			j=y+1;i=x+1; // 右下 
			while(j<=7 && i<=7) 
			{ 
				if(NOMAN(i,j)) CV(n,i,j) 
				else 
				{ 
					CV(n,i,j) 
						break; 
				} 
				j++; 
				i++; 
			} 
			j=y+1;i=x-1; // 左下 
			while(j<=7 && i>=0) 
			{ 
				if(NOMAN(i,j)) CV(n,i,j) 
				else 
				{ 
					CV(n,i,j) 
						break; 
				} 
				j++; 
				i--; 
			} 
			j=y-1;i=x+1; 
			while(j>=0 && i<=7) 
			{ 
				if(NOMAN(i,j)) CV(n,i,j) 
				else 
				{ 
					CV(n,i,j) 
						break; 
				} 
				j--; 
				i++; 
			} 
			j=y-1;i=x-1; 
			while(j>=0 && i>=0) 
			{ 
				if(NOMAN(i,j)) CV(n,i,j) 
				else 
				{ 
					CV(n,i,j) 
						break; 
				} 
				j--; 
				i--; 
			} 
			break; 
		case 5: 
			j=y+1;if(j<=7) CV(n,x,j) 
			j=y-1;if(j>=0) CV(n,x,j) 
			i=x+1;if(i<=7) CV(n,i,y) 
			i=x-1;if(i>=0) CV(n,i,y) 
			j=y+1;i=x+1;if(j<=7 && i<=7) CV(n,i,j) 
			j=y+1;i=x-1;if(j<=7 && i>=0) CV(n,i,j) 
			j=y-1;i=x+1;if(j>=0 && i<=7) CV(n,i,j) 
			j=y-1;i=x-1;if(j>=0 && i>=0) CV(n,i,j) 
			break; 
		case 6: 
			if(SideOfMan[n]) 
			{ 
				if( tisfirstmove[n] ) 
				{ 
					j=y-1;if(j>=0 && NOMAN(x,j)) CV(n,x,j) 
					j=y-1;i=x-1;if(j>=0 && i>=0 && !NOMAN(i,j)) CV(n,i,j) 
					j=y-1;i=x+1;if(j>=0 && i<=7 && !NOMAN(i,j)) CV(n,i,j) 
				} 
				else 
				{ 
					j=y-1;if(j>=0 && NOMAN(x,j)) CV(n,x,j) 
					j=y-2;if(j>=0 && NOMAN(x,j)) CV(n,x,j) 
					j=y-1;i=x-1;if(j>=0 && i>=0 && !NOMAN(i,j)) CV(n,i,j) 
					j=y-1;i=x+1;if(j>=0 && i<=7 && !NOMAN(i,j)) CV(n,i,j) 
				} 
			} 
			else 
			{ 
				if( tisfirstmove[n] ) 
				{ 
					j=y+1;if(j<=7 && NOMAN(x,j)) CV(n,x,j) 
					j=y+1;i=x-1;if(j<=7 && i>=0 && !NOMAN(i,j)) CV(n,i,j) 
					j=y+1;i=x+1;if(j<=7 && i<=7 && !NOMAN(i,j)) CV(n,i,j) 
				} 
				else 
				{ 
					j=y+1;if(j<=7 && NOMAN(x,j)) CV(n,x,j) 
					j=y+2;if(j<=7 && NOMAN(x,j)) CV(n,x,j) 
					j=y+1;i=x-1;if(j<=7 && i>=0 && !NOMAN(i,j)) CV(n,i,j) 
					j=y+1;i=x+1;if(j<=7 && i<=7 && !NOMAN(i,j)) CV(n,i,j) 
				} 
			} 
			break; 
		default : 
			break; 
		} 
	} 
} 
 
BOOL cChess::EnumList( int map[8][8], POINT manposition[33],BOOL tisfirstmove[33],int &tside,int *chessman, POINT *move, int &count ) 
{ 
	#define ADD(man,tx,ty) {chessman[count]=man;move[count].x=tx;move[count].y=ty;count++;if(map[tx][ty]==KingOfSide[!tside])goto _NOKING;} 
	static int i,j,n,x,y; 
	static BOOL	flag; 
	count=0; 
	for( n=FistOfSide[tside]; n=0) 
			{ 
				if(NOMAN(i,y)) ADD(n,i,y) 
				else 
				{ 
					if(NOSELF(tside,i,y)) ADD(n,i,y) 
						break; 
				} 
				i--; 
			} 
			j=y+1; 
			while(j<=7) 
			{ 
				if(NOMAN(x,j)) ADD(n,x,j) 
				else 
				{ 
					if(NOSELF(tside,x,j)) ADD(n,x,j) 
						break; 
				} 
				j++; 
			} 
			j=y-1; 
			while(j>=0) 
			{ 
				if(NOMAN(x,j)) ADD(n,x,j) 
				else 
				{ 
					if(NOSELF(tside,x,j)) ADD(n,x,j) 
						break; 
				} 
				j--; 
			} 
			break; 
		case 2: 
			j=y-2;i=x+1;if(j>=0 && i<=7 && NOSELF(tside,i,j)) ADD(n,i,j) 
			j=y-2;i=x-1;if(j>=0 && i>=0 && NOSELF(tside,i,j)) ADD(n,i,j) 
			j=y-1;i=x+2;if(j>=0 && i<=7 && NOSELF(tside,i,j)) ADD(n,i,j) 
			j=y-1;i=x-2;if(j>=0 && i>=0 && NOSELF(tside,i,j)) ADD(n,i,j) 
			j=y+1;i=x+2;if(j<=7 && i<=7 && NOSELF(tside,i,j)) ADD(n,i,j) 
			j=y+1;i=x-2;if(j<=7 && i>=0 && NOSELF(tside,i,j)) ADD(n,i,j) 
			j=y+2;i=x+1;if(j<=7 && i<=7 && NOSELF(tside,i,j)) ADD(n,i,j) 
			j=y+2;i=x-1;if(j<=7 && i>=0 && NOSELF(tside,i,j)) ADD(n,i,j) 
			break; 
		case 3: 
			j=y+1;i=x+1; // 右下 
			while(j<=7 && i<=7) 
			{ 
				if(NOMAN(i,j)) ADD(n,i,j) 
				else 
				{ 
					if(NOSELF(tside,i,j)) ADD(n,i,j) 
						break; 
				} 
				j++; 
				i++; 
			} 
			j=y+1;i=x-1; // 左下 
			while(j<=7 && i>=0) 
			{ 
				if(NOMAN(i,j)) ADD(n,i,j) 
				else 
				{ 
					if(NOSELF(tside,i,j)) ADD(n,i,j) 
						break; 
				} 
				j++; 
				i--; 
			} 
			j=y-1;i=x+1; 
			while(j>=0 && i<=7) 
			{ 
				if(NOMAN(i,j)) ADD(n,i,j) 
				else 
				{ 
					if(NOSELF(tside,i,j)) ADD(n,i,j) 
						break; 
				} 
				j--; 
				i++; 
			} 
			j=y-1;i=x-1; 
			while(j>=0 && i>=0) 
			{ 
				if(NOMAN(i,j)) ADD(n,i,j) 
				else 
				{ 
					if(NOSELF(tside,i,j)) ADD(n,i,j) 
						break; 
				} 
				j--; 
				i--; 
			} 
			break; 
		case 4: 
			i=x+1; 
			while(i<=7) 
			{ 
				if(NOMAN(i,y)) ADD(n,i,y) 
				else 
				{ 
					if(NOSELF(tside,i,y)) ADD(n,i,y) 
						break; 
				} 
				i++; 
			} 
			i=x-1; 
			while(i>=0) 
			{ 
				if(NOMAN(i,y)) ADD(n,i,y) 
				else 
				{ 
					if(NOSELF(tside,i,y)) ADD(n,i,y) 
						break; 
				} 
				i--; 
			} 
			j=y+1; 
			while(j<=7) 
			{ 
				if(NOMAN(x,j)) ADD(n,x,j) 
				else 
				{ 
					if(NOSELF(tside,x,j)) ADD(n,x,j) 
						break; 
				} 
				j++; 
			} 
			j=y-1; 
			while(j>=0) 
			{ 
				if(NOMAN(x,j)) ADD(n,x,j) 
				else 
				{ 
					if(NOSELF(tside,x,j)) ADD(n,x,j) 
						break; 
				} 
				j--; 
			} 
			j=y+1;i=x+1; // 右下 
			while(j<=7 && i<=7) 
			{ 
				if(NOMAN(i,j)) ADD(n,i,j) 
				else 
				{ 
					if(NOSELF(tside,i,j)) ADD(n,i,j) 
						break; 
				} 
				j++; 
				i++; 
			} 
			j=y+1;i=x-1; // 左下 
			while(j<=7 && i>=0) 
			{ 
				if(NOMAN(i,j)) ADD(n,i,j) 
				else 
				{ 
					if(NOSELF(tside,i,j)) ADD(n,i,j) 
						break; 
				} 
				j++; 
				i--; 
			} 
			j=y-1;i=x+1; 
			while(j>=0 && i<=7) 
			{ 
				if(NOMAN(i,j)) ADD(n,i,j) 
				else 
				{ 
					if(NOSELF(tside,i,j)) ADD(n,i,j) 
						break; 
				} 
				j--; 
				i++; 
			} 
			j=y-1;i=x-1; 
			while(j>=0 && i>=0) 
			{ 
				if(NOMAN(i,j)) ADD(n,i,j) 
				else 
				{ 
					if(NOSELF(tside,i,j)) ADD(n,i,j) 
						break; 
				} 
				j--; 
				i--; 
			} 
			break; 
		case 5: 
			j=y+1;if(j<=7 && NOSELF(tside,x,j)) ADD(n,x,j) 
			j=y-1;if(j>=0 && NOSELF(tside,x,j)) ADD(n,x,j) 
			i=x+1;if(i<=7 && NOSELF(tside,i,y)) ADD(n,i,y) 
			i=x-1;if(i>=0 && NOSELF(tside,i,y)) ADD(n,i,y) 
			j=y+1;i=x+1;if(j<=7 && i<=7 && NOSELF(tside,i,j)) ADD(n,i,j) 
			j=y+1;i=x-1;if(j<=7 && i>=0 && NOSELF(tside,i,j)) ADD(n,i,j) 
			j=y-1;i=x+1;if(j>=0 && i<=7 && NOSELF(tside,i,j)) ADD(n,i,j) 
			j=y-1;i=x-1;if(j>=0 && i>=0 && NOSELF(tside,i,j)) ADD(n,i,j) 
			break; 
		case 6: 
			if(tside) 
			{ 
				if( tisfirstmove[n] ) 
				{ 
					j=y-1;if(j>=0 && NOMAN(x,j) && NOSELF(tside,x,j))  ADD(n,x,j) 
					j=y-1;i=x-1;if(j>=0 && i>=0 && !NOMAN(i,j) && NOSELF(tside,i,j)) ADD(n,i,j) 
					j=y-1;i=x+1;if(j>=0 && i<=7 && !NOMAN(i,j) && NOSELF(tside,i,j)) ADD(n,i,j) 
				} 
				else 
				{ 
					j=y-1;i=x-1;if(j>=0 && i>=0 && !NOMAN(i,j) && NOSELF(tside,i,j)) ADD(n,i,j) 
					j=y-1;i=x+1;if(j>=0 && i<=7 && !NOMAN(i,j) && NOSELF(tside,i,j)) ADD(n,i,j) 
					j=y-1; 
					if(j>=0 && NOMAN(x,j) && NOSELF(tside,x,j))   
						ADD(n,x,j) 
					else 
						break; 
					j=y-2;if(j<=7 && NOMAN(x,j) && NOSELF(tside,x,j))  ADD(n,x,j) 
				} 
			} 
			else 
			{ 
				if( tisfirstmove[n] ) 
				{ 
					j=y+1;if(j<=7 && NOMAN(x,j) && NOSELF(tside,x,j))  ADD(n,x,j) 
					j=y+1;i=x-1;if(j<=7 && i>=0 && !NOMAN(i,j) && NOSELF(tside,i,j)) ADD(n,i,j) 
					j=y+1;i=x+1;if(j<=7 && i<=7 && !NOMAN(i,j) && NOSELF(tside,i,j)) ADD(n,i,j) 
				} 
				else 
				{ 
					j=y+1;i=x-1;if(j<=7 && i>=0 && !NOMAN(i,j) && NOSELF(tside,i,j)) ADD(n,i,j) 
					j=y+1;i=x+1;if(j<=7 && i<=7 && !NOMAN(i,j) && NOSELF(tside,i,j)) ADD(n,i,j) 
					j=y+1; 
					if(j<=7 && NOMAN(x,j) && NOSELF(tside,x,j))   
						ADD(n,x,j) 
					else 
						break; 
					j=y+2;if(j<=7 && NOMAN(x,j) && NOSELF(tside,x,j))  ADD(n,x,j) 
				} 
			} 
			break; 
		default : 
			break; 
		} 
	} 
	return TRUE; 
_NOKING: 
	return FALSE; 
} 
 
BOOL cChess::RenderAnimationFrame( float Elapsed ) 
{ 
	int i,j; 
	char     Stats[128]; 
	BOOL	RotLeft,RotRight; 
	RotLeft = RotRight = FALSE; 
	long x, y; 
 
	x = m_Mouse.GetXPos(); 
	y = m_Mouse.GetYPos(); 
 
	if( m_Keyboard.GetKeyState( DIK_R ) == TRUE ) 
	{ 
		m_xPos = 0.0f; 
		m_zPos = -2.5f; 
	} 
 
 
	if(x >= 0 && x < 32 && y >= 412 && y < 444) 
	{ 
		RotLeft = TRUE; 
	} 
 
	if(x >= 604 && x < 636 && y >= 412 && y < 444) 
	{ 
		RotRight = TRUE; 
	} 
 
	CalculateMove( Elapsed ); 
	m_Camera.Point( m_xPos * sinf(ROTATE), 3.0f, m_zPos * cosf(ROTATE), 0.0f, 0.0f, 0.0f ); 
	m_Graphics.Get3DDevice()->SetTransform( D3DTS_VIEW, m_Camera.GetMatrix()); 
	m_Graphics.Get3DDevice()->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(128,128,128,255), 1.0f, 0); 
	m_Graphics.Get3DDevice()->BeginScene(); 
 
	m_ChessObjects[0].Render( FALSE ); 
	for(i=1; i<17; i++ ) 
		if( g_IsDisplay[i] ) 
		m_ChessObjects[i].Render( TRUE ); 
	for(j=17; j<33; j++ ) 
		if( g_IsDisplay[j] ) 
		m_ChessObjects[j].Render( FALSE ); 
 
	m_Buttons[0].Blit(0,412,0,0); 
	m_Buttons[1].Blit(604,412,0,0); 
 
	if(RotLeft) 
		m_Buttons[2].Blit(0,412,0,0); 
 
	if(RotRight) 
		m_Buttons[3].Blit(604,412,0,0); 
 
	sprintf(Stats, "FPS:%f", m_FPS ); 
	m_Font.Print(Stats,0,0,400,100); 
	m_Graphics.Get3DDevice()->EndScene(); 
	m_Graphics.Get3DDevice()->Present(NULL, NULL, NULL, NULL); 
 
    static FLOAT LastTime = 0.0f; 
    static DWORD Frames  = 0L; 
    FLOAT Time = Timer(); 
    ++Frames; 
 
    if( Time - LastTime > 1.0f ) 
    { 
        m_FPS    = Frames / (Time - LastTime); 
        LastTime = Time; 
        Frames  = 0L; 
    } 
 
	return TRUE; 
} 
 
BOOL cChess::PickChessman() 
{ 
	D3DXMATRIX *matPick; 
	long i; 
 
	if( m_bEndGame ) return TRUE; 
 
	if( m_Mouse.GetButtonState(0) ) 
	{ 
		// 只能选择我方棋子 
		for( i=17; i<33; i++ ) 
		{ 
			if( GetMouseHitMesh( i, NULL )) 
			{ 
				m_IsPick = TRUE; 
				m_Pick = i; 
				matPick = m_ChessObjects[i].GetMatrix(); 
				m_PickGreenObjects[0].Move( matPick->_41, 0.0f, matPick->_43); 
				CheckMove();	// 检查可行区域 
				break; 
			} 
		} 
	} 
	if( !m_IsPick ) 
	{ 
		for( i=1; i<33; i++ ) 
		{ 
			if( GetMouseHitMesh( i, NULL )) 
			{ 
				m_Pick = i; 
				matPick = m_ChessObjects[i].GetMatrix(); 
				m_PickGreenObjects[0].Move( matPick->_41, 0.0f, matPick->_43); 
				break; 
			} 
			// 如果鼠标没有选中,则消去标记 
			m_Pick = 0; 
		} 
	} 
 
	return FALSE; 
} 
 
BOOL cChess::PickMove() 
{ 
	DWORD Face = 0; 
	DWORD Result; 
	float xMove, zMove; 
	 
	if( m_bEndGame ) return TRUE; 
	if( m_Pick ) 
	{ 
		if( m_Mouse.GetButtonState(1) ) 
		{ 
			if( GetMouseHitMesh( 0,&Face )) 
			{ 
				Result = Face/16; 
 
				if( Result < 4 ) zMove = -(0.125 +(3-Result)*0.25); 
				else zMove = (0.125 + (Result-4)*0.25); 
 
				Result = Face % 16; 
				if( (Result %2)==0) Result +=1; 
 
				if( Result <= 7 ) xMove = -(0.125 + (7-Result)/2*0.25); 
				else xMove = ( 0.125 + (Result%9)/2*0.25); 
 
				CalcuateSourceTarget( xMove, zMove ); 
				if( g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[m_xTarget][m_zTarget] == -1 ) 
					return FALSE; 
				m_CalcuateXMove = xMove; 
				m_CalcuateZMove = zMove; 
				m_CalcuateMoveChessman = m_Pick; 
				m_Pick = 0; 
				m_Side = 0; 
 
				PlaySound(0); 
				m_AppState = APPSTATE_ANIMATION; 
			} 
		} 
	} 
 
	return FALSE; 
} 
 
void cChess::CalcuateSourceTarget( float xMove, float zMove ) 
{ 
	long i,j; 
 
	for( i=0; i<8; i++ ) 
		if( g_XCoordinateToPosition[i] == xMove ) 
		{ 
			m_xTarget = i; 
			break; 
		} 
	for( j=0; j<8; j++ ) 
		if( g_ZCoordinateToPosition[j] == zMove ) 
		{ 
			m_zTarget = j; 
			break; 
		} 
	for( i=0; i<8; i++ ) 
		if( g_XCoordinateToPosition[i] == m_ChessObjects[m_Pick].GetXPos() ) 
		{ 
			m_xSource = i; 
			break; 
		} 
	for( j=0; j<8; j++ ) 
		if( g_ZCoordinateToPosition[j] == m_ChessObjects[m_Pick].GetZPos() ) 
		{ 
			m_zSource = j; 
			break; 
		} 
} 
BOOL cChess::CalculateMove( float Elapsed ) 
{ 
	D3DXMATRIX *matPick; 
	float xMove, zMove; 
	float XDiff, ZDiff, Dist; 
	long i; 
 
	if( !m_CalcuateXMove && !m_CalcuateZMove ) 
		return FALSE; 
 
	matPick = m_ChessObjects[m_CalcuateMoveChessman].GetMatrix(); 
 
	XDiff = fabs(m_CalcuateXMove - matPick->_41); 
	ZDiff = fabs(m_CalcuateZMove - matPick->_43); 
 
	Dist = sqrt(XDiff*XDiff + ZDiff*ZDiff); 
	xMove = (m_CalcuateXMove - matPick->_41) / Dist * 0.06f; 
	zMove = (m_CalcuateZMove - matPick->_43) / Dist * 0.06f; 
	m_ChessObjects[m_CalcuateMoveChessman].Move( matPick->_41 + xMove, 0.0f, matPick->_43 + zMove ); 
	Dist -= 0.06f; 
	if( Dist < 0 ) 
	{ 
		m_ChessObjects[m_CalcuateMoveChessman].Move( m_CalcuateXMove, 0.0f, m_CalcuateZMove ); 
		g_IsDisplay[g_ChessmanMap[m_xTarget][m_zTarget]] = 0; 
		g_PointChessman[g_ChessmanMap[m_xTarget][m_zTarget]].x = -1; 
		g_PointChessman[g_ChessmanMap[m_xTarget][m_zTarget]].y = -1; 
		g_ChessmanMap[m_xTarget][m_zTarget] = m_CalcuateMoveChessman;	// 设置地图同步 
		g_ChessmanMap[m_xSource][m_zSource] = 0;						// 将源坐标清零 
		g_PointChessman[m_CalcuateMoveChessman].x = m_xTarget; 
		g_PointChessman[m_CalcuateMoveChessman].y = m_zTarget; 
		// 兵走到底变王后 
		if(g_ChessmanType[m_CalcuateMoveChessman-1] == 6 && (g_PointChessman[m_CalcuateMoveChessman].y == 7 || g_PointChessman[m_CalcuateMoveChessman].y == 0)) 
		{ 
			g_ChessmanType[m_CalcuateMoveChessman-1] = 4; 
			m_ChessObjects[m_CalcuateMoveChessman].SetMesh(&m_ChessMeshes[4]); 
		} 
		m_xTarget = -1;m_zTarget = -1; 
		m_xSource = -1;m_zSource = -1; 
 
		// 清除显示标记 
		for( i=1; i<30; i++ ) 
			m_PickGreenDisplay[i] = FALSE; 
		for( i=0; i<8; i++ ) 
			m_PickRedDisplay[i] = FALSE; 
		m_IsFirstMove[m_CalcuateMoveChessman] = TRUE; 
		m_CalcuateXMove = m_CalcuateZMove = 0.0f; 
		m_CalcuateMoveChessman = 0; 
		m_Pick = 0; 
		m_IsPick = FALSE; 
 
		RenderAnimationFrame(0); 
		if( g_PointChessman[13].x == -1 ) 
		{ 
			m_bEndGame = TRUE; 
			m_bMyWin	= TRUE; 
			StopMusic(); 
			m_AppState = APPSTATE_GAMEOVER; 
		} 
		else 
		if( g_PointChessman[29].x == -1 ) 
		{ 
			m_bEndGame	= TRUE; 
			m_bMyWin	= FALSE; 
			StopMusic(); 
			m_AppState = APPSTATE_GAMEOVER; 
		} 
		else 
		{ 
			if( m_Side ) 
				m_AppState = APPSTATE_SELF; 
			else 
				m_AppState = APPSTATE_AI; 
		} 
		return TRUE; 
	} 
 
	return TRUE; 
} 
 
BOOL cChess::CheckMove() 
{ 
	POINT CanGoPoint; 
	long i,Flag=0; 
 
	// 清除显示标记 
	for( i=1; i<30; i++ ) m_PickGreenDisplay[i] = FALSE; 
	for( i=0; i< 8; i++ ) m_PickRedDisplay[i] = FALSE; 
	for( i=0; i<33; i++ ) g_sChessmanCanGoMap[i].Reset(); 
 
	if( !m_Pick ) return FALSE; 
	CanGoPoint = g_PointChessman[m_Pick]; 
	if( CanGoPoint.x == -1 && CanGoPoint.y == -1 ) return FALSE; 
 
	switch( g_ChessmanType[m_Pick-1] ) 
	{ 
	case 1: 
		// 向上 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.y-i) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-i] == 0 ) 
			{ 
				m_PickGreenObjects[i].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickGreenDisplay[i] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y-i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-i] >0 && g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-i] < 17 ) 
			{ 
				// 一条线路只有一个棋子可能被吃 
				m_PickRedObjects[0].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickRedDisplay[0] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y-i] = g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 向下 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.y+i) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+i] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y+i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+i] >0 && g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+i] < 17 ) 
			{ 
				m_PickRedObjects[1].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickRedDisplay[1] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y+i] = g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 向左 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x-i) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y] >0 && g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y] < 17 ) 
			{ 
				m_PickRedObjects[2].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickRedDisplay[2] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y] = g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 向右 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x+i) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y] >0 && g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y] < 17 ) 
			{ 
				m_PickRedObjects[3].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickRedDisplay[3] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y] = g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
		break; 
 
	case 2: // 马 
		// 左上 
		if( (CanGoPoint.x-1) >= 0 && (CanGoPoint.y-2) >= 0 ) 
		if( g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-2] == 0 ) 
		{ 
			m_PickGreenObjects[1].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-2] ); 
			m_PickGreenDisplay[1] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y-2] = 0; 
		} 
		else 
		if( g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-2] > 0 && g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-2] < 17 ) 
		{ 
			m_PickRedObjects[0].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-2] ); 
			m_PickRedDisplay[0] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y-2] = g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-2]; 
		} 
 
		// 右上 
		if( (CanGoPoint.x+1) <= 7 && (CanGoPoint.y-2) >= 0 ) 
		if( g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-2] == 0 ) 
		{ 
			m_PickGreenObjects[2].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-2] ); 
			m_PickGreenDisplay[2] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+1][CanGoPoint.y-2] = 0; 
		} 
		else 
		if( g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-2] > 0 && g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-2] < 17 ) 
		{ 
			m_PickRedObjects[1].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-2] ); 
			m_PickRedDisplay[1] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+1][CanGoPoint.y-2] = g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-2]; 
		} 
 
		// 左上中 
		if( (CanGoPoint.x-2) >= 0 && (CanGoPoint.y-1) >=0 ) 
		if( g_ChessmanMap[CanGoPoint.x-2][CanGoPoint.y-1] == 0 ) 
		{ 
			m_PickGreenObjects[3].Move( g_XCoordinateToPosition[CanGoPoint.x-2], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
			m_PickGreenDisplay[3] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-2][CanGoPoint.y-1] = 0; 
		} 
		else 
		if( g_ChessmanMap[CanGoPoint.x-2][CanGoPoint.y-1] > 0 && g_ChessmanMap[CanGoPoint.x-2][CanGoPoint.y-1] < 17 ) 
		{ 
			m_PickRedObjects[2].Move( g_XCoordinateToPosition[CanGoPoint.x-2], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
			m_PickRedDisplay[2] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-2][CanGoPoint.y-1] = g_ChessmanMap[CanGoPoint.x-2][CanGoPoint.y-1]; 
		} 
 
		// 右上中 
		if( (CanGoPoint.x+2) <= 7 && (CanGoPoint.y-1) >= 0 ) 
		if( g_ChessmanMap[CanGoPoint.x+2][CanGoPoint.y-1] == 0 ) 
		{ 
			m_PickGreenObjects[4].Move( g_XCoordinateToPosition[CanGoPoint.x+2], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
			m_PickGreenDisplay[4] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+2][CanGoPoint.y-1] = 0; 
		} 
		else 
		if( g_ChessmanMap[CanGoPoint.x+2][CanGoPoint.y-1] > 0 && g_ChessmanMap[CanGoPoint.x+2][CanGoPoint.y-1] < 17 ) 
		{ 
			m_PickRedObjects[3].Move( g_XCoordinateToPosition[CanGoPoint.x+2], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
			m_PickRedDisplay[3] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+2][CanGoPoint.y-1] = g_ChessmanMap[CanGoPoint.x+2][CanGoPoint.y-1]; 
		} 
 
		// 左下中 
		if( (CanGoPoint.x-2) >= 0 && (CanGoPoint.y+1) <= 7 ) 
		if( g_ChessmanMap[CanGoPoint.x-2][CanGoPoint.y+1] == 0 ) 
		{ 
			m_PickGreenObjects[5].Move( g_XCoordinateToPosition[CanGoPoint.x-2], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+1] ); 
			m_PickGreenDisplay[5] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-2][CanGoPoint.y+1] = 0; 
		} 
		else 
		if( g_ChessmanMap[CanGoPoint.x-2][CanGoPoint.y+1] > 0 && g_ChessmanMap[CanGoPoint.x-2][CanGoPoint.y+1] < 17 ) 
		{ 
			m_PickRedObjects[4].Move( g_XCoordinateToPosition[CanGoPoint.x-2], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+1] ); 
			m_PickRedDisplay[4] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-2][CanGoPoint.y+1] = g_ChessmanMap[CanGoPoint.x-2][CanGoPoint.y+1]; 
		} 
 
		// 右下中 
		if( (CanGoPoint.x+2) <= 7 && (CanGoPoint.y+1) <= 7 ) 
		if( g_ChessmanMap[CanGoPoint.x+2][CanGoPoint.y+1] == 0 ) 
		{ 
			m_PickGreenObjects[6].Move( g_XCoordinateToPosition[CanGoPoint.x+2], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+1] ); 
			m_PickGreenDisplay[6] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+2][CanGoPoint.y+1] = 0; 
		} 
		else 
		if( g_ChessmanMap[CanGoPoint.x+2][CanGoPoint.y+1] > 0 && g_ChessmanMap[CanGoPoint.x+2][CanGoPoint.y+1] < 17 ) 
		{ 
			m_PickRedObjects[5].Move( g_XCoordinateToPosition[CanGoPoint.x+2], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+1] ); 
			m_PickRedDisplay[5] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+2][CanGoPoint.y+1] = g_ChessmanMap[CanGoPoint.x+2][CanGoPoint.y+1]; 
		} 
 
		// 左下 
		if( (CanGoPoint.x-1) >= 0 && (CanGoPoint.y+2) <= 7 ) 
		if( g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y+2] == 0 ) 
		{ 
			m_PickGreenObjects[7].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+2] ); 
			m_PickGreenDisplay[7] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y+2] = 0; 
		} 
		else 
		if( g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y+2] >0 && g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y+2] < 17 ) 
		{ 
			m_PickRedObjects[6].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+2] ); 
			m_PickRedDisplay[6] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y+2] = g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y+2]; 
		} 
 
		// 右下 
		if( (CanGoPoint.x+1) <= 7 && (CanGoPoint.y+2) <= 7 ) 
		if( g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y+2] == 0 ) 
		{ 
			m_PickGreenObjects[8].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+2] ); 
			m_PickGreenDisplay[8] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+1][CanGoPoint.y+2] = 0; 
		} 
		else 
		if( g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y+2] >0 && g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y+2] < 17 ) 
		{ 
			m_PickRedObjects[7].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+2] ); 
			m_PickRedDisplay[7] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y+2] = g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y+2]; 
		} 
		break; 
 
	case 3: 
		// 左上 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x-i) >= 0 && (CanGoPoint.y-i) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y-i] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y-i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y-i] >0 && g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y-i] < 17 ) 
			{ 
				m_PickRedObjects[0].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickRedDisplay[0] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y-i] = g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y-i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 右上 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x+i) <= 7 && (CanGoPoint.y-i) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y-i] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y-i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y-i] >0 && g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y-i] < 17 ) 
			{ 
				m_PickRedObjects[1].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickRedDisplay[1] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y-i] = g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y-i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 左下 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x-i) >= 0 && (CanGoPoint.y+i) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y+i] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y+i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y+i] >0 && g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y+i] < 17 ) 
			{ 
				m_PickRedObjects[2].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickRedDisplay[2] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y+i] = g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y+i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 右下 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x+i) <= 7 && (CanGoPoint.y+i) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y+i] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y+i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y+i] >0 && g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y+i] < 17 ) 
			{ 
				m_PickRedObjects[3].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickRedDisplay[3] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y+i] = g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y+i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
		break; 
 
	case 4: 
		// 向上 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.y-i) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-i] == 0 ) 
			{ 
				m_PickGreenObjects[i].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickGreenDisplay[i] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y-i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-i] >0 && g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-i] < 17 ) 
			{ 
				// 一条线路只有一个棋子可能被吃 
				m_PickRedObjects[0].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickRedDisplay[0] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y-i] = g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 向下 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.y+i) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+i] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y+i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+i] >0 && g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+i] < 17 ) 
			{ 
				m_PickRedObjects[1].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickRedDisplay[1] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y+i] = g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 向左 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x-i) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y] >0 && g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y] < 17 ) 
			{ 
				m_PickRedObjects[2].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickRedDisplay[2] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y] = g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 向右 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x+i) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y] >0 && g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y] < 17 ) 
			{ 
				m_PickRedObjects[3].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickRedDisplay[3] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y] = g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		//////////////////////////////// 
		// 左上 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x-i) >= 0 && (CanGoPoint.y-i) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y-i] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y-i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y-i] >0 && g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y-i] < 17 ) 
			{ 
				m_PickRedObjects[4].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickRedDisplay[4] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y-i] = g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y-i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 右上 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x+i) <= 7 && (CanGoPoint.y-i) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y-i] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y-i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y-i] >0 && g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y-i] < 17 ) 
			{ 
				m_PickRedObjects[5].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-i] ); 
				m_PickRedDisplay[5] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y-i] = g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y-i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 左下 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x-i) >= 0 && (CanGoPoint.y+i) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y+i] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y+i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y+i] >0 && g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y+i] < 17 ) 
			{ 
				m_PickRedObjects[6].Move( g_XCoordinateToPosition[CanGoPoint.x-i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickRedDisplay[6] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-i][CanGoPoint.y+i] = g_ChessmanMap[CanGoPoint.x-i][CanGoPoint.y+i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
 
		// 右下 
		for( i=1; i<8; i++ ) 
		if( (CanGoPoint.x+i) <= 7 && (CanGoPoint.y+i) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y+i] == 0 ) 
			{ 
				m_PickGreenObjects[i+Flag].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickGreenDisplay[i+Flag] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y+i] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y+i] >0 && g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y+i] < 17 ) 
			{ 
				m_PickRedObjects[7].Move( g_XCoordinateToPosition[CanGoPoint.x+i], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+i] ); 
				m_PickRedDisplay[7] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+i][CanGoPoint.y+i] = g_ChessmanMap[CanGoPoint.x+i][CanGoPoint.y+i]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		else 
		{ 
			Flag--; break; 
		} 
		Flag += i; 
		break; 
 
	case 5: 
		if( (CanGoPoint.y-1) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-1] == 0 ) 
			{ 
				m_PickGreenObjects[1].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
				m_PickGreenDisplay[1] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y-1] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-1] >0 && g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-1] < 17 ) 
			{ 
				// 一条线路只有一个棋子可能被吃 
				m_PickRedObjects[0].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
				m_PickRedDisplay[0] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y-1] = g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-1]; 
			} 
		} 
 
		if( (CanGoPoint.y+1) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+1] == 0 ) 
			{ 
				m_PickGreenObjects[2].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+1] ); 
				m_PickGreenDisplay[2] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y+1] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+1] >0 && g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+1] < 17 ) 
			{ 
				m_PickRedObjects[1].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+1] ); 
				m_PickRedDisplay[1] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y+1] = g_ChessmanMap[CanGoPoint.x][CanGoPoint.y+1]; 
			} 
		} 
 
		if( (CanGoPoint.x-1) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y] == 0 ) 
			{ 
				m_PickGreenObjects[3].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickGreenDisplay[3] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y] >0 && g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y] < 17 ) 
			{ 
				m_PickRedObjects[2].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickRedDisplay[2] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y] = g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y]; 
			} 
		} 
 
		if( (CanGoPoint.x+1) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y] == 0 ) 
			{ 
				m_PickGreenObjects[4].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickGreenDisplay[4] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+1][CanGoPoint.y] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y] >0 && g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y] < 17 ) 
			{ 
				m_PickRedObjects[3].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y] ); 
				m_PickRedDisplay[3] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+1][CanGoPoint.y] = g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y]; 
			} 
		} 
		/////////////////////// 
		if( (CanGoPoint.x-1) >= 0 && (CanGoPoint.y-1) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-1] == 0 ) 
			{ 
				m_PickGreenObjects[5].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
				m_PickGreenDisplay[5] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y-1] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-1] >0 && g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-1] < 17 ) 
			{ 
				m_PickRedObjects[4].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
				m_PickRedDisplay[4] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y-1] = g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-1]; 
			} 
		} 
 
		if( (CanGoPoint.x+1) <= 7 && (CanGoPoint.y-1) >= 0 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-1] == 0 ) 
			{ 
				m_PickGreenObjects[6].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
				m_PickGreenDisplay[6] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+1][CanGoPoint.y-1] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-1] >0 && g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-1] < 17 ) 
			{ 
				m_PickRedObjects[5].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
				m_PickRedDisplay[5] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+1][CanGoPoint.y-1] = g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-1]; 
			} 
		} 
 
		if( (CanGoPoint.x-1) >= 0 && (CanGoPoint.y+1) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y+1] == 0 ) 
			{ 
				m_PickGreenObjects[7].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+1] ); 
				m_PickGreenDisplay[7] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y+1] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y+1] >0 && g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y+1] < 17 ) 
			{ 
				m_PickRedObjects[6].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+1] ); 
				m_PickRedDisplay[6] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y+1] = g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y+1]; 
			} 
		} 
 
		if( (CanGoPoint.x+1) <= 7 && (CanGoPoint.y+1) <= 7 ) 
		{ 
			if( g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y+1] == 0 ) 
			{ 
				m_PickGreenObjects[8].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+1] ); 
				m_PickGreenDisplay[8] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+1][CanGoPoint.y+1] = 0; 
			} 
			else 
			if( g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y+1] >0 && g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y+1] < 17 ) 
			{ 
				m_PickRedObjects[7].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y+1] ); 
				m_PickRedDisplay[7] = TRUE; 
				g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+1][CanGoPoint.y+1] = g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y+1]; 
				Flag--; break; 
			} 
			else 
			{ 
				Flag--; break; 
			} 
		} 
		break; 
	case 6: 
		// 检查吃子区域 
		if( (CanGoPoint.x-1) >= 0 && (CanGoPoint.y-1) >= 0 && g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-1] >0 && g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-1] <17 ) 
		{ 
			m_PickRedObjects[0].Move( g_XCoordinateToPosition[CanGoPoint.x-1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
			m_PickRedDisplay[0] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x-1][CanGoPoint.y-1] = g_ChessmanMap[CanGoPoint.x-1][CanGoPoint.y-1]; 
		} 
		if( (CanGoPoint.x+1) <= 7 && (CanGoPoint.y-1) >= 0 && g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-1] >0 && g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-1] <17 ) 
		{ 
			m_PickRedObjects[1].Move( g_XCoordinateToPosition[CanGoPoint.x+1], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
			m_PickRedDisplay[1] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x+1][CanGoPoint.y-1] = g_ChessmanMap[CanGoPoint.x+1][CanGoPoint.y-1]; 
		} 
		if( (CanGoPoint.y-1) >= 0 && g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-1] == 0 ) 
		{ 
			m_PickGreenObjects[1].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-1] ); 
			m_PickGreenDisplay[1] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y-1] = 0; 
		} 
		else 
			break; 
		if( !m_IsFirstMove[m_Pick] && (CanGoPoint.y-2) >= 0 && g_ChessmanMap[CanGoPoint.x][CanGoPoint.y-2] == 0 ) 
		{ 
			m_PickGreenObjects[2].Move( g_XCoordinateToPosition[CanGoPoint.x], 0.0f, g_ZCoordinateToPosition[CanGoPoint.y-2] ); 
			m_PickGreenDisplay[2] = TRUE; 
			g_sChessmanCanGoMap[m_Pick].ChessmanCanGoMap[CanGoPoint.x][CanGoPoint.y-2] = 0; 
		} 
		break; 
	} 
 
	return TRUE; 
} 
 
 
BOOL cChess::PlaySound(long Num) 
{ 
	if(Num >=0 && Num < NUM_SOUNDS) { 
		m_SoundData.Free(); 
 
		if(m_SoundData.LoadWAV(g_SoundFilenames[Num]) == TRUE) 
		m_SoundChannel.Play(&m_SoundData); 
 
		return TRUE; 
	} 
 
	return FALSE; 
} 
 
BOOL cChess::PlayMusic(long Num) 
{ 
	if(g_CurrentMusic == Num) 
		return TRUE; 
 
	m_MusicChannel.Stop(); 
	m_MusicChannel.Free(); 
 
	DWORD Timer = timeGetTime() + 700; 
	while(timeGetTime() < Timer) { 
		DWORD Level = (Timer - timeGetTime()) / 10; 
		m_MusicChannel.SetVolume(Level); 
	} 
 
	m_MusicChannel.Load(g_MusicFilenames[Num]); 
	m_MusicChannel.Play(70,0); 
 
	g_CurrentMusic = Num; 
 
	return TRUE; 
} 
 
BOOL cChess::StopMusic() 
{ 
	m_MusicChannel.Stop(); 
	m_MusicChannel.Free(); 
	g_CurrentMusic = -1; 
 
	return TRUE; 
} 
 
BOOL cChess::GetMouseHitMesh( long Num, DWORD *Face ) 
{ 
	if(g_IsDisplay[Num] == 0 && Num != 0 ) 
		return FALSE; 
 
	D3DXVECTOR3 vecRay, vecDir; 
	D3DXVECTOR3 vecMeshRay, vecMeshDir; 
	D3DXVECTOR3 vecTemp; 
	D3DXMATRIX  matInv; 
	D3DXMATRIX	matProj, matView, *matWorld; 
	D3DXMATRIX  matTemp; 
	sMesh		*MeshPtr; 
 
	BOOL Hit; 
	float u, v, Dist; 
	 
	m_Graphics.Get3DDevice()->GetTransform( D3DTS_PROJECTION, &matProj ); 
	m_Graphics.Get3DDevice()->GetTransform( D3DTS_VIEW, &matView ); 
 
	D3DXMatrixInverse( &matInv, NULL, &matView ); 
	 
	m_Mouse.Read(); 
 
	vecTemp.x = (((2.0f*m_Mouse.GetXPos()) / m_Graphics.GetWidth()) - 1) / matProj._11; 
	vecTemp.y = -(((2.0f*m_Mouse.GetYPos()) / m_Graphics.GetHeight()) - 1) / matProj._22; 
	vecTemp.z = 1.0f; 
 
	vecRay.x = matInv._41; 
	vecRay.y = matInv._42; 
	vecRay.z = matInv._43; 
	vecDir.x = vecTemp.x * matInv._11 + vecTemp.y * matInv._21 + vecTemp.z * matInv._31; 
	vecDir.y = vecTemp.x * matInv._12 + vecTemp.y * matInv._22 + vecTemp.z * matInv._32; 
	vecDir.z = vecTemp.x * matInv._13 + vecTemp.y * matInv._23 + vecTemp.z * matInv._33; 
 
	MeshPtr = m_ChessObjects[Num].GetMesh()->GetParentMesh(); 
	while(MeshPtr != NULL ) 
	{ 
		matWorld = m_ChessObjects[Num].GetMatrix(); 
		D3DXMatrixInverse( &matInv, NULL, matWorld ); 
		D3DXVec3TransformCoord( &vecMeshRay, &vecRay, &matInv ); 
		D3DXVec3TransformNormal( &vecMeshDir, &vecDir, &matInv ); 
 
		D3DXIntersect( MeshPtr->m_pMesh, &vecMeshRay, &vecMeshDir, &Hit, Face, &u, &v, &Dist, NULL, NULL ); 
 
		if( Hit ) 
			return TRUE; 
 
		MeshPtr = MeshPtr->m_pNext; 
	} 
 
	return FALSE; 
} 
 
FLOAT Timer() 
{ 
    static BOOL     m_bTimerInitialized = FALSE; 
    static BOOL     m_bUsingQPF         = FALSE; 
    static LONGLONG m_llQPFTicksPerSec  = 0; 
 
    if( FALSE == m_bTimerInitialized ) 
    { 
        m_bTimerInitialized = TRUE; 
 
        LARGE_INTEGER qwTicksPerSec; 
        m_bUsingQPF = QueryPerformanceFrequency( &qwTicksPerSec ); 
        if( m_bUsingQPF ) 
            m_llQPFTicksPerSec = qwTicksPerSec.QuadPart; 
    } 
 
    if( m_bUsingQPF ) 
    { 
        double fTime; 
        LARGE_INTEGER qwTime; 
 
        QueryPerformanceCounter( &qwTime ); 
        fTime = qwTime.QuadPart / (double) m_llQPFTicksPerSec; 
        return (FLOAT) fTime; 
    } 
    else 
    { 
		double fTime; 
		fTime = timeGetTime() * 0.001; 
        return (FLOAT) fTime; 
    } 
} 
 
void cChess::OriginalPosition() 
{ 
	for( long i=0; i<30; i++ ) 
		m_PickGreenObjects[i].Create( &m_Graphics, &m_PickMeshes[0] ); 
	for( long j=0; j<8; j++ ) 
		m_PickRedObjects[j].Create( &m_Graphics, &m_PickMeshes[1] ); 
	m_ChessObjects[0].Create(&m_Graphics, &m_ChessMeshes[0]); 
	m_ChessObjects[1].Create( &m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[2].Create( &m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[3].Create( &m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[4].Create( &m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[5].Create( &m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[6].Create( &m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[7].Create( &m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[8].Create( &m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[9].Create( &m_Graphics, &m_ChessMeshes[1]); 
	m_ChessObjects[10].Create(&m_Graphics, &m_ChessMeshes[2]); 
	m_ChessObjects[11].Create(&m_Graphics, &m_ChessMeshes[3]); 
	m_ChessObjects[12].Create(&m_Graphics, &m_ChessMeshes[4]); 
	m_ChessObjects[13].Create(&m_Graphics, &m_ChessMeshes[5]); 
	m_ChessObjects[14].Create(&m_Graphics, &m_ChessMeshes[3]); 
	m_ChessObjects[15].Create(&m_Graphics, &m_ChessMeshes[2]); 
	m_ChessObjects[16].Create(&m_Graphics, &m_ChessMeshes[1]); 
 
	m_ChessObjects[17].Create(&m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[18].Create(&m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[19].Create(&m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[20].Create(&m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[21].Create(&m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[22].Create(&m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[23].Create(&m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[24].Create(&m_Graphics, &m_ChessMeshes[6]); 
	m_ChessObjects[25].Create(&m_Graphics, &m_ChessMeshes[1]); 
	m_ChessObjects[26].Create(&m_Graphics, &m_ChessMeshes[2]); 
	m_ChessObjects[27].Create(&m_Graphics, &m_ChessMeshes[3]); 
	m_ChessObjects[28].Create(&m_Graphics, &m_ChessMeshes[4]); 
	m_ChessObjects[29].Create(&m_Graphics, &m_ChessMeshes[5]); 
	m_ChessObjects[30].Create(&m_Graphics, &m_ChessMeshes[3]); 
	m_ChessObjects[31].Create(&m_Graphics, &m_ChessMeshes[2]); 
	m_ChessObjects[32].Create(&m_Graphics, &m_ChessMeshes[1]); 
 
	m_ChessObjects[1].Move( -0.875f, 0.0f, 0.625f ); 
	m_ChessObjects[2].Move( -0.625f, 0.0f, 0.625f ); 
	m_ChessObjects[3].Move( -0.375f, 0.0f, 0.625f ); 
	m_ChessObjects[4].Move( -0.125f, 0.0f, 0.625f ); 
	m_ChessObjects[5].Move( 0.125f, 0.0f, 0.625f ); 
	m_ChessObjects[6].Move( 0.375f, 0.0f, 0.625f ); 
	m_ChessObjects[7].Move( 0.625f, 0.0f, 0.625f ); 
	m_ChessObjects[8].Move( 0.875f, 0.0f, 0.625f ); 
	m_ChessObjects[9].Move( -0.875f, 0.0f, 0.875f ); 
	m_ChessObjects[10].Move( -0.625f, 0.0f, 0.875f ); 
	m_ChessObjects[11].Move( -0.375f, 0.0f, 0.875f ); 
	m_ChessObjects[12].Move( -0.125f, 0.0f, 0.875f ); 
	m_ChessObjects[13].Move( 0.125f, 0.0f, 0.875f ); 
	m_ChessObjects[16].Move( 0.875f, 0.0f, 0.875f ); 
	m_ChessObjects[15].Move( 0.625f, 0.0f, 0.875f ); 
	m_ChessObjects[14].Move( 0.375f, 0.0f, 0.875f ); 
 
	m_ChessObjects[17].Move( -0.875f, 0.0f, -0.625f ); 
	m_ChessObjects[18].Move( -0.625f, 0.0f, -0.625f ); 
	m_ChessObjects[19].Move( -0.375f, 0.0f, -0.625f ); 
	m_ChessObjects[20].Move( -0.125f, 0.0f, -0.625f ); 
	m_ChessObjects[21].Move( 0.125f, 0.0f, -0.625f ); 
	m_ChessObjects[22].Move( 0.375f, 0.0f, -0.625f ); 
	m_ChessObjects[23].Move( 0.625f, 0.0f, -0.625f ); 
	m_ChessObjects[24].Move( 0.875f, 0.0f, -0.625f ); 
	m_ChessObjects[25].Move( -0.875f, 0.0f, -0.875f ); 
	m_ChessObjects[26].Move( -0.625f, 0.0f, -0.875f ); 
	m_ChessObjects[27].Move( -0.375f, 0.0f, -0.875f ); 
	m_ChessObjects[28].Move( -0.125f, 0.0f, -0.875f ); 
	m_ChessObjects[29].Move( 0.125f, 0.0f, -0.875f ); 
	m_ChessObjects[32].Move( 0.875f, 0.0f, -0.875f ); 
	m_ChessObjects[31].Move( 0.625f, 0.0f, -0.875f ); 
	m_ChessObjects[30].Move( 0.375f, 0.0f, -0.875f ); 
 
	m_ChessObjects[13].Rotate( 0.0f, 1.57f, 0.0f ); 
	m_ChessObjects[26].Rotate( 0.0f, 3.14f, 0.0f ); 
	m_ChessObjects[29].Rotate( 0.0f, 1.57f, 0.0f ); 
	m_ChessObjects[31].Rotate( 0.0f, 3.14f, 0.0f ); 
}