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

📄 horse.h

📁 本程序实现的是 一个数据结构算法 马的遍历。
💻 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 + -