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

📄 cchess.h

📁 我也忘了 用vc写的
💻 H
字号:
#ifndef _CCHESS_H_
#define _CCHESS_H_

#include <windows.h>
#include "chessman.h"
#define LATTICESIZE 50

class cchess
{

public:
	cchess() 
	{ 
		_pitchon = -1;
		bPitchOn = FALSE;
		_shift = TRUE;
	}
	
	cchess( BOOL s )
	{
		_pitchon = -1;
		bPitchOn = FALSE;
		_shift = s;
	}

	void deleteobject() //删除加载的图片类
	{
		DeleteObject(bchessboard);
		DeleteObject(bchessman);
	}

//-----------------------------------------
	BOOL walkrule( int x, int y ) //棋子走步的规则(马走日、相走田......)
	{
		switch ( pcm[_pitchon].inbeing() )
		{
		case 0:
			return che( x, y );
		case 1:
			return ma( x, y );
		case 2:
			return xiang( x, y );
		case 3:
			return shi( x, y);
		case 4:
			return jiang( x, y );
		case 5:
			return pao( x, y );
		case 6:
			return bing( x, y );
		}
		return TRUE;
	}
	BOOL che( int x, int y );
	BOOL ma( int x, int y );
	BOOL xiang( int x, int y );
	BOOL shi( int x, int y );
	BOOL jiang( int x, int y );
	BOOL pao( int x, int y );
	BOOL bing( int x, int y );
//---------------------------------------------
	BOOL shift() const { return _shift; }  //返回现在是灰棋走还是黑气走
	void shifting() { _shift = !_shift; } //转换记录
//-----------------------------------------------
	BOOL HandleWalk( HDC hdc, int x, int y ) //走棋
	{
		int i;
		if( x < 0 || x > 8 || y < 0 || y > 9 )
			return FALSE;

		if( !bPitchOn )
			bPitchOn = occupancy( hdc, x, y );
		else
		{
			if( !occupancy( hdc, x, y ) )
			{
				if( walkrule( x, y ) )
				{
					i = occupancy( x, y );
					if( i != -1 && pcm[i].sort() == !_shift )
						pcm[i].kill();
					manmove( hdc, PitchOn(), x, y );
					shifting();
					NoPitchOn();
					bPitchOn = FALSE;
				}
			}	
		}
		return TRUE;
	}

	void manmove( HDC hdc, int man, int x, int y ); //棋子移动的绘图工作
//---------------------------------------------
	void pitchsign( HDC hdc ) //画棋子被选中状态的虚线
	{
		POINT *xyman;
		if( _pitchon == -1 )
			return;
		xyman = pcm[_pitchon].manplace();
		pitchsign( hdc, xyman->x, xyman->y, 0 );
	}

	void pitchsign( HDC hdc, int pos, COLORREF color )//画棋子被选中状态的虚线
	{
		POINT *xyman;

		xyman = pcm[pos].manplace();
		pitchsign( hdc, xyman->x, xyman->y, color );
	}

	void pitchsign( HDC hdc, int x, int y, COLORREF color ) const; //画棋子被选中状态的虚线
//--------------------------------------------------------
	BOOL occupancy( HDC hdc, int x, int y ); //查看棋盘上指定的位置是否有棋子并且绘制虚线
	int occupancy( int x, int y ); //查看棋盘上指定的位置是否有棋子
//------------------------------------------------------

	int PitchOn() const { return _pitchon; } //返回被选中的棋子
	void NoPitchOn() { _pitchon = -1; } //设置棋子没有选中

//----------------------------------------------------------------
	void initializeman(); //设置棋子开始的初始化状态
	void loadpic( HINSTANCE hInstance ) //载入图片
	{
		bchessboard = LoadBitmap( hInstance, TEXT("chessboard") );
		bchessman = LoadBitmap( hInstance, TEXT("chessman") );
	}
//--------------------------------------------------------------------

	void refurbishboard( HDC hdc ) const//绘制棋盘
	{
		RECT rcPaint;
		rcPaint.left = 0;
		rcPaint.top = 0;
		rcPaint.right = LATTICESIZE;
		rcPaint.bottom = LATTICESIZE;
		refurbishboard( hdc, &rcPaint );
	}
	void refurbishboard( HDC hdc, RECT *rcPaint ) const;//绘制棋盘

