实验三

实验三

一:
实验三我选择了运用堆栈的算法来实现迷宫,部分代码入下:

用于清空堆栈内数据
int size = int(this->m_stackMaze.size());
for(int i = 0 ; i<size; i++)
this->m_stackMaze.pop();
ASSERT(m_stackMaze.empty());

放入第一个数据
this->m_stackMaze.push(this->m_ptStart);
这里默认设置为
1 - 找到
0 - 无路
2 - 找到终点

用于获取当前位置,及其通往下一步的方向(0:还没有下一步,或者是下一步没有路走 退回来了)
while(!m_stackMaze.empty())
{
CPoint pCur = m_stackMaze.top();
int nCurD = this->GetCellType(pCur.y,pCur.x) ;

然后获取它下一步该走的方向
如果是第一步的 起点(-3) ,或 刚发现的点还没有下一步(0)
if(nCurD <= 0)
nCurD = MAZE_TOP;
else
{
if(this->m_b4Direction)
nCurD+=2;
else
nCurD++;
}

接着获取下一步能走的坐标
CPoint oldCurPoint = pCur;
int nRet = this->getNextValidCell(pCur.y,pCur.x,nCurD);
if( nRet == 1)
{
6.

压栈新位置信息
如果到达了终点
那这个应该是在 nRet = 2里面处理
this->m_stackMaze.push(pCur);
if(pCur == this->m_ptEnd)
{
ASSERT(FALSE);

else if( nRet == 2) //到达终点
{
if(oldCurPoint != this->m_ptStart)
this>SetMazeCellType(oldCurPoint.y,oldCurPoint.x,CMaze::MAZE_PATH + nCurD);
::SendMessage(m_hViewWnd,WM_MAZEPATH_FIND,0,0);
return true;
}
else
{
// 说明当前位置已经没有路可走了,设置为FOOTMARK,表示已经走过了但走不通
if(this>GetCellType(pCur.y,pCur.x)==CMaze::MAZE_START)
{
AfxMessageBox(_T(" There is no path to the End! "));
::SendMessage(m_hViewWnd,WM_MAZEPATH_NORESULT,0,0);
return false;
}
ASSERT(this->GetCellType(pCur.y,pCur.x)>=CMaze::MAZE_PATH);
this>SetMazeCellType(pCur.y,pCur.x,CMaze::MAZE_FOOTMARK);

然后是最后的出栈
this->m_stackMaze.pop();
if(m_bShowProcess)
{ ::SendMessage(m_hViewWnd,WM_MAZEPATH_PROCESS,WPARAM(&pCur),-1);
if(this->m_iProcessSpeed != 0)
::Sleep(m_iProcessSpeed);
}

二:
实现效果如下
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值