⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 productmove.cpp

📁 有全屏显示的一个很优秀的中国象棋软件.用VC6.0开发
💻 CPP
字号:
// ProductMove.cpp: implementation of the ProductMove class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "chess.h"
#include "ProductMove.h"
#include "chessDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CChessDlg* wnd;
ProductMove::ProductMove(CDialog *p)
{
	pWnd=p;
	wnd=(CChessDlg*)p;

}
BOOL ProductMove::CanMove(CPoint&from,CPoint&to,BYTE p[][9])
{
     CPoint move[100];
	 int n;
	 Extend(from,move,n,p);
     for (int x=0;x<n;x++)
		 if (move[x]==to) return TRUE;
	 return FALSE;
}
BOOL IsSame(int x,int y)
{
	if (x==0||y==0) return FALSE;
	if (x/8==y/8) return TRUE;
	return FALSE;
}
BOOL SameSide(int x,int y)
{
	if (x<0||x>9||y<0||y>9) return FALSE;
	if (x/5==y/5) return TRUE;
	return FALSE;
}
BOOL InMyArea(int x,int y)
{
	if (x<=0) return FALSE;
	if (x/8==y/5) return TRUE;
    return FALSE;
}
BYTE Up(int x,int y)
{
	if (y/8==0) return x+1;
	if (y/8==1) return x-1;
	return 0;
}