	void refurbishman( HDC hdc ); //绘制所有棋子

private:
	HBITMAP bchessboard; //记录棋盘图片句柄
	HBITMAP bchessman; //记录棋子图片句柄
	chessman pcm[32];//所以棋子类
	int _pitchon;//那个棋子现在被选中
	BOOL _shift; //FALSE 黑 、 TRUE 灰
	BOOL bPitchOn;//记录选中棋子的状态
};

void cchess::refurbishboard( HDC hdc, RECT *rcPaint ) const
{
	HDC hdcMemboard;
	hdcMemboard = CreateCompatibleDC(hdc);
	SelectObject( hdcMemboard, bchessboard );

	BitBlt(hdc, rcPaint->left, rcPaint->top, rcPaint->right, rcPaint->bottom, hdcMemboard, rcPaint->left, rcPaint->top, SRCCOPY );

	DeleteDC(hdcMemboard);
}

void cchess::refurbishman( HDC hdc )
{
	HDC hdcMemman;
	int i;
	hdcMemman = CreateCompatibleDC(hdc);
	SelectObject( hdcMemman, bchessman );
	
	for( i = 0; i < 32; i++ )
		pcm[i].drawman( hdc, hdcMemman );

	DeleteDC(hdcMemman);
}

void cchess::manmove( HDC hdc, int man, int x, int y )
{
	HDC hdcMemman;
	POINT *manplace;
	RECT rcPaint;

	manplace = pcm[man].manplace();

	rcPaint.left = manplace->x * LATTICESIZE;
	rcPaint.top = manplace->y * LATTICESIZE;
	rcPaint.right = LATTICESIZE;
	rcPaint.bottom = LATTICESIZE;
	refurbishboard( hdc, &rcPaint );

	pcm[man].set( x, y );

	hdcMemman = CreateCompatibleDC(hdc);
	SelectObject( hdcMemman, bchessman );
	pcm[man].drawman( hdc, hdcMemman );
	DeleteDC(hdcMemman);
}

int cchess::occupancy( int x, int y )
{
	POINT *xyman;
	for( int i = 0; i < 32; i++ )
	{
		if( pcm[i].Exist() )
		{
			xyman = pcm[i].manplace();
			if( xyman->x == x )
				if( xyman->y == y )
					return i;
		}
	}
	return -1;
}

BOOL cchess::occupancy( HDC hdc, int x, int y )
{
	int i = occupancy( x, y );
	if( i != -1 )
	{
		if( pcm[i].sort() == _shift )
		{
			if( _pitchon == -1 )
				_pitchon = i;
			else
			{
				pitchsign( hdc, _pitchon, RGB( 255, 255, 255 ) );
				_pitchon = i;
			}
			pitchsign( hdc );
			return TRUE;
		}

	}
	return FALSE;
}

void cchess::pitchsign( HDC hdc, int x, int y, COLORREF color ) const
{
	HPEN hpen;
	hpen = CreatePen( PS_DASH, 0, color );
	SelectObject( hdc, hpen );
	SelectObject( hdc, GetStockObject( NULL_BRUSH ) );
		
	Rectangle( hdc, x * LATTICESIZE + 4, y * LATTICESIZE + 4, 
			(x + 1) * LATTICESIZE - 4, (y + 1) * LATTICESIZE - 4 );

	DeleteObject( hpen );
}























//----------------------------------------

void cchess::initializeman()
{
	pcm[0].set( 0, TRUE, 0, 0 );
	pcm[1].set( 1, TRUE, 1, 0 );
	pcm[2].set( 2, TRUE, 2, 0 );
	pcm[3].set( 3, TRUE, 3, 0 );
	pcm[4].set( 4, TRUE, 4, 0 );
	pcm[5].set( 3, TRUE, 5, 0 );
	pcm[6].set( 2, TRUE, 6, 0 );
	pcm[7].set( 1, TRUE, 7, 0 );
	pcm[8].set( 0, TRUE, 8, 0 );

	pcm[9].set( 5, TRUE, 1, 2 );
	pcm[10].set( 5, TRUE, 7, 2 );

	pcm[11].set( 6, TRUE, 0, 3 );
	pcm[12].set( 6, TRUE, 2, 3 );
	pcm[13].set( 6, TRUE, 4, 3 );
	pcm[14].set( 6, TRUE, 6, 3 );
	pcm[15].set( 6, TRUE, 8, 3 );



	pcm[16].set( 7, TRUE, 0, 9 );
	pcm[17].set( 8, TRUE, 1, 9 );
	pcm[18].set( 9, TRUE, 2, 9 );
	pcm[19].set( 10, TRUE, 3, 9 );
	pcm[20].set( 11, TRUE, 4, 9 );
	pcm[21].set( 10, TRUE, 5, 9 );
	pcm[22].set( 9, TRUE, 6, 9 );
	pcm[23].set( 8, TRUE, 7, 9 );
	pcm[24].set( 7, TRUE, 8, 9 );

	pcm[25].set( 12, TRUE, 1, 7 );
	pcm[26].set( 12, TRUE, 7, 7 );

	pcm[27].set( 13, TRUE, 0, 6 );
	pcm[28].set( 13, TRUE, 2, 6 );
	pcm[29].set( 13, TRUE, 4, 6 );
	pcm[30].set( 13, TRUE, 6, 6 );
	pcm[31].set( 13, TRUE, 8, 6 );
}

//----------------------------------------

BOOL cchess::che( int x, int y )
{
	int i;
	BOOL xy; // TRUE 横方向移动 、 FALSE 竖方向移动
	POINT *xyman = pcm[_pitchon].manplace();
	if( xyman->x != x )
	{
		if( xyman->y != y )
			return FALSE;
		else
			xy = TRUE;
	}
	else
		xy = FALSE;
	if( xy )
	{
		if( x > xyman->x )
		{
			for( i = xyman->x + 1; i < x; i++ )
				if( occupancy( i, y ) != -1 )
					return FALSE;
		}
		else
		{
			for( i = xyman->x - 1; i > x; i-- )
				if( occupancy( i, y ) != -1 )
					return FALSE;
		}
	}
	else
	{
		if( y > xyman->y )
		{
			for( i = xyman->y + 1; i < y; i++ )
				if( occupancy( x, i ) != -1 )
					return FALSE;
		}
		else
		{
			for( i = xyman->y - 1; i > y; i-- )
				if( occupancy( x, i ) != -1 )
					return FALSE;
		}
	}
	return TRUE;
}

BOOL cchess::ma( int x, int y )
{
	POINT *xyman = pcm[_pitchon].manplace();
	if( xyman->x + 1 == x || xyman->x - 1 == x )
	{
		if( xyman->y + 2 == y && occupancy( xyman->x, xyman->y + 1) == -1 )
			return TRUE;
		if( xyman->y - 2 == y && occupancy( xyman->x, xyman->y - 1) == -1 )
			return TRUE;
	}
	else if( xyman->y + 1 == y || xyman->y - 1 == y )
	{
		if( xyman->x + 2 == x && occupancy( xyman->x + 1, xyman->y ) == -1 )
			return TRUE;
		if( xyman->x - 2 == x && occupancy( xyman->x - 1, xyman->y ) == -1 )
			return TRUE;
	}
	return FALSE;
}

BOOL cchess::xiang( int x, int y )
{
	int ManSort;
	POINT *xyman = pcm[_pitchon].manplace();
	if( (xyman->x + 2 == x && xyman->y + 2 == y && occupancy( xyman->x + 1, xyman->y + 1 ) == -1) ||
		(xyman->x - 2 == x && xyman->y - 2 == y && occupancy( xyman->x - 1, xyman->y - 1 ) == -1) ||
		(xyman->x + 2 == x && xyman->y - 2 == y && occupancy( xyman->x + 1, xyman->y - 1 ) == -1) ||
		(xyman->x - 2 == x && xyman->y + 2 == y && occupancy( xyman->x - 1, xyman->y + 1 ) == -1) )
	{
		ManSort = pcm[_pitchon].sort();
		if( ManSort == 0 )
		{
			if( y <= 4 ) return TRUE;
		}
		else if( ManSort == 1 )
		{
			if( y >= 5 ) return TRUE;
		}
	}

	return FALSE;
}

