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

📄 searchpathview.cpp

📁 寻径算法演示平台~~提供给计算机博弈爱好者参考学习
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SearchPathView.cpp : implementation of the CSearchPathView class
//

#include "stdafx.h"
#include "SearchPath.h"

#include "SearchPathDoc.h"
#include "SearchPathView.h"

#include "MAP.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif



//const int Height=15;
//const int Width=22;


#define Height 120
#define Width 176

extern map[Height][Width];
extern map1[Height][Width];
extern map2[Height][Width];
extern map3[Height][Width];
extern map4[Height][Width];
extern map5[Height][Width];

/////////////////////////////////////////////////////////////////////////////
// CSearchPathView

IMPLEMENT_DYNCREATE(CSearchPathView, CView)

BEGIN_MESSAGE_MAP(CSearchPathView, CView)
	//{{AFX_MSG_MAP(CSearchPathView)
	ON_COMMAND(IDM_LIST_ASTAR, OnListAstar)
	ON_COMMAND(IDM_LIST_WATER, OnListWater)
	ON_COMMAND(IDM_MAP1, OnMap1)
	ON_COMMAND(IDM_MAP2, OnMap2)
	ON_COMMAND(IDM_MAP3, OnMap3)
	ON_COMMAND(IDM_MAP4, OnMap4)
	ON_COMMAND(IDM_MAP5, OnMap5)
	ON_COMMAND(IDM_MAP6, OnMap6)
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(IDM_LIST_WAVE, OnListWave)
	ON_COMMAND(IDM_LIST_ASSTAR, OnListAsstar)
	ON_COMMAND(IDM_LIST_BothWAVE, OnLISTBothWAVE)
	ON_COMMAND(IDM_MAKEMAP, OnMakemap)
	ON_COMMAND(IDM_SETBE, OnSetBE)
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(IDM_SAVEMAP, OnSaveMap)
	ON_COMMAND(IDM_SHOWNODE, OnShowNode)
	ON_COMMAND(IDM_SHOWPATH, OnShowPath)
	ON_COMMAND(IDM_READMAP, OnReadMap)
	ON_COMMAND(IDM_SHOWSHADE, OnShowShade)
	ON_COMMAND(IDM_DEMOASTAR, OnDemoAStar)
	ON_COMMAND(IDM_DEMOWAVE, OnDemoWave)
	ON_COMMAND(IDM_DEMOBOTHWAVE, OnDemoBothWave)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)

	ON_COMMAND(IDM_SaveMap1, OnSaveMap1)
	ON_COMMAND(IDM_SaveMap2, OnSaveMap2)
	ON_COMMAND(IDM_SaveMap3, OnSaveMap3)
	ON_COMMAND(IDM_SaveMap4, OnSaveMap4)
	ON_COMMAND(IDM_SaveMap5, OnSaveMap5)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSearchPathView construction/destruction

CSearchPathView::CSearchPathView()
{
	// TODO: add construction code here
	
	AStar=NULL;
	Water=NULL;
	Wave=NULL;
	ASStar=NULL;
	BothWave=NULL;
	m_SearchSort = 0;//which alg are you use.
	m_ifOpen = 0;//等于一的时候就可以输入起点和终点
	m_ifDouble = 0;//表示没有双击
	m_ifMakemap = 0;//表示不能编辑地图
	m_showMode = 0;//不显示搜索过的节点

	m_numSaveMap = 0;//储存地图的数目初始值为0



	
}

CSearchPathView::~CSearchPathView()
{
}

BOOL CSearchPathView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSearchPathView drawing

void CSearchPathView::OnDraw(CDC* pDC)
{
	CSearchPathDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	
	
	if(m_SearchSort==0)
	{
		CBitmap bm1,bm2,bm3, *pbm;
		BITMAP bmMetric1,bmMetric2;
		
		bm1.LoadBitmap(IDB_BITMAP7);
		bm2.LoadBitmap(IDB_BITMAP12);//起点
		bm3.LoadBitmap(IDB_BITMAP13);//终点
		
		bm1.GetBitmap(&bmMetric1);
		bm2.GetBitmap(&bmMetric2);
		
		CDC memDC;
		memDC.CreateCompatibleDC(pDC);
		pbm = memDC.SelectObject(&bm1);
		for(int i = 0; i < Height; i ++)
		{
			for(int j = 0; j < Width;  j ++)
			{
				if(map[i][j]==-1)
				{
					memDC.SelectObject(&bm1);
					pDC->BitBlt(j*bmMetric1.bmHeight, i*bmMetric1.bmWidth,bmMetric1.bmWidth,bmMetric1.bmHeight,&memDC,0,0,SRCCOPY);	
				}
				
				else if(map[i][j]==0)
				{
					memDC.SelectObject(&bm2);
					pDC->BitBlt(j*bmMetric2.bmHeight, i*bmMetric2.bmWidth,bmMetric2.bmWidth,bmMetric2.bmHeight,&memDC,0,0,SRCCOPY);
				}
				else if(map[i][j]==-3)
				{
					memDC.SelectObject(&bm3);
					pDC->BitBlt(j*bmMetric2.bmHeight, i*bmMetric2.bmWidth,bmMetric2.bmWidth,bmMetric2.bmHeight,&memDC,0,0,SRCCOPY);
				}	
			}
		}
		memDC.SelectObject(pbm);
		bm1.DeleteObject();
		bm2.DeleteObject();
		memDC.DeleteDC();
	}
	else if(m_SearchSort==1)
	{
		AStar->showThePath(pDC , m_showMode);
	}
	else if(m_SearchSort==2)
	{
		Water->showThePath(pDC , m_showMode);		
	}
	else if(m_SearchSort==3)
	{
		Wave->showThePath(pDC , m_showMode);		
	}
	else if(m_SearchSort==4)
	{
		ASStar->showThePath(pDC, m_showMode);		
	}
	else if(m_SearchSort==5)
	{
		BothWave->showThePath(pDC , m_showMode);		
	}

}

/////////////////////////////////////////////////////////////////////////////
// CSearchPathView printing

BOOL CSearchPathView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CSearchPathView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CSearchPathView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CSearchPathView diagnostics

#ifdef _DEBUG
void CSearchPathView::AssertValid() const
{
	CView::AssertValid();
}

void CSearchPathView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CSearchPathDoc* CSearchPathView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSearchPathDoc)));
	return (CSearchPathDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSearchPathView message handlers



void CSearchPathView::OnListAstar()
{
	// TODO: Add your command handler code here
	m_ifOpen=0;
	m_ifMakemap = 0;
	if(AStar!=NULL)delete AStar;
	AStar = new CAStar;

	long time;
	time=GetTickCount();
	for(int i=0;i<100;i++)
	{	
		if(AStar!=NULL)delete AStar;
		AStar = new CAStar;
		if(!AStar->searchThePath())
		{
			MessageBox("找不到路径");
			return;
		}
	}
	time = (GetTickCount()-time)/100;//执行100次来计算平均时间时间了. 

	char buf[10];
	sprintf(buf,"耗时%dms",time);
	MessageBox(buf);

	m_SearchSort=1;
	Invalidate();
}

void CSearchPathView::OnListWater() 
{
	// TODO: Add your command handler code here
	m_ifOpen=0;
	m_ifMakemap = 0;
	if(Water!=NULL)delete Water;

	Water = new CWater;

	long time;
	time=GetTickCount();

	for(int i=0;i<100;i++)
	{	
		if(Water!=NULL)delete Water;
		Water = new CWater;
		if(!Water->searchThePath())
		{
			MessageBox("找不到路径");
			return;
		}
	}
	

	time = (GetTickCount()-time)/100;//这就是运行的时间了. 

	char buf[10];
	sprintf(buf,"耗时%dms",time);
	MessageBox(buf);

	m_SearchSort=2;
	Invalidate();
}



void CSearchPathView::OnListWave() 
{
	// TODO: Add your command handler code here
	m_ifOpen=0;
	m_ifMakemap = 0;
	if(Wave!=NULL)delete Wave;

	Wave = new CWave;

	long time;
	time = GetTickCount();
	for(int i=0;i<100;i++)
	{	
		if(Wave!=NULL)delete Wave;
		Wave = new CWave;
		if(!Wave->searchThePath())
		{
			MessageBox("找不到路径");
			return;
		}
	}
	time = (GetTickCount()-time)/100;//这就是运行的时间了. 

	char buf[10];
	sprintf(buf,"耗时%dms",time);
	MessageBox(buf);

	m_SearchSort=3;
	Invalidate();
}

void CSearchPathView::OnListAsstar() 
{
	// TODO: Add your command handler code here
	m_ifOpen=0;
	m_ifMakemap = 0;

	long time;
	time=GetTickCount();
	for(int i=0;i<100;i++)
	{	
		if(ASStar!=NULL)delete ASStar;
		ASStar = new CASStar;
		if(!ASStar->searchThePath())
		{
			MessageBox("找不到路径");
			return;
		}
	}
	//Water->SearchThePath();
	time = (GetTickCount()-time)/100;//这就是运行的时间了. 

	char buf[10];
	sprintf(buf,"耗时%dms",time);
	MessageBox(buf);

	m_SearchSort=4;
	Invalidate();
}

void CSearchPathView::OnLISTBothWAVE() 
{
	// TODO: Add your command handler code here
	m_ifOpen=0;
	m_ifMakemap = 0;
	if(Wave!=NULL)delete BothWave;

	BothWave = new CBothWave;

	long time;
	time = GetTickCount();
	for(int i=0;i<100;i++)
	{	
		if(BothWave!=NULL)delete BothWave;
		BothWave = new CBothWave;
		if(!BothWave->searchThePath())
		{
			MessageBox("找不到路径");
			return;
		}
	}
	time = (GetTickCount()-time)/100;//这就是运行的时间了. 

	char buf[10];
	sprintf(buf,"耗时%dms",time);
	MessageBox(buf);

	m_SearchSort=5;
	Invalidate();
}



void CSearchPathView::OnMap1() 
{
	// TODO: Add your command handler code here
	for(int i=0;i<Height;i++)
	{
		for(int j=0;j<Width;j++)
		{
			map[i][j]=map1[i][j];
		}
	}
	m_SearchSort=0;
	m_ifOpen=0;
	m_ifMakemap = 0;
	Invalidate();
}

void CSearchPathView::OnMap2() 
{
	// TODO: Add your command handler code here
	for(int i=0;i<Height;i++)
	{
		for(int j=0;j<Width;j++)
		{
			map[i][j]=map2[i][j];
		}
	}
	m_SearchSort=0;
	m_ifOpen=0;
	m_ifMakemap = 0;
	Invalidate();
}

void CSearchPathView::OnMap3() 
{
	// TODO: Add your command handler code here
	for(int i=0;i<Height;i++)
	{
		for(int j=0;j<Width;j++)
		{
			map[i][j]=map3[i][j];
		}
	}
	m_SearchSort=0;
	m_ifOpen=0;
	m_ifMakemap = 0;
	Invalidate();
}

void CSearchPathView::OnMap4() 
{
	// TODO: Add your command handler code here
	for(int i=0;i<Height;i++)
	{
		for(int j=0;j<Width;j++)
		{
			map[i][j]=map4[i][j];
		}
	}
	m_SearchSort=0;
	m_ifOpen = 0;
	m_ifMakemap = 0;
	Invalidate();
}

void CSearchPathView::OnMap5() 
{
	// TODO: Add your command handler code here
	for(int i=0;i<Height;i++)
	{
		for(int j=0;j<Width;j++)
		{
			map[i][j]=map5[i][j];
		}
	}
	m_SearchSort=0;
	m_ifOpen=0;
	m_ifMakemap = 0;
	Invalidate();
}

void CSearchPathView::OnMap6() 
{
	// TODO: Add your command handler code here
	for(int i=0;i<Height;i++)
	{
		for(int j=0;j<Width;j++)
		{
			map[i][j]=map6[i][j];
		}
	}
	m_SearchSort=0;
	m_ifOpen=0;
	m_ifMakemap = 0;
	Invalidate();
}

void CSearchPathView::OnSetBE() 
{
	// TODO: Add your command handler code here
	m_SearchSort = 0;//如果画面上显示搜索节点和路径,则把其清除
	m_ifMakemap = 0;//关闭制作地图设置
	m_ifOpen = 1;//开启设置起点和终点设置
	Invalidate();
}

void CSearchPathView::OnMakemap() 
{
	// TODO: Add your command handler code here
	m_SearchSort = 0;//如果画面上显示搜索节点和路径,则把其清除
	m_ifOpen = 0;//关闭起点和终点的设置
	m_ifMakemap = 1;//开启地图的设置
	Invalidate();
}


void CSearchPathView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_ifOpen)
	{
		int x,y;			
		x = point.x/5;
		y = point.y/5;
		if(m_ifDouble==0)//如果是第一次点击鼠标,那就设置起始点的坐标
		{

			for(int i=0;i<Height;i++)
			{
				for(int j=0;j<Width;j++)
				{
					if(map[i][j]==0)//改变原来的起点
					{
						map[i][j]=-4;
					}
				}
			}
			map[y][x]=0;
			m_ifDouble=1;
			Invalidate();//使窗口重绘
		}
		else if(m_ifDouble==1)
		{

			for(int i=0;i<Height;i++)
			{
				for(int j=0;j<Width;j++)
				{
					if(map[i][j]==-3)//改变原来的终点
					{
						map[i][j]=-4;
					}
				}
			}
			map[y][x]=-3;
			m_ifDouble=0;
			Invalidate();//使窗口重绘
		}
	}
	else if(m_ifMakemap == 1)//如果目前进入制作地图的模式
	{
		m_ifDouble = 0;//第二次点击修改起点和终点,从改起点开始
		int x,y;			
		x = point.x/5;
		y = point.y/5;
		if(map[y][x] == -1)
		{
			m_ModeOfMakeMap = map[y][x] = -4;
		}
		else if(map[y][x] == -4)
		{
			m_ModeOfMakeMap = map[y][x] = -1;
		}
		m_ifLBTUp = 0;//左键没有松开
		Invalidate();//使窗口重绘
	}

	
	
	


	CView::OnLButtonDown(nFlags, point);
}






void CSearchPathView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_ifMakemap == 1)//如果目前进入制作地图的模式
	{
		m_ifLBTUp = 1;
	}

	CView::OnLButtonUp(nFlags, point);
}

void CSearchPathView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_ifMakemap == 1)//如果目前进入制作地图的模式

⌨️ 快捷键说明

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