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