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

📄 setchess.cpp

📁 一个简单的象棋游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -