(Object) -IsA- (GridObject) -IsA- (Gold, MovingObject, Pit)
(MovingObject) -IsA- (Actor, Arrow)
(Actor) -IsA- (Wumpus, Agent)
(Agent) -friend- (Player)
class Object
{
public:
Object ( ObjectType objectType=NULL_OBJECT );
virtual ~Object() {};
virtual void reset();
virtual void update() = 0;
virtual void done();
virtual void display() const = 0;
virtual int getScore() const { return score; };
virtual void printScore() const = 0;
virtual void updateStats() = 0;
virtual void printStats() = 0;
virtual void write(ofstream &) const {};
virtual void linkToEnv ( Environment *envPtr );
int isA ( ObjectType objectType ) const;
ObjectType isA() const;
protected:
ObjectType type;
int score;
Environment *env;
SampleStatistic stats;
};
(Environment) -IsA- (GridEnvir.) -IsA- (WumpusEnvir.)
class Environment
{
public:
Environment();
virtual ~Environment();
virtual void addObject ( Object* );
virtual int stillRunning() = 0;
virtual void reset();
virtual void done();
virtual void trials ( int numTrials, int maxSteps );
virtual void run ( int maxSteps );
virtual void preUpdate() {};
virtual void postUpdate() {};
virtual void updateStats();
virtual void step();
virtual void display() = 0;
virtual void displayScores();
virtual void displayStats();
protected:
ObjectPtrSLList objectList;
int numSteps;
};
main ( int argc, char **argv )
{
...
WumpusEnvironment *env;
...
env = new WumpusEnvironment ( size );
...
env->trials ( trials, MaxSteps );
...
}
void Environment::trials ( int numTrials, int maxSteps
)
{
int i;
for ( i=0; i<numTrials; i++ ) {
cout << endl << endl
cout << "Trial " << i << ":" << endl << endl;
run ( maxSteps );
updateStats();
}
displayStats();
}
void Environment::run ( int maxSteps )
{
numSteps = 0;
reset();
cout << "Initial:" << endl;
display();
for ( numSteps=0;
stillRunning() && numSteps<maxSteps;
numSteps++ ) {
step();
}
done();
cout << "Final:" << endl;
display();
displayScores();
}
void Environment::reset()
{
Pix o;
for ( o=objectList.first(); o; objectList.next(o) )
objectList(o)->reset();
}
void Environment::done()
{
Pix o;
for ( o=objectList.first(); o; objectList.next(o) )
objectList(o)->done();
}
void Environment::step()
{
cout << "Step " << numSteps << ":" << endl;
preUpdate();
Pix o;
for ( o = objectList.first(); o; objectList.next(o) )
objectList(o)->update();
postUpdate();
}
class Player
{
friend Agent;
public:
Player();
virtual ~Player();
// For use by subclasses
virtual void reset();
virtual const Action process ( const Percept &percept )
= 0;
virtual void done();
virtual ActorState getState() const;
virtual int numGold() const;
virtual int numArrows() const;
virtual int getScore() const;
// Interfacing with Simulation
virtual void linkToAgent ( Agent *agentPtr );
virtual const Action think ( const Percept &percept );
virtual void preProcess ( const Percept &percept );
virtual void postProcess ( const Action action );
protected:
PerceptDLList perceptList;
ActionDLList actionList;
private:
Agent *agent;
static Player *player;
};
addObject ( new Agent ( "The Agent", 0, 0,
RIGHT, 1 ) );
for ( o = objectList.first(); o; objectList.next(o) )
objectList(o)->update();
void Agent::update()
{
if ( state == ALIVE )
{
Percept percept = look();
Action action = think( percept );
act( action );
}
}
Action Agent::think ( const Percept &percept )
{
return Player::player->think ( percept );
}
const Action Player::think ( const Percept &percept )
{
preProcess ( percept );
const Action action = process ( percept );
postProcess ( action );
return action;
}
{ ...
};
static MyPlayer myPlayer;