?? searchpathview.cpp
字號:
// 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 + -