]> ruin.nu Git - icfp05.git/blob - botsrc/bot.h
release
[icfp05.git] / botsrc / bot.h
1 #ifndef __BOT_H__
2 #define __BOT_H__
3
4 #include <ext/hash_map>
5 #include <list>
6 #include <string>
7 #include <locale>
8 #include <map>
9 // These are needed to be able to use std::string as key in a hash_map.
10 namespace __gnu_cxx {
11         template< typename CharT, typename Traits, typename Alloc >
12                 struct hash< std::basic_string<CharT, Traits, Alloc> > {
13                         size_t operator()(const std::basic_string<CharT, Traits, Alloc>& s) const {
14
15                                 const std::collate<CharT>& c = std::use_facet< std::collate<CharT> >(std::locale());
16
17                                 return c.hash(s.c_str(), s.c_str() + s.size());
18
19                         }
20
21                 };
22
23         template< typename CharT, typename Traits, typename Alloc >
24                 struct hash< const std::basic_string<CharT, Traits, Alloc> > { //yes you need this version aswell!
25
26                         size_t operator()(const std::basic_string<CharT, Traits, Alloc>& s) const {
27
28                                 const std::collate<CharT>& c = std::use_facet< std::collate<CharT> >(std::locale());
29
30                                 return c.hash(s.c_str(), s.c_str() + s.size());
31                         }
32
33                 };
34 };
35
36 enum StreetType{foot, car, both};
37 enum PlayerType{robber, cop_foot, cop_car};
38 enum IntersectionType{hq, bank, robber_start, ordinary};
39
40 struct Intersection{
41         __gnu_cxx::hash_map<std::string,StreetType> connections;
42         IntersectionType type;
43         int x;
44         int y;
45 };
46
47 struct Player{
48         PlayerType type;
49         std::string location;
50 };
51
52 struct Bank{
53         std::string location;
54         int value;
55 };
56
57 template<class T>
58 T value(std::string input);
59
60 struct SPInfo{
61         std::string name;
62         bool settled;
63         SPInfo* parent;
64         int cost;
65 };
66
67
68 class SPGoal{
69         public:
70                 virtual ~SPGoal(){}
71                 virtual int operator()(const SPInfo* node) const = 0;
72 };
73
74 class Bot {
75         public:
76                 Bot(const std::string& name, PlayerType type);
77                 virtual ~Bot(){};
78
79                 virtual void play();
80
81         protected:
82                 void buildGraph();
83                 void updateWorld();
84                 virtual std::string turn() = 0;
85                 virtual void preGamePreparations(){};
86                 void move(std::string location);
87                 void getPlayers();
88                 std::list<std::string> shortestPath(const std::string& from, PlayerType type, const SPGoal& goal, bool reverse = false);
89
90         __gnu_cxx::hash_map<std::string, Intersection> _intersections;
91         __gnu_cxx::hash_map<std::string, Player> _players;
92         __gnu_cxx::hash_map<std::string, int> _banks;
93         std::map<int, std::string> _evidence;
94         std::map<PlayerType, std::string> _playerTypeNames;
95         std::map<std::string, PlayerType> _playerTypes;
96         std::string _name;
97         PlayerType _type;
98         std::string _location;
99         int _world;
100         int _robbed;
101         int _smell;
102 };
103
104 class SimpleSPGoal : public SPGoal{
105         std::string _to;
106         public:
107         SimpleSPGoal(std::string to);
108         int operator()(const SPInfo* node) const;
109 };
110
111 class FindPlayer : public SPGoal{
112         int _limit;
113         const __gnu_cxx::hash_map<std::string, Player>& _players;
114         PlayerType _type;
115         public:
116         FindPlayer(const __gnu_cxx::hash_map<std::string, Player>& players, PlayerType type, int limit = 0);
117         int operator()(const SPInfo* node) const;
118 };
119
120 #endif