#include "micropather.h"
#include <ctype.h>
#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <vector>
#include <iostream>
#include "micropather.h"
using namespace micropather;
//地图的长宽;
//x为列号,y为行号;
const int MAPX = 10;
const int MAPY = 10;
const int gMap[MAPX * MAPY + 1] =
{
0, 0, 0, 1, 1, 1, 0, 0, 0, 1,
1, 0, 1, 0, 1, 1, 0, 0, 1, 1,
0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 0, 0, 1, 0, 1, 0, 1, 0,
0, 0, 0, 0, 0, 1, 1, 1, 0, 0,
1, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1, 1, 0, 0, 0, 1, 0, 0, 0, 1,
0, 0, 0, 1, 0, 0, 0, 1, 0, 0
};
class AStar : public Graph
{
private:
AStar(const AStar& );
void operator = (const AStar& );
int playerX, playerY;
std::vector<void*> path;
MicroPather* pather;
public:
AStar() : pather ( 0 )
{
pather = new MicroPather(this);
}
virtual ~AStar()
{
delete pather;
}
int X() { return playerX; }
int Y() { return playerY; }
unsigned Checksum()
{
pather->Checksum();
}
void ClearPath()
{
path.resize( 0 );
}
int Passable(int nx, int ny)
{
if( nx >= 0 && nx <MAPX && ny >= 0 && ny <MAPY)
{
int index = ny * MAPX + nx;
int c = gMap[index];
if ( c == 0)
return 1; //可通行;
}
return 0; //不可通行;
}
void SetStartPos(int x, int y)
{
playerX = x;
playerY = y;
}
int SetEndPos(int nx, int ny)
{
int result = 0;
if(Passable(nx, ny) == 1)
{
float totalCost;
result = pather->Solve(XYToNode(playerX, playerY), XYToNode(nx, ny), &path, &totalCost);
if(result == MicroPather::SOLVED)
{
playerX = nx;
playerY = ny;
}
}
return result;
}
//把索引号转化为XY坐标;
void NodeToXY(void *node, int *x, int *y)
{
int index = (int)node;
*y = index / MAPX;
*x = index - *y * MAPX;
}
//把XY坐标转化为索引号;
void* XYToNode(int x, int y)
{
return (void*)(y * MAPX + 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[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
//const int dy[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };
//const float cost[8] = { 1.0f, 1.41f, 1.0f, 1.41f, 1.0f, 1.41f, 1.0f, 1.41f };
//上下左右四个方向;
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[i];
int ny = y + dy[i];
//是否可行;
int pass = Passable(nx, ny);
if(pass == 1)
{
StateCost nodeCost = {XYToNode(nx, ny), cost[i]};
neighbors->push_back(nodeCost);
}
}
}
virtual void PrintStateInfo(void *node)
{
int x, y;
NodeToXY(node, &x, &y);
printf("(%d, %d)\n", y, x);
}
void Print()
{
unsigned size = path.size();
for(unsigned k = 0; k < size; ++k)
{
PrintStateInfo(path[k]);
}
}
};
int main()
{
AStar astar;
astar.SetStartPos(2, 2);
astar.SetEndPos(4, 6);
astar.Print();
system("pause");
return 0;
}