📄 horse.h
字号:
//--------------------------------------------------------------------------
//<horse.h> 完成VC显示及极小化覆盖
#include"display.h"
#include<iostream.h>
bool MSGR(MSG &Msg) //消息循环函数
{
if(!STEP&&!PeekMessage(&Msg,NULL,0,0,PM_NOREMOVE)) //测试窗口消息
return true;
while(GetMessage(&Msg,NULL,0,0)) //取出窗口消息
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
if(Msg.message==WM_LBUTTONDOWN||!STEP) //非单步或点击左键则退出
return true;
}
return false; //返回关闭窗口消息
}
void delay() //延时程序
{
if(STEP) //单步则不延时
return;
int d1,d2;
for(d1=0;d1<5000000;d1++)
for(d2=0;d2<1;d2++);
}
class Horse_cover{
COLOR horse[N+1][M+1]; //存储棋格的信息
int in[N+1][M+1]; //棋格的入度
public:
void disp_all_horse(); //初始显示棋盘及所有的马
Horse_cover();
WPARAM horse_killng(); //删马函数
void win_out(int bit_start_row,int bit_start_col, //基本显示输出函数
int row_num,int col_num,COLOR bmap,int dist);
~Horse_cover(){};
};
Horse_cover::Horse_cover()
{
int row,col,dir;
int _row,_col;
for(row=1;row<=N;row++)
for(col=1;col<=M;col++)
{
horse[row][col]=GRAY; //所有的马初始化为灰色
in[row][col]=1;
for(dir=0;dir<8;dir++)
{
_row=row+direction[dir][0];
_col=col+direction[dir][1];
if(_row<=N&&_row>=1&&_col<=M&&_col>=1)
in[row][col]++; //累加八个方向上的入度
}
}
}
WPARAM Horse_cover::horse_killng()
{
int row,col,dir,__dir;
int _row,_col,__row,__col;
MSG Msg;
bool xchg; //棋子变色标志
bool redexist=false; //红色禁止格的输出
if(!MSGR(Msg)) //消息循环
return Msg.wParam;
disp_all_horse();
for(row=1;row<=N;row++)
{
for(col=1;col<=M;col++)
{
if(!MSGR(Msg))
return Msg.wParam; //消息循环
delay();
disp_key_horse(row,col,YELLOW); //以黄色输出当前判断马
for(dir=0;dir<8;dir++)
{
redexist=false;
_row=row+direction[dir][0];
_col=col+direction[dir][1];
if(_row<=N&&_row>=1&&_col<=M&&_col>=1)
{
if(in[_row][_col]<=1) //入度小于等于一
{ //则输出,红色
disp_key_horse(_row,_col,RED_NUL); //禁止空格,并
redexist=true; //设置标志
break;
}
if(!MSGR(Msg))
return Msg.wParam; //消息循环
delay();
xchg=false;
if(horse[_row][_col])
disp_key_horse(_row,_col,GREEN); //输出有马的方向位
else{
disp_key_horse(_row,_col,GREEN_NUL); //输出无马格
for(__dir=0;__dir<8;__dir++)
{
__row=_row+direction[__dir][0];
__col=_col+direction[__dir][1];
if(__row>=1&&__row<=N&&__col>=1&&__col<=M&&
(__row!=row||__col!=col)&&horse[__row][__col])
{
disp_key_horse(__row,__col,BLUE);//输出对其覆
xchg=true; //盖的马更新相
break; //应标志位
}
}
}
if(!MSGR(Msg))
return Msg.wParam; //消息循环
delay();
disp_key_horse(_row,_col,horse[_row][_col]);
if(xchg)
disp_key_horse(__row,__col,horse[__row][__col]);
} //更新棋格位图
}
if(dir==8&&in[row][col]>1) //此马无禁止位及
{ //有源覆盖马时
for(dir=0;dir<8;dir++)
{
_row=row+direction[dir][0];
_col=col+direction[dir][1];
if(_row<=N&&_row>=1&&_col<=M&&_col>=1)
in[_row][_col]--; //更新邻接格的入度
}
in[row][col]--;
horse[row][col]=NUL; //删掉该多余马
}
if(!MSGR(Msg))
return Msg.wParam; //消息循环
delay();
if(redexist)
disp_key_horse(_row,_col,horse[_row][_col]); //更新红色禁止位
disp_key_horse(row,col,horse[row][col]); //更新当前棋格
}
}
disp_all_horse();
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
void Horse_cover::disp_all_horse() //初始显示棋盘及所有的马
{
int row,col;
int point_row,point_col;
COLOR color;
win_out(0,0,M+1,0,EDGE_UD,DIST); //上横边
win_out(0,0,0,N+1,EDGE_LR,DIST); //左竖边
win_out(WIN_ROW+DIST*N,0,M+1,0,EDGE_UD,DIST); //下横边
win_out(0,WIN_COL+DIST*M,0,N+1,EDGE_LR,DIST); //右竖边
COLOR wb=WHITE;
for(row=1;row<=N;row++)
{
win_out(WIN_ROW+DIST*(row-1),WIN_COL,M,0,wb,DIST); //横格
wb=wb>WHITE?WHITE:BLACK;
}
for(row=1;row<=N;row++)
for(col=1;col<=M;col++) //输出棋盘上所有的马
{
color=horse[row][col];
if(color==0)
continue;
if(row%2+col%2==1)
color++;
point_row=WIN_ROW+START_ROW+(col-1)*DIST+1;
point_col=WIN_COL+START_COL+(row-1)*DIST+1;
SelectObject(hdcmem,hBm[color]);
BitBlt(hdc,point_row,point_col,bm[color].bmWidth,
bm[color].bmHeight,hdcmem,0,0,SRCCOPY);
}
}
void Horse_cover::win_out(int bit_start_row,int bit_start_col,int row_num,
int col_num,COLOR bmap,int dist)//基本显示输出函数
{
COLOR bbmap=bmap;
while(col_num--) //输出列位图
{
SelectObject(hdcmem,hBm[bmap]);
BitBlt(hdc,START_ROW+bit_start_col,START_COL+bit_start_row,
bm[bmap].bmWidth,bm[bmap].bmHeight,hdcmem,0,0,SRCCOPY);
bit_start_row+=dist;
if(bbmap>EDGE_LR)
bmap=bmap>WHITE?WHITE:BLACK; //黑白格切换
}
while(row_num--) //输出行位图
{
SelectObject(hdcmem,hBm[bmap]);
BitBlt(hdc,START_ROW+bit_start_col,START_COL+bit_start_row,
bm[bmap].bmWidth,bm[bmap].bmHeight,hdcmem,0,0,SRCCOPY);
bit_start_col+=dist;
if(bbmap>EDGE_LR)
bmap=bmap>WHITE?WHITE:BLACK; //黑白格切换
}
}
//------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -