
#ifndef AGENT__
#define AGENT__

#include <string>
using std::string;

// -----------------------------------------------------------
//				class Agent
// -----------------------------------------------------------
class Environment;
class Agent
{
public:
	Agent():bump_(false), dirty_(false), x(10), y(10), now(1), pos(2), status("NULL"), count(0), stage(1), stageNow(1)
	{
		//將MAP整張地圖設為 '-' 牆壁 
		for(int i = 0; i < 20; i++)
			for(int j = 0; j < 20; j++)
				MAP[i][j] = '-';

		//將動作暫存的array初始為'N'o action
		for(int i = 0; i < 2000; i++)
			ACT[i] = 'N';
			
		//將動作暫存的第一格設為'I'nitial 分辨區分DFS走回起點 
		ACT[0] = 'I'; 
		
		//將巡迴地圖的array初始為 'I'nitial
		for(int i = 0; i < 10000; i++) stageACT[i] = 'I';
		
		//走過的座標position[0] = x, position[1] = y 
		for(int i = 0; i < 4000; i++) position[i] = 0;	
	}
	
	//設定 建立地圖時的上下左右x y判斷 
	string Up();
	string Down();
	string Left();
	string Right();
	
	//記錄agent的每一個步驟 
	void record(string temp);	
		
	enum ActionType { actUP, actDOWN, actLEFT, actRIGHT, actIDLE, actSUCK };
	void Perceive(const Environment &env);
	ActionType Think();	
	
private:
	bool bump_,
		 dirty_;
	int x, y, now, pos, stageNow;//建立地圖MAP的(x, y)
	                             //now, pos:用來記錄ACT和position的指標 
	                             //stageNow:用來記錄stageACT 的指標
	string status;//看目前是要走哪一步 
	char MAP[20][20];//'W'為WALL 'R'為ROAD 'U'為Unknown 
	char ACT[2000];//'U'為UP 'D'為DOWN 'L'為LEFT 'R'為RIGHT 'I'為一開始的點 
	char stageACT[10000];//記錄巡迴整張地圖不撞壁的路徑
	int position[4000];//奇數存x座標 偶數存y座標 
    int count;//判斷是否已經巡迴回到初始點 
    int stage;//stage = 1:尚未建完完整地圖
	          //stage = 2:已學習完整張地圖 開始巡迴吸髒髒room 
};

string ActionStr(Agent::ActionType);

#endif