void ProductMove::Extend (CPoint node,CPoint point[],int & n,BYTE p[][9])
{
	int x,y,z; 
	n=0;
     switch((p[node.x][node.y]-1)%7+1)
	 {
	 case 0:return;
	 case 1:
		 {
			 x=node.x;
			 while(x++<9) if (!p[x][node.y]) point[n++]=CPoint(x,node.y);
			              else { if (!IsSame(p[x][node.y],p[node.x][node.y])) point[n++]=CPoint(x,node.y); x=11;}
			 x=node.x;
			 while (x-->0) if (!p[x][node.y]) point[n++]=CPoint(x,node.y);
			               else { if (!IsSame(p[x][node.y],p[node.x][node.y])) point[n++]=CPoint(x,node.y);x=0;}

			 y=node.y;
			 while(y++<8) if (!p[node.x][y]) point[n++]=CPoint(node.x,y);
			              else { if (!IsSame(p[node.x][y],p[node.x][node.y])) point[n++]=CPoint(node.x,y); y=11;}
			 y=node.y;
			 while (y-->0) if (!p[node.x][y]) point[n++]=CPoint(node.x,y);
			               else { if (!IsSame(p[node.x][y],p[node.x][node.y])) point[n++]=CPoint(node.x,y);y=0;}
		 }
		 break;
	 case 2:
		 {
			 if (node.x-2>=0&&node.y-1>=0&&!IsSame(p[node.x][node.y],p[node.x-2][node.y-1])&&!p[node.x-1][node.y]) point[n++]=CPoint(node.x-2,node.y-1);
             if (node.x-2>=0&&node.y+1<=8&&!IsSame(p[node.x][node.y],p[node.x-2][node.y+1])&&!p[node.x-1][node.y]) point[n++]=CPoint(node.x-2,node.y+1);
             if (node.x+2<=9&&node.y-1>=0&&!IsSame(p[node.x][node.y],p[node.x+2][node.y-1])&&!p[node.x+1][node.y]) point[n++]=CPoint(node.x+2,node.y-1);
			 if (node.x+2<=9&&node.y+1<=8&&!IsSame(p[node.x][node.y],p[node.x+2][node.y+1])&&!p[node.x+1][node.y]) point[n++]=CPoint(node.x+2,node.y+1);
			 if (node.x-1>=0&&node.y-2>=0&&!IsSame(p[node.x][node.y],p[node.x-1][node.y-2])&&!p[node.x][node.y-1]) point[n++]=CPoint(node.x-1,node.y-2);
             if (node.x-1>=0&&node.y+2<=8&&!IsSame(p[node.x][node.y],p[node.x-1][node.y+2])&&!p[node.x][node.y+1]) point[n++]=CPoint(node.x-1,node.y+2);
             if (node.x+1<=9&&node.y-2>=0&&!IsSame(p[node.x][node.y],p[node.x+1][node.y-2])&&!p[node.x][node.y-1]) point[n++]=CPoint(node.x+1,node.y-2);
			 if (node.x+1<=9&&node.y+2<=8&&!IsSame(p[node.x][node.y],p[node.x+1][node.y+2])&&!p[node.x][node.y+1]) point[n++]=CPoint(node.x+1,node.y+2);
		 }
		 break;
	 case 3:
		 {
			 if (SameSide(node.x,node.x+2))
			 {
			   if (node.x+2<=9&&node.y+2<=8&&!IsSame(p[node.x][node.y],p[node.x+2][node.y+2])&&!p[node.x+1][node.y+1]) point[n++]=CPoint(node.x+2,node.y+2);
			   if (node.x+2<=9&&node.y-2>=0&&!IsSame(p[node.x][node.y],p[node.x+2][node.y-2])&&!p[node.x+1][node.y-1]) point[n++]=CPoint(node.x+2,node.y-2);
			 }
			 if (SameSide(node.x,node.x-2))
			 {
			   if (node.x-2>=0&&node.y+2<=8&&!IsSame(p[node.x][node.y],p[node.x-2][node.y+2])&&!p[node.x-1][node.y+1]) point[n++]=CPoint(node.x-2,node.y+2);
			   if (node.x-2>=0&&node.y-2>=0&&!IsSame(p[node.x][node.y],p[node.x-2][node.y-2])&&!p[node.x-1][node.y-1]) point[n++]=CPoint(node.x-2,node.y-2);
			 }
		 }
		 break;
	 case 4:
		 {
			 if (node.x<=3)
			 {
                if (node.y==3)
					if (node.x==0&&!IsSame(p[0][3],p[1][4])||node.x==2&&!IsSame(p[2][3],p[1][4])) point[n++]=CPoint(1,4);
				if (node.y==4)
				{
					if  (!IsSame(p[0][3],p[1][4])) point[n++]=CPoint(0,3);
			        if (!IsSame(p[0][5],p[1][4])) point[n++]=CPoint(0,5);
					if (!IsSame(p[2][3],p[1][4])) point[n++]=CPoint(2,3);
					if (!IsSame(p[2][5],p[1][4])) point[n++]=CPoint(2,5);
				}
				if (node.y==5)
					if (node.x==0&&!IsSame(p[0][5],p[1][4])||node.x==2&&!IsSame(p[2][5],p[1][4])) point[n++]=CPoint(1,4);
			 }
			 else if (node.x>=7)
              {
                if (node.y==3)
					if (node.x==9&&!IsSame(p[9][3],p[8][4])||node.x==7&&!IsSame(p[7][3],p[8][4])) point[n++]=CPoint(8,4);
				if (node.y==4)
				{
					if  (!IsSame(p[9][3],p[8][4])) point[n++]=CPoint(9,3);
			        if (!IsSame(p[9][5],p[8][4])) point[n++]=CPoint(9,5);
					if (!IsSame(p[7][3],p[8][4])) point[n++]=CPoint(7,3);
					if (!IsSame(p[7][5],p[8][4])) point[n++]=CPoint(7,5);
				}
				if (node.y==5)
					if (node.x==9&&!IsSame(p[9][5],p[8][4])||node.x==7&&!IsSame(p[7][5],p[8][4])) point[n++]=CPoint(8,4);
			 }
		 }
		 break;
	 case 5:
		 {
			 if (node.x<=2)
			 {
				 if (node.x-1>=0&&!IsSame(p[node.x][node.y],p[node.x-1][node.y])) point[n++]=CPoint(node.x-1,node.y);
				 if (node.x+1<=2&&!IsSame(p[node.x][node.y],p[node.x+1][node.y])) point[n++]=CPoint(node.x+1,node.y);
				 if (node.y-1>=3&&!IsSame(p[node.x][node.y],p[node.x][node.y-1])) point[n++]=CPoint(node.x,node.y-1);
				 if (node.y+1<=5&&!IsSame(p[node.x][node.y],p[node.x][node.y+1])) point[n++]=CPoint(node.x,node.y+1);
				 z=node.x;
				 while (z++<9) if (p[z][node.y]) break;
				 if (z<=9&&p[z][node.y]==12) point[n++]=CPoint(z,node.y);
			 }
			 else if (node.x>=7)
			 {
				 if (node.x-1>=7&&!IsSame(p[node.x][node.y],p[node.x-1][node.y])) point[n++]=CPoint(node.x-1,node.y);
				 if (node.x+1<=9&&!IsSame(p[node.x][node.y],p[node.x+1][node.y])) point[n++]=CPoint(node.x+1,node.y);
				 if (node.y-1>=3&&!IsSame(p[node.x][node.y],p[node.x][node.y-1])) point[n++]=CPoint(node.x,node.y-1);
				 if (node.y+1<=5&&!IsSame(p[node.x][node.y],p[node.x][node.y+1])) point[n++]=CPoint(node.x,node.y+1);
				 z=node.x;
				 while (z-->0) if (p[z][node.y]) break;
				 if (z>=0&&p[z][node.y]==5) point[n++]=CPoint(z,node.y);
			 }
		 }
		 break;
	 case 6:
		 {
			 z=x=node.x;
			 while(x++<9) if (!p[x][node.y]) point[n++]=CPoint(x,node.y);
			 else {z=x;x=11;}
			 while (z++<9) if (p[z][node.y]) {if (!IsSame(p[z][node.y],p[node.x][node.y])) point[n++]=CPoint(z,node.y);z=11;}
             z=x=node.x;
			 while(x-->0) if (!p[x][node.y]) point[n++]=CPoint(x,node.y);
			 else {z=x;x=0;}
			 while (z-->0) if (p[z][node.y]) {if (!IsSame(p[z][node.y],p[node.x][node.y])) point[n++]=CPoint(z,node.y);z=0;}
			 z=y=node.y;
			 while(y++<8) if (!p[node.x][y]) point[n++]=CPoint(node.x,y);
			 else {z=y;y=11;}
			 while (z++<8) if (p[node.x][z]) {if (!IsSame(p[node.x][z],p[node.x][node.y])) point[n++]=CPoint(node.x,z);z=11;}
			 z=y=node.y;
			 while(y-->0) if (!p[node.x][y]) point[n++]=CPoint(node.x,y);
			 else {z=y;y=0;}
			 while (z-->0) if (p[node.x][z]) {if (!IsSame(p[node.x][z],p[node.x][node.y])) point[n++]=CPoint(node.x,z);z=0;}
		 }
		 break;
	 case 7:
		 {
			 BYTE up=Up(node.x,p[node.x][node.y]);
			 if (up>=0&&up<=9&&!IsSame(p[node.x][node.y],p[up][node.y])) point[n++]=CPoint(up,node.y);
             if (!InMyArea(p[node.x][node.y],node.x))
			 {
				 if (node.y-1>=0&&!IsSame(p[node.x][node.y],p[node.x][node.y-1])) point[n++]=CPoint(node.x,node.y-1);
				 if (node.y+1<=8&&!IsSame(p[node.x][node.y],p[node.x][node.y+1])) point[n++]=CPoint(node.x,node.y+1);
			 }
		 }
		break;	  
		 


	 }
}

ProductMove::~ProductMove()
{

}

void ProductMove::Product(CHESSMOVE move[],MOVE mm[],int & n,BYTE p[][9],int nFlag,int depthend)
{
	int x,y,nn=0;
	int Flag=nFlag;
	if ((MaxDepth-depthend)%2==0) if (nFlag) Flag=0;else Flag=1; 
	CPoint point[100];
	n=0;
	for (x=0;x<=9;x++)
		for (y=0;y<=8;y++)
		{
			if (p[x][y]&&p[x][y]/8==Flag)
			{
				Extend(CPoint(x,y),point,nn,p);
				for (int z=0;z<nn;z++)
				{
					
					move[n].from =CPoint(x,y);
					move[n].to =point[z];
					mm[n].from=x*9+y;
					mm[n].to =point[z].x*9+point[z].y;
					n++;
				}
			}
		}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -