有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 1077|回复: 11
收起左侧

简单的自动寻路实现(真的超简单哦~)

[复制链接]

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
发表于 2013-4-20 10:32:55 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
本帖最后由 dxxds 于 2013-4-21 07:27 编辑

最近想写个战棋游戏(本人酷爱战棋)
所以先赶紧撸了一个自动寻路的代码
有兴趣的就看吧

#include "micropather.h"
#include <stdio.h>  
#include <math.h>   
#include <windows.h>

using namespace micropather;  

//地图的长宽 x是列,y是行;  

#define X_MAP 15  
#define Y_MAP 10  
const int g_map[X_MAP * Y_MAP + 1] =
{   
    0,0,1,1,1,0,0,0,1,1,0,0,1,0,1,
    0,1,0,0,0,0,0,1,1,0,0,0,0,0,1,
    0,0,1,0,1,1,0,0,0,1,1,0,1,0,1,
    1,0,1,0,0,0,1,1,0,1,1,0,0,0,1,
    1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
    0,0,0,1,0,1,0,1,1,0,1,1,1,0,1,
    0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,
    0,0,0,1,1,1,1,1,0,0,1,0,1,0,1,
    1,0,0,0,1,0,0,0,1,0,1,0,1,1,1,
    0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,
};

//可以试着改变上面的地图看实际效果

void gotoxy(int x,int y)
{        
   COORD point;
   point.X=x;point.Y=y;
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
}

class Cway_find : public Graph  
{  
private:  
   Cway_find(const Cway_find& );  
   void operator = (const Cway_find& );  
   MicroPather* m_pather;
   int plr_x, plr_y;  
   std::vector<void*> m_path;  

public:  
   Cway_find() : m_pather ( 0 )  
   {  
          m_pather = new MicroPather(this);  
   }  

   virtual ~Cway_find()  
   {  
          delete m_pather;  
   }  

   int X() { return plr_x; }  
   int Y() { return plr_y; }  

   unsigned Checksum()  
   {  
          m_pather->Checksum();  
   }  

   void ClearPath()  
   {  
          m_path.resize( 0 );  
   }  

   int Passable(int nx, int ny)  
   {  
          if( nx >= 0 && nx <X_MAP && ny >= 0 && ny <Y_MAP)  
          {  
                 int index = ny * X_MAP + nx;  
                 int c = g_map[index];  
                 if ( c == 0)  
                        return 1;      //可通行;  
          }  
          return 0;             //不可通行;  
   }  

   void SetStartPos(int x, int y)
   {
          plr_x = x;
          plr_y = y;
   }

   int SetEndPos(int nx, int ny)  
   {  
          int result = 0;  
          if(Passable(nx, ny) == 1)  
          {  
                 float totalCost;  
                 result = m_pather->Solve(XYToNode(plr_x, plr_y), XYToNode(nx, ny), &m_path, &totalCost);  
                 if(result == MicroPather::SOLVED)  
                 {  
                        plr_x = nx;  
                        plr_y = ny;  
                 }  
          }  
          return result;  
   }  

   //把索引号转化为XY坐标;  
   void NodeToXY(void *node, int *x, int *y)  
   {  
          int index = (int)node;  
          *y = index / X_MAP;  
          *x = index - *y * X_MAP;  
   }  

   //把XY坐标转化为索引号;  
   void* XYToNode(int x, int y)  
   {  
          return (void*)(y * X_MAP + x);  
   }  

   //最小代价估计函数,求A*算法中的h值;  
   virtual float LeastCostEstimate(void *nodeStart, void *nodeEnd)  
   {  
          int xStart, yStart, xEnd, yEnd;  
          NodeToXY(nodeStart, &xStart, &yStart);  
          NodeToXY(nodeEnd, &xEnd, &yEnd);  

          int dx = xStart - xEnd;  
          int dy = yStart - yEnd;  
          return (float)sqrt((double)(dx * dx) + (double)(dy * dy));  
   }  

   virtual void AdjacentCost(void *node, std::vector<StateCost> *neighbors)  
   {  
          int x, y;  

          //上下左右四个方向;  
          const int dx[4] = {1, 0, -1, 0};  //4个方向上的x的变化;
          const int dy[4] = {0, -1, 0, 1};  //4个方向上的y的变化;
          const float cost[4] = {1.0f, 1.0f, 1.0f, 1.0f};  

          NodeToXY(node, &x, &y);  

          for(int i = 0; i < 4; ++i)  
          {  
                 int nx = x + dx;  
                 int ny = y + dy;  
                 //是否可行;
                 int pass = Passable(nx, ny);  
                 if(pass == 1)  
                 {  
                        StateCost nodeCost = {XYToNode(nx, ny), cost};  
                        neighbors->push_back(nodeCost);
                 }  
          }  
   }  

