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

📄 gamefrm.cpp

📁 用vc++写的迷宫基于图形的算法,可以自己编辑地图,并具有保存地图的功能
💻 CPP
字号:
// GameFrm.cpp : implementation file
//

#include "stdafx.h"
#include "resource.h"
#include "GameFrm.h"
#include "DlgMaze.h"
#include "Dlghelp.h"

#include <afxcmn.h>
#include "Splash.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

#define MAZEGROUND 0
#define MAZEWALL 1
#define MAZEBALL 2
#define MAZEEXIT 3
#define MAZENULL -1

CMainFrame::CMainFrame()
{

	m_pMapEdit=new CMapEdit;
    m_pMapEdit->LoadMap();
	m_MazeHigh=m_pMapEdit->m_MazeHigh;
	m_MazeWidth=m_pMapEdit->m_MazeWidth;
	
	Create(NULL,"基于图形迷宫算法",WS_CAPTION|WS_SYSMENU);
	CClientDC dc(this);
	UINT uXPos = GetSystemMetrics(SM_CXSCREEN) / 2 - 40*m_MazeWidth / 2;
	UINT uYPos = GetSystemMetrics(SM_CYSCREEN) / 2 - 40*m_MazeHigh/ 2;
    SetWindowPos(&wndTopMost,uXPos,uYPos,40*m_MazeWidth+10,40*(m_MazeHigh+1)+15,SWP_NOZORDER);

	m_CurrentSel=MAZENULL;
	m_MouseDown=false;
	IsSearch=false;
    
}

CMainFrame::~CMainFrame()
{
	delete m_pMapEdit;

}


BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(IDM_READ, OnRead)
	ON_WM_PAINT()
	ON_COMMAND(IDM_SAVE, OnSave)
	ON_COMMAND(IDD_MAZEBALL, OnMazeball)
	ON_COMMAND(IDD_MAZEEXIT, OnMazeexit)
	ON_COMMAND(IDD_MAZEGROUND, OnMazeground)
	ON_COMMAND(IDD_MAZEWALL, OnMazewall)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_COMMAND(IDR_EXIT, OnExit)
	ON_COMMAND(IDM_NEW, OnNew)
	ON_WM_RBUTTONDOWN()
	ON_WM_KEYDOWN()
	ON_COMMAND(ID_MAZEAI, OnMazeai)
	ON_WM_TIMER()
	ON_COMMAND(ID_MAZESHORT, OnMazeshort)
	ON_COMMAND(IDH_ABOUT, OnAbout)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    
    SetIcon(AfxGetApp()->LoadIcon(IDI_MAZEBALL),false);
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (OnCreateToolBar() == -1)
	{
		MessageBox("创建工具条失败!");
	}
	// TODO: Add your specialized creation code here
	CMenu menu;
	menu.LoadMenu(IDR_MAINMENU);
	this->SetMenu(&menu);
	// CG: The following line was added by the Splash Screen component.	CSplashWnd::ShowSplashScreen(this);
	return 0;
}

void CMainFrame::OnRead() 
{
	// TODO: Add your command handler code here
	m_pMapEdit->LoadMap();
}

void CMainFrame::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	CDC mdc;
	CBitmap bitmap;
	CRect m_rcClient;
	// TODO: Add your message handler code here
	
	// Do not call CFrameWnd::OnPaint() for painting messages
    GetClientRect(&m_rcClient);

	mdc.CreateCompatibleDC(&dc);
	bitmap.CreateCompatibleBitmap(&dc,m_rcClient.Width(),m_rcClient.Height());

	mdc.SelectObject(&bitmap);

	m_pMapEdit->DrawMap(&mdc);
	m_pMapEdit->DrawMouseCursor(m_CurPoint,m_CurrentSel,&mdc);
	dc.BitBlt(0,0,m_rcClient.Width(),m_rcClient.Height(),&mdc,0,0,SRCCOPY);
	
	bitmap.DeleteObject();
}

