📄 setchess.cpp
字号:
// SetChess.cpp: implementation of the SetChess class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "chess.h"
#include "data.h"
#include "SetChess.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//#include "data.h"
SetChess::SetChess()
{
site[0].x=10+140;site[0].y=10;
site[0].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_BKING);
site[1].x=10+105;site[1].y=10;
site[1].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_BSHOP);
site[2].x=10+175;site[2].y=10;
site[2].hIcon=site[1].hIcon;
site[3].x=10+70;site[3].y=10;
site[3].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_BELEPHANT);
site[4].x=10+210;site[4].y=10;
site[4].hIcon=site[3].hIcon;
site[5].x=10+35;site[5].y=10;
site[5].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_BHORSE);
site[6].x=10+245;site[6].y=10;
site[6].hIcon=site[5].hIcon;
site[7].x=10;site[7].y=10;
site[7].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_BCAR);
site[8].x=10+280;site[8].y=10;
site[8].hIcon=site[7].hIcon;
site[9].x=10+35;site[9].y=10+70;
site[9].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_BCANON);
site[10].x=10+245;site[10].y=10+70;
site[10].hIcon=site[9].hIcon;
site[11].x=10;site[11].y=10+105;
site[11].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_BPAWN);
site[12].x=10+70;site[12].y=10+105;
site[12].hIcon=site[11].hIcon;
site[13].x=10+140;site[13].y=10+105;
site[13].hIcon=site[11].hIcon;
site[14].x=10+210;site[14].y=10+105;
site[14].hIcon=site[11].hIcon;
site[15].x=10+280;site[15].y=10+105;
site[15].hIcon=site[11].hIcon;
///////////
site[16].x=10+140;site[16].y=10+315;
site[16].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_RKING);
site[17].x=10+105;site[17].y=10+315;
site[17].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_RSHOP);
site[18].x=10+175;site[18].y=10+315;
site[18].hIcon=site[17].hIcon;
site[19].x=10+70;site[19].y=10+315;
site[19].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_RELEPHANT);
site[20].x=10+210;site[20].y=10+315;
site[20].hIcon=site[19].hIcon;
site[21].x=10+35;site[21].y=10+315;
site[21].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_RHORSE);
site[22].x=10+245;site[22].y=10+315;
site[22].hIcon=site[21].hIcon;
site[23].x=10;site[23].y=10+315;
site[23].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_RCAR);
site[24].x=10+280;site[24].y=10+315;
site[24].hIcon=site[23].hIcon;
site[25].x=10+35;site[25].y=10+245;
site[25].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_RCANON);
site[26].x=10+245;site[26].y=10+245;
site[26].hIcon=site[25].hIcon;
site[27].x=10;site[27].y=10+210;
site[27].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_RPAWN);
site[28].x=10+70;site[28].y=10+210;
site[28].hIcon=site[27].hIcon;
site[29].x=10+140;site[29].y=10+210;
site[29].hIcon=site[27].hIcon;
site[30].x=10+210;site[30].y=10+210;
site[30].hIcon=site[27].hIcon;
site[31].x=10+280;site[31].y=10+210;
site[31].hIcon=site[27].hIcon;
/////////
site[32].x=10;site[32].y=10;
site[32].hIcon=AfxGetApp()->LoadIcon(IDI_ICON_BEGIN);
///////
for(int i=0;i<10;i++)
for(int j=0;j<9;j++)
board.ChessBoard[i][j]=ChessB[i][j];
for(int i1=0;i1<33;i1++)
site[i1].flag=true;
///////
}
SetChess::~SetChess()
{
}
void SetChess::DrawChess(CDC *pDC)
{
/*HICON hIcon[14];
hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON_BKING);
hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON_BSHOP);
hIcon[2]=AfxGetApp()->LoadIcon(IDI_ICON_BELEPHANT);
hIcon[3]=AfxGetApp()->LoadIcon(IDI_ICON_BHORSE);
hIcon[4]=AfxGetApp()->LoadIcon(IDI_ICON_BCAR);
pDC->DrawIcon(site[0].x,site[0].y,hIcon[0]);
pDC->DrawIcon(site[1].x,site[1].y,hIcon[1]);
pDC->DrawIcon(site[2].x,site[2].y,hIcon[1]);
pDC->DrawIcon(site[3].x,site[3].y,hIcon[2]);
pDC->DrawIcon(site[4].x,site[4].y,hIcon[2]);
pDC->DrawIcon(site[5].x,site[5].y,hIcon[3]);
pDC->DrawIcon(site[6].x,site[6].y,hIcon[3]);*/
for(int i=0;i<32;i++)
{
if (site[i].flag)
pDC->DrawIcon(site[i].x,site[i].y,site[i].hIcon);
}
}
int SetChess::FindChess(CPoint point,CDC *pDC)
{
for(int i=0;i<32;i++)
{
if(point.x>site[i].x+5&&point.x<site[i].x+30&&point.y>site[i].y+5&&point.y<site[i].y+30&&site[i].flag)
{
site[32].x=site[i].x;site[32].y=site[i].y;
if (pDC)
{
pDC->DrawIcon(site[32].x,site[32].y,site[32].hIcon);
pDC->DrawIcon(site[i].x,site[i].y,site[i].hIcon);
}
return i;
}
}
return -1;
}
CPoint SetChess::move(CPoint point)
{
CPoint s;
s.x=0;s.y=0;
for(int i=0;i<9;i++)
for(int j=0;j<10;j++)
if(point.x>i*35+15&&point.x<i*35+40&&point.y>j*35+15&&point.y<j*35+40)
{
s.x=i*35+10;s.y=j*35+10;
return s;
}
return s;
}
//flag 为false表示移动,true表示判断
bool SetChess::CanMove(CPoint point,int ChessID,bool flag)
{
CPoint s;
s=move(point);
int x,y,i,j;
x=(s.x-10)/35;y=(s.y-10)/35;
int nMoveChessID,nTargeID,ID,nFromY,nToY,nFromX,nToX;
nMoveChessID=ChangeSiteToName(ChessID);
nToX=x;nToY=y;
nFromX=(site[ChessID].x-10)/35;nFromY=(site[ChessID].y-10)/35;
ID=FindChess(point,NULL);
//if(ID>-1)
nTargeID=ChangeSiteToName(ID);
if(s.x>0&&s.y>0)
{
if((nTargeID>7&&nMoveChessID>7||nTargeID<8&&nMoveChessID<8)&&nTargeID!=NOCHESS)
return false;
switch(nMoveChessID)
{
case B_KING:
if(nTargeID==R_KING)
{
if(nFromX!=nToX)
return false;
//MessageBox(NULL,"到达!","检测",1);
for(i=nFromY+1;i<nToY;i++)
{
if(board.ChessBoard[i][nFromX]!=NOCHESS)
return false;
}
}else
{
if(nToY>2||nToX>5||nToX<3)
return false;
if(abs(nFromY-nToY)+abs(nFromX-nToX)>1)
return false;
}
break;
case R_KING:
if(nTargeID==B_KING)
{
if(nFromX!=nToX)
return false;
//MessageBox(NULL,"到达!","检测",1);
for(i=nFromY-1;i>nToY;i--)
{
if(board.ChessBoard[i][nFromX]!=NOCHESS)
return false;
}
}else
{
if(nToY<7||nToX>5||nToX<3)
return false;
if(abs(nFromY-nToY)+abs(nFromX-nToX)>1)
return false;
}
break;
case R_BISHOP:
if(nToY<7||nToX>5||nToX<3)
return false;
if(abs(nFromY-nToY)!=1||abs(nFromX-nToX)!=1)
return false;
break;
case B_BISHOP:
if(nToY>2||nToX>5||nToX<3)
return false;
if(abs(nFromY-nToY)!=1||abs(nFromX-nToX)!=1)
return false;
break;
case R_ELEPHANT://红相
if(nToY<5)
return false;//相不能过河
if(abs(nFromY-nToY)!=2||abs(nFromX-nToX)!=2)
return false;//相走田字
if(board.ChessBoard[(nFromY+nToY)/2][(nFromX+nToX)/2]!=NOCHESS)
return false;//田中间有棋
break;
case B_ELEPHANT://红相
if(nToY>4)
return false;//相不能过河
if(abs(nFromY-nToY)!=2||abs(nFromX-nToX)!=2)
return false;//相走田字
if(board.ChessBoard[(nFromY+nToY)/2][(nFromX+nToX)/2]!=NOCHESS)
return false;//田中间有棋
break;
case B_PAWN://黑兵
if(nToY<nFromY)
return false;//兵不回头
if(nFromY<5&&nFromY==nToY)
return false;//兵过河前只能往前走
if(abs(nFromY-nToY)+abs(nFromX-nToX)>1)
return false;//兵只走一步棋
break;
case R_PAWN://红兵
if(nToY>nFromY)
return false;//兵不回头
if(nFromY>4&&nFromY==nToY)
return false;//兵过河前只能往前走
if(abs(nFromY-nToY)+abs(nFromX-nToX)>1)
return false;//兵只走一步棋
break;
case B_CAR://车
case R_CAR:
if(nToY!=nFromY&&nFromX!=nToX)
return false;
if(nFromY==nToY)
{
if(nFromX<nToX)
{
for(i=nFromX+1;i<nToX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
return false;
}
else
{
for(i=nToX+1;i<nFromX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
return false;
}
}
else
{
if(nFromY<nToY)
{
for(j=nFromY+1;j<nToY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
return false;
}
else
{
for(j=nToY+1;j<nFromY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
return false;
}
}
break;
case B_HORSE:
case R_HORSE:
if(!((abs(nFromX-nToX)==1&&abs(nFromY-nToY)==2)||
(abs(nFromX-nToX)==2&&abs(nFromY-nToY)==1)))
return false;
//MessageBox(NULL,"到达!","检测",1);
if(nToX-nFromX==2)
{
i=nFromX+1;
j=nFromY;
}
else if(nFromX-nToX==2)
{
i=nFromX-1;
j=nFromY;
}
else if(nToY-nFromY==2)
{
i=nFromX;
j=nFromY+1;
}
else if(nFromY-nToY==2)
{
i=nFromX;
j=nFromY-1;
}
if(board.ChessBoard[j][i]!=NOCHESS)
return false;//绊马腿
break;
case B_CANON:
case R_CANON:
if(nFromX!=nToX&&nFromY!=nToY)
return false;//炮走直线
//炮不吃子时,中间不能有棋
if(board.ChessBoard[nToY][nToX]==NOCHESS)
{
//MessageBox(NULL,"到达!","检测",1);
if(nFromY==nToY)
{
if(nFromX<nToX)
{
for(i=nFromX+1;i<nToX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
return false;
}
else
{
for(i=nToX+1;i<nFromX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
return false;
}
}
else
{
if(nFromY<nToY)
{
for(j=nFromY+1;j<nToY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
return false;
}
else
{
for(j=nToY+1;j<nFromY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
return false;
}
}
}
else//炮吃子时
{
int count=0;
if(nFromY==nToY)
{
if(nFromX<nToX)
{
for(i=nFromX+1;i<nToX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
count++;
if(count!=1)
return false;
}
else
{
for(i=nToX+1;i<nFromX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
count++;
if(count!=1)
return false;
}
}
else
{
if(nFromY<nToY)
{
for(j=nFromY+1;j<nToY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
count++;
if(count!=1)
return false;
}
else
{
for(j=nToY+1;j<nFromY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
count++;
if(count!=1)
return false;
}
}
}
}
if(!flag)
{
site[ChessID].x=s.x;site[ChessID].y=s.y;
board.ChessBoard[nFromY][nFromX]=0;
board.ChessBoard[nToY][nToX]=nMoveChessID;
if(nTargeID!=NOCHESS)
{ OutID=ID;
site[ID].flag=false;
}
else
OutID=-1;
}
return true;
}
return false;
}
int SetChess::ChangeSiteToName(int ChessID)
{
int id=NOCHESS;
switch(ChessID)
{
case 0:id=B_KING;break;
case 1:
case 2:id=B_BISHOP;break;
case 3:
case 4:id=B_ELEPHANT;break;
case 5:
case 6:id=B_HORSE;break;
case 7:
case 8:id=B_CAR;break;
case 9:
case 10:id=B_CANON;break;
case 11:
case 12:
case 13:
case 14:
case 15:id=B_PAWN;break;
case 16:id=R_KING;break;
case 17:
case 18:id=R_BISHOP;break;
case 19:
case 20:id=R_ELEPHANT;break;
case 21:
case 22:id=R_HORSE;break;
case 23:
case 24:id=R_CAR;break;
case 25:
case 26:id=R_CANON;break;
case 27:
case 28:
case 29:
case 30:
case 31:id=R_PAWN;break;
default:break;
}
return id;
}
void SetChess::DrawBoard(int board[10][9],CDC *pDC)
{
CString s;
for(int i=0;i<10;i++)
for(int j=0;j<9;j++)
{
s.Format("%d ",board[i][j]);
pDC->TextOut(330+j*23,10+i*23,s);
}
}
int SetChess::AddMove(int nFromX, int nToX, int nFromY, int nToY, int nPly)
{
if(m_nMoveCount<80)
{
m_MoveList[nPly][m_nMoveCount].From.X=nFromX;
m_MoveList[nPly][m_nMoveCount].From.Y=nFromY;
m_MoveList[nPly][m_nMoveCount].To.X=nToX;
m_MoveList[nPly][m_nMoveCount].To.Y=nToY;
m_nMoveCount++;
//
//board.ChessBoard[nToX][nToY]=board.ChessBoard[nFromX][nFromY];
//board.ChessBoard[nFromX][nFromY]=0;
//
//MessageBox(NULL,"到达!","检测",1);
}
return m_nMoveCount;
}
//ChessBoard[10][9]是包含棋盘信息的二维数组
//nPly指明当前的层数,每层将走法存在不同的位置,以免重复
//nSide指明产生哪一方的走法,ture 为红方,false 为黑方
//i是纵坐标,j是横坐标
int SetChess::CreatePossibleMove(int ChessBoard[10][9], int nPly, bool nSide)
{
//int x,y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -