青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

   C++ 技術(shù)中心

   :: 首頁 :: 聯(lián)系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發(fā)表的原創(chuàng)文章,作者保留一切權(quán)利。必須經(jīng)過作者本人同意后方可轉(zhuǎn)載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新隨筆

最新評論

評論排行榜

#ifndef _ASTAR_FLY_H__
#define _ASTAR_FLY_H__
#include "Coordinate.h"
#include <map>
#include <set>

using namespace std;



typedef struct 
{
    int x;
    int y;
    int f; // f = g + h
    int g;
    int h;

    void Init(int _x,int _y)
    {
        f = 0;
        g = 0;
        h = 0;
        x = _x;
        y = _y;
    }
} APoint, *PAPoint;



class CAStarFly
{
public:
    typedef std::list<CIntPoint> PosList;


    CAStarFly();
    ~CAStarFly();

    bool CalcPath(PosList& pathList, const CIntPoint& from, const CIntPoint& to);
protected:
    virtual int GetMapWidth();
    virtual int GetMapHeight();
    virtual CIntSize GetRoleSize();
    virtual bool GetNearPos(int curX,int curY,PosList &nearPos);
    virtual bool IsCanFly(int x,int y);
    virtual void OnAddBestPoint(int x, int y);
    virtual void OnUnAddBestPoint(int x, int y);
private:
    PAPoint CalcNextPoint(PosList& pathList, PAPoint ptCalc); // 應(yīng)用遞歸的辦法進(jìn)行查詢

    void SetStartPoint(int x, int y);
    void SetEndPoint(int x, int y);
    void SetOpened(int x, int y);
    void SetClosed(int x, int y);
    void SetCurrent(int x, int y);

    int32 GetPosIndex(int x, int y);
    int32 GetFValue(const CIntPoint &pos);
    bool IsNotClosePos(int x, int y);
private:
    APoint m_startPoint; //起始點(diǎn)
    APoint m_endPoint;   //結(jié)束點(diǎn)
    APoint m_curPoint;   //當(dāng)前移到點(diǎn)
    set<int32> m_setClosePos;
    int m_curGValue;     //當(dāng)前G值
};

#endif/*_ASTAR_FLY_H__*/



#include "stdafx.h"
#include "AStarFly.h"


CAStarFly::CAStarFly()
{
}

CAStarFly::~CAStarFly()
{
}

bool CAStarFly::CalcPath(PosList& pathList, const CIntPoint& from, const CIntPoint& to)
{
    //1.先設(shè)置開始與目標(biāo)
    SetStartPoint(from.x, from.y);
    SetEndPoint(to.x, to.y);
    m_curPoint = m_startPoint;
    SetClosed(m_startPoint.x, m_startPoint.y); //路徑搜索不再經(jīng)過
    m_curGValue = 0;

    //從起點(diǎn)開始計(jì)算路徑點(diǎn)
    return CalcNextPoint(pathList, nullptr)!=nullptr;
}

PAPoint CAStarFly::CalcNextPoint(PosList& pathList, PAPoint ptCalc)
{
    if (nullptr == ptCalc)
    {
        ptCalc = &m_startPoint;
    }
    int curX = ptCalc->x;
    int curY = ptCalc->y;
    int destX = m_endPoint.x;
    int destY = m_endPoint.y;

    //判斷是否已經(jīng)到了最終位置
    if ((curX == destX && abs(curY - destY) == 1) || (curY == destY && abs(curX - destX) == 1))
    {
        pathList.push_back(CIntPoint(m_endPoint.x, m_endPoint.y));
        OnAddBestPoint(m_endPoint.x, m_endPoint.y);
        return &m_endPoint;
    }

    // 最優(yōu)步驟的坐標(biāo)和值
    int xmin = curX;
    int ymin = curY;
    int fmin = 0;

    //獲得當(dāng)前周邊點(diǎn)的的坐標(biāo)
    PosList nearPos;
    if (GetNearPos(curX,curY,nearPos) == false)
    {
        return nullptr;
    }

    //刪除不能飛的區(qū)塊
    
//找出最優(yōu)f值
    for (auto itPos : nearPos)
    {
        int fValue = GetFValue(itPos);
        if (fmin == 0 || fValue<fmin)
        {
            fmin = fValue;
            xmin = itPos.x;
            ymin = itPos.y;
        }
    }

    if (fmin > 0)
    {
        SetCurrent(xmin, ymin);
        SetClosed(xmin, ymin); //路徑搜索不再經(jīng)過
        pathList.push_back(CIntPoint(xmin,ymin));
        OnAddBestPoint(xmin, ymin);
        PAPoint pAPoint= CalcNextPoint(pathList,&m_curPoint);
        if (nullptr == pAPoint)
        {
            SetCurrent(curX, curY);
            SetClosed(xmin, ymin); //路徑搜索不再經(jīng)過

            
//將最后一次入的隊(duì)刪除
            pathList.pop_back();
            OnUnAddBestPoint(xmin, ymin);
            return CalcNextPoint(pathList, &m_curPoint);
        }

        return pAPoint;
    }
    

    return nullptr;
}

CIntSize CAStarFly::GetRoleSize()
{
    return CIntSize(1,1);
}

int CAStarFly::GetMapWidth()
{
    return -1;
}

int CAStarFly::GetMapHeight()
{
    return -1;
}

void CAStarFly::SetStartPoint(int x, int y)
{
    m_startPoint.Init( x,y);
}

void CAStarFly::SetEndPoint(int x, int y)
{
    m_endPoint.Init(x,y);
}


void CAStarFly::SetClosed(int x, int y)
{
    m_setClosePos.insert(GetPosIndex(x,y));
}

void CAStarFly::SetCurrent(int x, int y)
{
    m_curPoint.Init( x, y);
}

int32 CAStarFly::GetPosIndex(int x,int y)
{
    return  y * GetMapWidth() + x;
}


bool CAStarFly::GetNearPos(int curX, int curY, PosList &nearPos)
{
    int newX;
    int newY;
    //1.上
    if (curY > 0)
    {
        newX = curX;
        newY = curY - 1;

        if (IsNotClosePos(newX, newY) && IsCanFly(newX, newY))
        {
            nearPos.push_back(CIntPoint(newX, newY));
        }
    }
    
     
    


    //3.左
    if (curX > 0)
    {
        newX = curX - 1;
        newY = curY;

        if (IsNotClosePos(newX, newY) && IsCanFly(newX, newY))
        {
            nearPos.push_back(CIntPoint(newX, newY));
        }
    }
    

    //4.右
    if (curX < GetMapWidth())
    {
        newX = curX + 1;
        newY = curY;

        if (IsNotClosePos(newX, newY) && IsCanFly(newX, newY))
        {
            nearPos.push_back(CIntPoint(newX, newY));
        }
    }
    
    //2.下
    if (curY < GetMapHeight())
    {
        newX = curX;
        newY = curY + 1;

        if (IsNotClosePos(newX, newY) && IsCanFly(newX, newY))
        {
            nearPos.push_back(CIntPoint(newX, newY));
        }
    }
    return nearPos.size()>0;
}

bool CAStarFly::IsCanFly(int x, int y)
{
    return true;
}

int32 CAStarFly::GetFValue(const CIntPoint &pos)
{
    int xDis = abs(pos.x - m_endPoint.x)*100;
    int yDis = abs(pos.y - m_endPoint.y)*100;
    return m_curGValue +  (int32)sqrt(xDis*xDis + yDis*yDis);
}



bool CAStarFly::IsNotClosePos(int x, int y)
{
    return m_setClosePos.find(GetPosIndex(x, y)) == m_setClosePos.end();
}

void CAStarFly::OnAddBestPoint(int x, int y)
{
    m_curGValue += 100;
}

void CAStarFly::OnUnAddBestPoint(int x, int y)
{
    m_curGValue -= 100;
}


#include "AStarFly.h"
#include <memory>

class CNewMap;

class CMobAStarFly : public CAStarFly
{
public:
    static CMobAStarFly& GetInstance();
    bool FindPath(const std::shared_ptr<CNewMap>& pMap, const CIntPoint& from, const CIntPoint& to, CAStarFly::PosList& pathList, const CIntSize& roleSize = CIntSize(1, 1));
    void setpath(int x, int y);
    void show();

    virtual int GetMapWidth() override;
    virtual int GetMapHeight() override;
    virtual CIntSize GetRoleSize() override;
    virtual bool IsCanFly(int x, int y) override;
    void OnAddBestPoint(int x, int y) override;
    void OnUnAddBestPoint(int x, int y) override;
private:
    weak_ptr<CNewMap> m_pNewMap;
    CIntSize m_roleSize;
};



#include "stdafx.h"
#include "MobFlyAStar.h"
#include "NewMap.h"

CMobAStarFly& CMobAStarFly::GetInstance()
{
    static CMobAStarFly s_Instance;
    return s_Instance;
}

bool CMobAStarFly::FindPath(const std::shared_ptr<CNewMap>& pMap, const CIntPoint& from, const CIntPoint& to, CAStarFly::PosList& pathList, const CIntSize& roleSize)
{
    m_pNewMap = pMap;
    m_roleSize = roleSize;

    return CalcPath(pathList, from, to);
}

int CMobAStarFly::GetMapWidth()
{
    if (m_pNewMap.lock() == nullptr)
        return 0;

    return m_pNewMap.lock()->GetWidth();
}

int CMobAStarFly::GetMapHeight()
{
    if (m_pNewMap.lock() == nullptr)
        return 0;

    return m_pNewMap.lock()->GetHeight();
}

CIntSize CMobAStarFly::GetRoleSize()
{
    return m_roleSize;
}

bool CMobAStarFly::IsCanFly(int x, int y)
{
    for (int w = 0; w < m_roleSize.width; ++w)
    {
        for (int h = 0; h < m_roleSize.height; ++h)
        {
            if (m_pNewMap.lock()->IsPosBlock(m_pNewMap.lock()->PosToWorldX(x + w), m_pNewMap.lock()->PosToWorldY(y - h)))    {
                return false;
            }
        }
    }

    return true;
}

void CMobAStarFly::setpath(int x, int y)
{
    
}

void CMobAStarFly::show()
{

}

void CMobAStarFly::OnAddBestPoint(int x, int y)
{

}

void CMobAStarFly::OnUnAddBestPoint(int x, int y)
{

}
posted on 2017-08-17 14:43 C++技術(shù)中心 閱讀(1491) 評論(1)  編輯 收藏 引用 所屬分類: 游戲開發(fā)

Feedback

