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

📄 maper.h

📁 迷宫问题的vc源代码
💻 H
字号:
#pragma once

#include "cell.h"
//#include <stack>
using namespace std;


template<class T>
class CStack : public stack<T> 
{
public:
	T pop()
	{
		T tmp = top();
		stack<T>::pop();
		return tmp;
	}
};

class Cmaper
{
public:

	Cmaper(int row, int col, int dx, CBitmap* bitmap_pass,CBitmap* bitmap_human ):
	    m_row(row),
		m_col(col),
		m_dx(dx),
		m_CurrCell(NULL),
		m_EnterCell(NULL),
		m_ExitCell(NULL),
		m_bitmap(bitmap_pass),
		m_human(bitmap_human)
		//m_Stack()
	{
		m_cell = new CCell*[row];

		for(int i = 0; i<row; i++ )
		{
			m_cell[i] = new CCell[col];
		}
		//CStack
	}

	void DrawGrid(CDC* pDC)
	{
		CPoint pt;
		int i;
		for( i = 0, pt.x = 0 , pt.y = 0; i <= m_col; pt.x += m_dx, i++ )
		{
			pDC->MoveTo(pt);
			pDC->LineTo(pt.x, m_row * m_dx);
		}

		for( i = 0, pt.x = 0, pt.y = 0; i<= m_row; pt.y += m_dx, i++)
		{
			pDC->MoveTo(pt);
			pDC->LineTo(m_col * m_dx, pt.y);
		}
	}

	void DrawCell(CPoint& pt, CBitmap* bitmap, int flag)
	{
		//判断是否超出地图边线
		if(pt.x >= m_col * m_dx || pt.y >= m_row * m_dx)
			return;

		
		//计算Cell矩形的绘图坐标与数组坐标		
		CPoint drawPt;
		drawPt.x = pt.x - (pt.x % m_dx);
		drawPt.y = pt.y - (pt.y % m_dx);

		int x = pt.x / m_dx;
		int y = pt.y / m_dx;

		//已经设置入口,出口退出
		if ( (m_EnterCell != NULL && flag == 4) || (m_ExitCell != NULL && flag == 5) )
			return;

		//设置cell
		/*
		m_cell[x][y].SetCell(CRect(drawPt.x, drawPt.y, drawPt.x + m_dx, drawPt.y + m_dx),
							 x,
							 y,
                             flag,
							 bitmap);
		 */

		m_cell[x][y].SetCell(drawPt,
							 x,
							 y,
                             flag,
							 bitmap);

		//将cell设置为入口,出口
		if ( (m_EnterCell) && (flag != 4  && flag != 5 )) //如果入口,出口被覆盖
		{
			if(m_EnterCell->m_x == x && m_EnterCell->m_y == y)
			{
				m_EnterCell = NULL;
			}
		}
		else
		{
			if ( flag == 4)
			{
				m_EnterCell = &m_cell[x][y];//入口
				m_CurrCell = m_EnterCell;	//当前位置
			}
			if ( flag == 5)
				m_ExitCell = &m_cell[x][y];
		}
	}

	void DrawMap(CDC* pDC)
	{
		for(int i = 0; i < m_row; i++ )
		{
			for( int j = 0; j < m_col; j++)
			{
				if (m_cell[i][j].m_bitmap)
				{
					//创建内存设备场景
					CDC MemDC;
					MemDC.CreateCompatibleDC(pDC);
					//将位图选如内存设备场景
					CBitmap *pOldBmp = MemDC.SelectObject(m_cell[i][j].m_bitmap);
					pDC->BitBlt(m_cell[i][j].m_pt.x,
							    m_cell[i][j].m_pt.y,
								m_dx,
								m_dx,
								&MemDC, 0, 0, SRCCOPY);
					//还原内存设备场景
					MemDC.SelectObject(pOldBmp);
					MemDC.DeleteDC();
				}
			}
		}
	}

	//将有效cell压栈
	void pushUnvisited(int row, int col)
	{
		
		if( ((row < m_row && row >= 0) && (col < m_col && col >= 0)) &&
			(m_cell[row][col].m_flag == 0 || m_cell[row][col].m_flag == 5) )
		{
			m_Stack.push(&m_cell[row][col]);
		}
	}

	//走出迷宫
	int ExitMaze()
	{
		int row,col;
		if (!m_EnterCell)
			return 3;    //没有入口
		if (!m_ExitCell)
			return 4;    //没有出口
		
		if (m_CurrCell == m_ExitCell)
			return 1;                //走出迷宫
		row = m_CurrCell->m_x;
		col = m_CurrCell->m_y;
        
		//将已经走过的点做标记
		if( !(m_CurrCell == m_EnterCell) )
		{
			m_cell[row][col].m_flag = 1;
			m_cell[row][col].m_bitmap = m_bitmap;
		}

		//压栈四周的点
		pushUnvisited(row-1,col);
		pushUnvisited(row+1,col);
		pushUnvisited(row,col-1);
		pushUnvisited(row,col+1);

		//判断栈是不为空
		if(m_Stack.empty())
			return 0;		    //失败
		else
			m_CurrCell = m_Stack.pop();
		m_CurrCell->m_bitmap = m_human; 
		return 2;				//未完
		
	}

	void clear()
	{
		for(int i = 0; i < m_row; i++ )
		{
			for( int j = 0; j < m_col; j++)
			{
				m_cell[i][j].m_bitmap = NULL;				
			}
		}
		m_CurrCell = NULL;  //当前位置
	    m_EnterCell = NULL;	//入口
	    m_ExitCell = NULL;  //出口

	}

	~Cmaper(void)
	{
		for(int i = 0; i< m_row; i++ )
		{
			delete []m_cell[i];
		}
		delete []m_cell;
	}

private:
	int m_row,m_col;    //行,列
	int m_dx;           // x,y增量, 设定正方型
	CCell** m_cell;
	CCell* m_CurrCell;  //当前位置
	CCell* m_EnterCell;	//入口
	CCell* m_ExitCell;  //出口
	CBitmap* m_bitmap;  //已经走过的图片
	CBitmap* m_human;
	CStack<CCell*> m_Stack;
};

⌨️ 快捷键说明

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