📄 maper.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 + -