//DEL void CMainFrame::OnExit() 
//DEL {
//DEL 	// TODO: Add your command handler code here
//DEL 	PostQuitMessage(0);
//DEL 
//DEL }

void CMainFrame::OnSave() 
{
	// TODO: Add your command handler code here
	m_pMapEdit->SaveMap();
}





void CMainFrame::OnMazeball() 
{
	// TODO: Add your command handler code here
	m_CurrentSel=MAZEBALL;
}

void CMainFrame::OnMazeexit() 
{
	// TODO: Add your command handler code here
	m_CurrentSel=MAZEEXIT;
}

void CMainFrame::OnMazeground() 
{
	// TODO: Add your command handler code here
	m_CurrentSel=MAZEGROUND;
}

void CMainFrame::OnMazewall() 
{
	// TODO: Add your command handler code here
	m_CurrentSel=MAZEWALL;
}

void CMainFrame::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
    m_CurPoint=point;
	if(m_MouseDown && m_CurrentSel!=MAZENULL)
		m_pMapEdit->ChangMap(m_CurPoint,m_CurrentSel);
	Invalidate(false);
	CFrameWnd::OnMouseMove(nFlags, point);
}

void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_MouseDown=true;
	if(m_CurrentSel!=MAZENULL)
	m_pMapEdit->ChangMap(point,m_CurrentSel);
	if (m_CurrentSel==MAZEBALL || m_CurrentSel==MAZEEXIT)
	{
		m_CurrentSel=MAZENULL;
	}
	Invalidate(false);
	CFrameWnd::OnLButtonDown(nFlags, point);
}

void CMainFrame::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_MouseDown=false;
	CFrameWnd::OnLButtonUp(nFlags, point);
}



void CMainFrame::OnExit() 
{
	// TODO: Add your command handler code here
	PostQuitMessage(0);
}

void CMainFrame::OnNew() 
{
	// TODO: Add your command handler code here
	CDlgMaze dlg;
	if (dlg.DoModal() == IDOK)
	{
		m_MazeHigh=dlg.m_MazeWidth;
		m_MazeWidth=dlg.m_MazeHight;
		m_pMapEdit->m_MazeHigh=m_MazeHigh;
		m_pMapEdit->m_MazeWidth=m_MazeWidth;
		UINT uXPos = GetSystemMetrics(SM_CXSCREEN) / 2 - 40*m_MazeWidth / 2;
		UINT uYPos = GetSystemMetrics(SM_CYSCREEN) / 2 - 40*m_MazeHigh/ 2;
		SetWindowPos(&wndTopMost,uXPos,uYPos,40*m_MazeWidth+10,40*(m_MazeHigh+1)+15,SWP_NOZORDER);
		
		m_pMapEdit->ClearMap();
		m_pMapEdit->m_BallNum=0;
		m_pMapEdit->m_ExitNum=0;
		
	}

}

