📄 productmove.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 + -