--- /dev/null
+#ifndef CONTROLLER_H
+#define CONTROLLER_H
+
+#include "stratego.h"
+#include <string>
+
+/**
+ * Class to control a player for Stratego
+ * Abstract base class
+ */
+
+class Controller
+{
+ public:
+ Controller(const Piece::Colour & newColour, const char * newName = "no-name") : colour(newColour), name(newName) {}
+ virtual ~Controller() {}
+
+ MovementResult Setup(const char * opponentName);
+
+ MovementResult MakeMove(std::string & buffer);
+
+ virtual bool HumanController() const {return false;} //Hacky... overrides in human_controller... avoids having to use run time type info
+
+ void Message(const std::string & buffer) {Message(buffer.c_str());}
+ virtual void Message(const char * string) = 0;
+
+ virtual MovementResult QuerySetup(const char * opponentName, std::string setup[]) = 0;
+ virtual MovementResult QueryMove(std::string & buffer) = 0;
+ virtual bool Valid() const {return true;}
+
+ const Piece::Colour colour;
+
+ std::string name;
+
+
+};
+
+
+
+
+
+#endif //CONTROLLER_H
+
+