BOOL cchess::shi( int x, int y )
{
	int ManSort;
	POINT *xyman = pcm[_pitchon].manplace();
	if( (xyman->x + 1 == x && xyman->y + 1 == y) ||
		(xyman->x - 1 == x && xyman->y - 1 == y) ||
		(xyman->x + 1 == x && xyman->y - 1 == y) ||
		(xyman->x - 1 == x && xyman->y + 1 == y) )
	{
		if( x >= 3 && x <= 5 )
		{
			ManSort = pcm[_pitchon].sort();
			if( ManSort == 0 )
			{
				if( y <= 2 ) return TRUE;
			}
			else if( ManSort == 1 )
			{
				if( y >= 7 ) return TRUE;
			}
		}
	
	}
	return FALSE;
}

BOOL cchess::jiang( int x, int y )
{
	int ManSort;
	POINT *xyman = pcm[_pitchon].manplace();
	if( (xyman->x == x && (xyman->y + 1 == y || xyman->y - 1 == y) ) ||
		(xyman->y == y && (xyman->x + 1 == x || xyman->x - 1 == x) ) )
	{
		if( x >= 3 && x <= 5 )
		{
			ManSort = pcm[_pitchon].sort();
			if( ManSort == 0 )
			{
				if( y <= 2 ) return TRUE;
			}
			else if( ManSort == 1 )
			{
				if( y >= 7 ) return TRUE;
			}
		}
	}
	return FALSE;
}

BOOL cchess::pao( int x, int y )
{
	int i, sum = 0;
	BOOL xy; // TRUE 横方向移动 、 FALSE 竖方向移动
	POINT *xyman = pcm[_pitchon].manplace();
	if( xyman->x != x )
	{
		if( xyman->y != y )
			return FALSE;
		else
			xy = TRUE;
	}
	else
		xy = FALSE;
	if( occupancy( x, y ) != -1 )
	{
		if( xy )
		{
			if( x > xyman->x )
			{
				for( i = xyman->x + 1; i < x; i++ )
					if( occupancy( i, y ) != -1 )
						sum++;
			}
			else
			{
				for( i = xyman->x - 1; i > x; i-- )
					if( occupancy( i, y ) != -1 )
						sum++;
			}
		}
		else
		{
			if( y > xyman->y )
			{
				for( i = xyman->y + 1; i < y; i++ )
					if( occupancy( x, i ) != -1 )
						sum++;
			}
			else
			{
				for( i = xyman->y - 1; i > y; i-- )
					if( occupancy( x, i ) != -1 )
						sum++;
			}
		}	
		if( sum != 1 )
			return FALSE;
	}
	else
	{
		if( xy )
		{
			if( x > xyman->x )
			{
				for( i = xyman->x + 1; i < x; i++ )
					if( occupancy( i, y ) != -1 )
						return FALSE;
			}
			else
			{
				for( i = xyman->x - 1; i > x; i-- )
					if( occupancy( i, y ) != -1 )
						return FALSE;
			}
		}
		else
		{
			if( y > xyman->y )
			{
				for( i = xyman->y + 1; i < y; i++ )
					if( occupancy( x, i ) != -1 )
						return FALSE;
			}
			else
			{
				for( i = xyman->y - 1; i > y; i-- )
					if( occupancy( x, i ) != -1 )
						return FALSE;
			}
		}
	}
	return TRUE;
}

BOOL cchess::bing( int x, int y )
{
	int ManSort;
	POINT *xyman = pcm[_pitchon].manplace();
	if( (xyman->x == x && (xyman->y + 1 == y || xyman->y - 1 == y) ) ||
		(xyman->y == y && (xyman->x + 1 == x || xyman->x - 1 == x) ) )
	{
		ManSort = pcm[_pitchon].sort();

		if( ManSort == 0 )
		{
			if( xyman->y <= 4 ) 
				if( xyman->y + 1 != y )
					return FALSE;
		}
		else if( ManSort == 1 )
		{
			if( xyman->y >= 5 )
				if( xyman->y - 1 != y )
					return FALSE;
		}
		return TRUE;
	}
	return FALSE;
}

#endif

⌨️ 快捷键说明

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