# re: A*算法實(shí)現(xiàn) 2020-08-26 14:42 放屁阿狗
我也寫了個(gè)astar 演示程序
http://wallizard.com/eric/astar/  回復(fù)  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            麻豆国产va免费精品高清在线| 久久精品99国产精品日本| 久久久久国产一区二区| 亚洲欧美视频| 国产综合色产在线精品| 久久精品国产免费| 久久精品欧美日韩| 国产精品久久久久久妇女6080| 国产日韩欧美另类| 艳妇臀荡乳欲伦亚洲一区| 亚洲三级免费| 国产精品一区二区久久国产| 久久天天综合| 欧美成人午夜激情视频| 亚洲欧美日韩另类| 亚洲狠狠丁香婷婷综合久久久| 一卡二卡3卡四卡高清精品视频 | 欧美精品网站| 这里是久久伊人| 欧美亚洲一区| 亚洲精品1234| 亚洲专区一二三| 在线观看国产欧美| 亚洲精品在线一区二区| 国产精品久久久久久影视| 久久久噜噜噜| 欧美日韩国产在线观看| 久久久精品视频成人| 欧美精品一区二区在线观看| 亚洲欧美激情在线视频| 久久免费少妇高潮久久精品99| 国产视频一区欧美| 欧美激情性爽国产精品17p| 国产精品扒开腿做爽爽爽软件| 亚洲精选在线| 亚洲国产精品一区二区第四页av| 久久精品亚洲一区二区三区浴池| 国产精品一区二区在线观看不卡| 一本大道久久a久久综合婷婷 | 亚洲一卡二卡三卡四卡五卡| 欧美一区二区三区视频在线| 国产精品午夜电影| 亚洲激情欧美激情| 狠狠干狠狠久久| 亚洲天堂第二页| 99综合精品| 另类春色校园亚洲| 久久精品视频播放| 国产精品久久影院| 亚洲另类在线一区| 日韩香蕉视频| 免费成人av在线看| 久久亚洲捆绑美女| 国内精品久久久久久久影视麻豆| 久久一区亚洲| 国产乱理伦片在线观看夜一区| 欧美亚洲在线| 欧美日韩一卡二卡| 亚洲人体大胆视频| 亚洲美女淫视频| 欧美激情导航| 亚洲国产三级在线| 亚洲欧洲在线观看| 欧美成人免费观看| 欧美激情女人20p| 亚洲第一天堂av| 蜜桃视频一区| 亚洲国产精品日韩| 国产精品一区二区欧美| 久久久精品网| 国模套图日韩精品一区二区| 久久国产高清| 欧美1区视频| 国产一区在线看| 麻豆精品在线播放| 精品999久久久| 久久综合激情| 91久久久亚洲精品| 一本色道久久综合亚洲二区三区| 日韩视频不卡| 亚洲欧美在线视频观看| 国产精品在线看| 久久久精品免费视频| 欧美/亚洲一区| 99精品99| 国产精品一区二区三区四区 | 亚洲日本成人女熟在线观看| 久久一区欧美| 亚洲精品一区二区在线| 午夜精品国产精品大乳美女| 国产在线麻豆精品观看| 久久久av毛片精品| 亚洲精品久久视频| 欧美主播一区二区三区美女 久久精品人 | 国产精品99久久久久久久久久久久| 国产一区清纯| 女人色偷偷aa久久天堂| 亚洲精品中文字幕女同| 亚洲第一狼人社区| 欧美三级资源在线| 久久av一区二区三区亚洲| 欧美黄色影院| 欧美一区二区免费| 国产精品午夜久久| 麻豆国产精品777777在线| 久久国产视频网站| 亚洲美女网站| 国语自产在线不卡| 欧美专区亚洲专区| 久久久精品免费视频| 亚洲免费不卡| 国语自产精品视频在线看8查询8 | 亚洲精品一区二区三区婷婷月 | 国产农村妇女毛片精品久久麻豆| 亚洲日本理论电影| 久久久久久一区| 国产日韩欧美自拍| 欧美剧在线免费观看网站| 午夜久久久久| av成人老司机| 欧美激情精品久久久久久蜜臀| 韩国av一区二区三区四区| 欧美激情免费观看| 久久久久久久999精品视频| 一区二区三区.www| 亚洲欧洲午夜| 亚洲国产精品久久久久婷婷884 | 午夜精品成人在线| 亚洲欧洲在线一区| 欧美国产在线电影| 欧美**字幕| 久久亚洲综合色一区二区三区| 亚洲二区免费| 国内精品久久久久影院色| 国产精品成人观看视频免费| 欧美紧缚bdsm在线视频| 牛牛精品成人免费视频| 久久深夜福利免费观看| 欧美一区二区三区久久精品 | 性欧美18~19sex高清播放| 国产精品三级久久久久久电影| 性欧美激情精品| 亚洲愉拍自拍另类高清精品| 一片黄亚洲嫩模| 一区二区三区欧美| 一本色道久久综合一区| 一本久道综合久久精品| 在线午夜精品自拍| 中文欧美字幕免费| 亚洲一区二区三区视频| 欧美国产第一页| 亚洲国产美国国产综合一区二区| 亚洲欧美日韩精品久久久| 在线色欧美三级视频| 今天的高清视频免费播放成人| 欧美精品一区二区三区四区| 欧美精品久久久久久| 欧美三级韩国三级日本三斤| 欧美日韩在线播放三区四区| 久久成人精品视频| 久久久久久久精| 欧美国产精品劲爆| 欧美天堂在线观看| 国产欧美日韩专区发布| 黄色另类av| 日韩视频亚洲视频| 亚洲制服欧美中文字幕中文字幕| 在线欧美小视频| 日韩一级片网址| 亚洲欧美成人| 久久青草福利网站| 亚洲国产清纯| 国产精品99久久久久久久女警 | 亚洲欧洲三级| 亚洲主播在线观看| 久久精品免费| 欧美日本国产在线| 国产精自产拍久久久久久| 亚洲二区在线观看| 亚洲专区一区| 免费久久99精品国产自在现线| 久久大逼视频| 亚洲国产精品激情在线观看| 亚洲视频播放| 欧美成人免费大片| 国产情人综合久久777777| 亚洲国产欧洲综合997久久| 亚洲欧美国产精品桃花| 中文亚洲欧美| 欧美~级网站不卡| 亚洲桃花岛网站| 欧美国产日韩一区二区在线观看| 麻豆视频一区二区| 国产精品人人做人人爽人人添| 欧美亚一区二区| 亚洲高清资源综合久久精品| 亚洲综合精品自拍| 亚洲国产精品尤物yw在线观看 | 久久av一区二区三区漫画| 亚洲特黄一级片|