   virtual void PrintStateInfo(void *node)  
   {  
          int x, y;  
          NodeToXY(node, &x, &y);
          system("pause>nul");
          gotoxy(x*2,y);
          printf("☆");
          gotoxy(0,12);
          printf("(%d,%d)",x,y);
   }  

   void Print()  
   {  
          unsigned size = m_path.size();
          int sum = X_MAP*Y_MAP;
          for (int i=0;i<sum;++i)
          {
                 if(i>1 && (i)%X_MAP==0)

                        printf("\n");
                 if(g_map==0)
                        printf("  ");
                 if (g_map==1)
                        printf("■");
          }
          for(unsigned k = 0; k < size; ++k)  
          {  
                 PrintStateInfo(m_path[k]);  
          }
   }  
};  

int main()  
{  
   Cway_find Cway_find;  
   Cway_find.SetStartPos(0, 0);
   Cway_find.SetEndPos(14, 9);  
   Cway_find.Print();  
   gotoxy(0,12);
   printf("到终点 10 秒后自动关闭程序");
   Sleep(10000);
   return 0;
}

VS2008编译通过

以下是头文件下载链接


http://ishare.iask.sina.com.cn/f/36797563.html

评分

参与人数 1宅魂 +1 宅币 +1 收起 理由
月夜猫妖 + 1 + 1 o(* ̄▽ ̄*)ブ 发糖

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

签到天数: 14 天

连续签到: 1 天

[LV.3]偶尔看看II

2

主题

19

好友

2541

积分

Continue

积分
2541

Free|七濑遥

发表于 2013-4-20 12:34:01 | 显示全部楼层
战旗是陆战棋?
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

14

好友

3071

积分

序章

积分
3071
发表于 2013-4-20 12:59:24 | 显示全部楼层
好像很不错、
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

29

主题

54

好友

1万

积分

懒人

尔等还不速速跪下~

积分
11600
发表于 2013-4-20 14:43:55 | 显示全部楼层
深搜的应用。
你其实可以做成桌面程序玩,然后自动生成这个map随机地图,这样的话,新手也更有兴趣学习。

点评

=A=尼酱!!  发表于 2013-4-20 14:45
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
 楼主| 发表于 2013-4-21 00:08:31 | 显示全部楼层

也不错,有空我做做吧

这个代码确实看起来太临时了
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
 楼主| 发表于 2013-4-21 07:28:14 | 显示全部楼层
晓♠晨 发表于 2013-4-20 12:34
战旗是陆战棋?

是战棋类游戏
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

5

好友

2555

积分

Continue

积分
2555
发表于 2013-4-21 18:28:40 | 显示全部楼层
跟风发一个gcc版本a*最优路径搜索的~

astar-algorithm-cpp-master.zip

18.39 KB, 下载次数: 0, 下载积分: 宅币 -50 枚, 活跃 1 ℃

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

2

好友

4933

积分

序章

积分
4933
发表于 2013-4-22 16:06:43 来自手机 | 显示全部楼层
咩……目标我的项目神马的可以借鉴……留爪
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

11

好友

2485

积分

Continue

积分
2485
发表于 2013-4-28 21:59:40 | 显示全部楼层
你告诉我他有多少行!!!
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 824 天

连续签到: 1 天

[LV.10]以坛为家III

5

主题

24

好友

6万

积分

第三章

积分
68367
发表于 2013-5-1 16:42:33 | 显示全部楼层
话说你这个程序的做法让我觉得和ACM的最优路线出迷宫的一些做法很像~~诶诶~LZ加油吧
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

37

好友

1万

积分

第一章

积分
18487
发表于 2013-5-2 22:02:28 | 显示全部楼层
DFS吧。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 5 天

连续签到: 1 天

[LV.2]偶尔看看I

30

主题

20

好友

1万

积分

第一章

积分
10307
发表于 2013-8-21 21:51:00 | 显示全部楼层
恩恩,蛮好的,只是看完好废力啊,这么长的代码,没深厚的功力是不行的
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(基宅) ( 粤ICP备18082987号-1 | 浙公网安备 33010902001746号 )

GMT+8, 2024-5-6 17:01 , Processed in 0.240431 second(s), 32 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表