int CMainFrame::OnCreateToolBar()
{
   
	CImageList img;
	CString str;
	
	if (!m_wndToolBar.CreateEx(this))
	{
		return -1;		
	}
	
	//设置按钮的宽度和长度
	m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50, 50);

	m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT |CBRS_TOOLTIPS | 
							TBSTYLE_TRANSPARENT|TBBS_CHECKBOX );

	m_wndToolBar.SetButtons(NULL,4);	
	
	// 2. 添加图像
	//设置"热/hot"状态的的位图
	img.Create(28, 28, ILC_COLOR8|ILC_MASK,4,0);
	img.SetBkColor(RGB(0, 0, 0));

	img.Add(AfxGetApp()->LoadIcon(IDI_MAZEGROUND));
    img.Add(AfxGetApp()->LoadIcon(IDI_MAZEWALL));	
	img.Add(AfxGetApp()->LoadIcon(IDI_MAZEBALL));
    img.Add(AfxGetApp()->LoadIcon(IDI_MAZEEXIT));

	m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
	img.Detach();	
	//设置"冷/cold"状态的位图
	img.Create(26, 26, ILC_COLOR8|ILC_MASK, 4,0);
	img.SetBkColor(::GetSysColor(COLOR_BTNFACE));
	//顺序增添按键的图标
	img.Add(AfxGetApp()->LoadIcon(IDI_MAZEGROUND));
    img.Add(AfxGetApp()->LoadIcon(IDI_MAZEWALL));	
	img.Add(AfxGetApp()->LoadIcon(IDI_MAZEBALL));
    img.Add(AfxGetApp()->LoadIcon(IDI_MAZEEXIT));

	m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
	img.Detach();


	m_wndToolBar.SetButtonInfo(0, IDD_MAZEGROUND, TBSTYLE_BUTTON, 0);
	m_wndToolBar.SetButtonText(0, "地面");	
	
	m_wndToolBar.SetButtonInfo(1, IDD_MAZEWALL, TBSTYLE_BUTTON, 1);
	m_wndToolBar.SetButtonText(1, "墙壁");	
	
	m_wndToolBar.SetButtonInfo(2, IDD_MAZEBALL, TBSTYLE_BUTTON, 2);
	m_wndToolBar.SetButtonText(2, "入口");	
	
	m_wndToolBar.SetButtonInfo(3, IDD_MAZEEXIT, TBSTYLE_BUTTON, 3);
	m_wndToolBar.SetButtonText(3, "出口");	
	
	CRect rectToolBar;
	//得到按钮的大小
	m_wndToolBar.GetItemRect(0, &rectToolBar);
	//设置按钮的大小
	m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(26,26));
	
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	//允许停靠
	EnableDocking(CBRS_ALIGN_TOP);
	//漂浮停靠
	CPoint pt(GetSystemMetrics(SM_CXSCREEN)/2+100,GetSystemMetrics(SM_CYSCREEN)/3+100);
	FloatControlBar(&m_wndToolBar,pt);
	
	return TRUE;

	return 0;
}

void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_CurrentSel=MAZENULL;
	CFrameWnd::OnRButtonDown(nFlags, point);
}


void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default

	if(m_pMapEdit->GoMaze(nChar))
		Invalidate(false);
	CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CMainFrame::OnMazeai() 
{
	// TODO: Add your command handler code here
	CDlgSearchSpeed dlg;
	if (dlg.DoModal()==IDOK)
	{

	int speed=1500-dlg.m_SpeedValue;
	if (m_pMapEdit->CheckMaze())
	{
		m_pMapEdit->InitPointer();
		SetTimer(1,speed,NULL);
	}
	}
	
}

void CMainFrame::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default

	if (!m_pMapEdit->SearchMaze())
	{
	
		Invalidate(false);
	}
	else
	{
		BOOL IsEnableOut;
		IsEnableOut=m_pMapEdit->IsEnableOut;
		KillTimer(1);
		if (!IsEnableOut)
		MessageBox("没有出路!");
		else
		{
			MessageBox("找到出口了!");
		IsSearch=true;
		if (MessageBox("探索迷宫完成,是否显示最短路径?","探索完成",MB_YESNO)==IDYES)
	    {
			CClientDC dc(this);
			m_pMapEdit->ShowShort(&dc);
			MessageBox("确定清除路径!");

		}
	
		

		}
		
		
			
	}
  	
	
	CFrameWnd::OnTimer(nIDEvent);
}

void CMainFrame::OnMazeshort() 
{
	// TODO: Add your command handler code here
	BOOL IsEnableOut=m_pMapEdit->IsEnableOut;
	if (!IsSearch)
	
	MessageBox("请先探索迷宫!");
	else
	{
		if (IsEnableOut)
		{
			CClientDC dc(this);
			m_pMapEdit->ShowShort(&dc);	
			MessageBox("确定清除路径!");
		}
		else
			MessageBox("没有出路!");

	}
	
		
}

void CMainFrame::OnAbout() 
{
	// TODO: Add your command handler code here
	CDlghelp dlg;
	dlg.DoModal();
}

⌨️ 快捷键说明

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