-
Notifications
You must be signed in to change notification settings - Fork 4
/
map-astar.cpp
73 lines (64 loc) · 1.85 KB
/
map-astar.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include "astar.h"
#include "map-astar.h"
#include <stdio.h>
void check_insert(std::set<coord>& s, const map& m, const fog_of_war& fog, const unit& u, int x, int y)
{
if(x >= 0 && y >= 0 && x < m.size_x() && y < m.size_y()) {
if(terrain_allowed(m, u, x, y)) {
int fogval = fog.get_value(x, y);
if(fogval) { // known terrain
if(fogval == 1 || m.free_spot(u.civ_id, x, y)) { // terrain visible and no enemy on it
s.insert(coord(x, y));
}
}
}
}
}
std::set<coord> map_graph(const map& m, const fog_of_war& fog, const unit& u, const coord& a)
{
std::set<coord> ret;
for(int i = -1; i <= 1; i++) {
for(int j = -1; j <= 1; j++) {
if(i || j) {
check_insert(ret, m, fog, u, a.x + i, a.y + j);
}
}
}
return ret;
}
int map_cost(const map& m, const unit& u, const coord& a, const coord& b)
{
return m.get_move_cost(u, b.x, b.y);
}
int map_heur(const coord& b, const coord& a)
{
return abs(b.x - a.x) + abs(b.y - a.y);
}
bool map_goaltest(const coord& b, const coord& a)
{
return b == a;
}
std::list<coord> map_astar(const map& m, const fog_of_war& fog, const unit& u, const coord& start, const coord& goal)
{
using boost::bind;
using boost::lambda::_1;
using boost::lambda::_2;
using boost::ref;
return astar(bind(map_graph, ref(m), ref(fog), ref(u), _1),
bind(map_cost, ref(m), ref(u), _1, _2),
bind(map_heur, ref(goal), _1),
bind(map_goaltest, ref(goal), _1), start);
}
std::list<coord> map_path_to_nearest(const map& m, const fog_of_war& fog, const unit& u, const coord& start, boost::function<bool(const coord& a)> goaltestfunc)
{
using boost::bind;
using boost::lambda::_1;
using boost::lambda::_2;
using boost::ref;
return astar(bind(map_graph, ref(m), ref(fog), ref(u), _1),
boost::lambda::constant(1),
boost::lambda::constant(0),
goaltestfunc, start);
}