📄 wumpus_world.cpp
字号:
#include "wumpus_world.h"#include "types.h"
typedef Object *Object_Column;void Wumpus_World::reset_agent(){ // initialize agent agent.x=1; agent.y=1; agent.arrow=True; agent.gold=0; agent.percept.stench=Fasle; agent.percept.breeze=Fasle; agent.percept.glitter=Fasle; agent.escaped=Fasle; agent.alive=True;}void Wumpus_World::init(){ unsigned int x; unsigned int y;
for(y=1;y<5;y++)
{
for(x=1;x<5;x++)
world[x][y]=Empty;
}
for(y=0;y<5;y++)
{ world[y][0]=empty;
world[0][y]=empty;
}
/*x=3;
y=1;
world[x][y]=Pit;
world[2][4]=Pit;
world[4][2]=Living_Wumpus;
world[3][3]=Gold;*/
world[3][3]=Pit;
world[1][4]=Pit;
world[4][2]=Living_Wumpus;
world[4][1]=Gold;}int Wumpus_World::adjacent(const Object OBJECT){/* if ( (world[agent.x-1][agent.y]== world) || (world[agent.x][agent.y-1]== world) || (world[agent.x+1][agent.y]== world) || (world[agent.x][agent.y+1]== world) ) { cout<<"adjacent online"<<endl; return True;} return Fasle; */
int i,j;
i=agent.x;
j=agent.y;
if(i==1&&j==4)
{
if(world[i+1][j]==OBJECT||world[i][j-1]==OBJECT)
{ return True;}
}
if(i==4&&j==4)
{
if(world[i-1][j]==OBJECT||world[i][j-1]==OBJECT)
{ return True;}
}
if(i==4&&j==1)
{
if(world[i-1][j]==OBJECT&&world[i][j+1]==OBJECT)
{ return True;}
}
//这里是边界的方格的判断
if(i==1&&j!=4&&j!=1)
{
if(world[i][j-1]==OBJECT||world[i][j+1]==OBJECT||world[i+1][j]==OBJECT)
{
return True;
}
}
if(i==4&&j!=4&&j!=1)
{
if(world[i][j-1]==OBJECT||world[i][j+1]==OBJECT||world[i-1][j]==OBJECT)
{ return True;
}
}
if(j==1&&i!=4&&i!=1)
{
//cout<<"PIT ONLINE"<<endl;
//cout<<j<<" "<<i<<endl;
if(world[i-1][j]==OBJECT||world[i][j+1]==OBJECT||world[i+1][j]==OBJECT)
{
return True;
}
}
if(j==4&&i!=4&&i!=1)
{
if(world[i-1][j]==OBJECT||world[i+1][j]==OBJECT||world[i][j-1]==OBJECT)
{return True;
}
}
//对不是边界判断
if((i!=1)&&(i!=4)&&(j!=4)&&(j!=1))
{
if(world[i-1][j]==OBJECT||world[i+1][j]==OBJECT||world[i][j-1]==OBJECT||world[i][j+1]==OBJECT)
{
return True;
}
}
return Fasle;}int Wumpus_World::current(const Object OBJECT){ if(world[agent.x][agent.y]==OBJECT) return True; return Fasle; }void Wumpus_World::set_percepts(){ agent.percept.stench=adjacent(Living_Wumpus) ; agent.percept.breeze= adjacent(Pit); agent.percept.glitter=current(Gold);}void Wumpus_World::do_UpForward(){
if(agent.x==4)
//cout<<"THE UPEST PANE!";
agent.x=4;
else
agent.x++; set_percepts(); if (current(Pit) || current(Living_Wumpus)) agent.alive=Fasle;}
void Wumpus_World::do_DownForward()
{
if(agent.x==1)
//cout<<"THE DOWNEST PANE!";
agent.x=1;
else
agent.x--;
set_percepts();
if (current(Pit) || current(Living_Wumpus))
agent.alive=Fasle;
}void Wumpus_World::do_LeftForward()
{
if(agent.y==1)
//cout<<"THE lEFTEST PANE!";
agent.y=1;
else
agent.y--;
set_percepts();
if (current(Pit) || current(Living_Wumpus))
agent.alive=Fasle;
}
void Wumpus_World::do_RightForward()
{
if(agent.y==4)
agent.y=4;
else
agent.y++;
set_percepts();
if (current(Pit) || current(Living_Wumpus))
agent.alive=Fasle;
}
void Wumpus_World::do_Grab(){ if (current(Gold)) { agent.gold++; world[agent.x][agent.y]=Empty; agent.percept.glitter=Fasle;
cout<<"THE AGENT HAVE GOTTEN GOLD!"<<endl; }; }void Wumpus_World::do_Shoot(int x,int y,Action ac,Object w[5][5]){ //cout << "action= shoot" << endl; if (agent.arrow==Fasle) return;
if(ac==UpForward)
x=x+1;
if(ac==DownForward)
x=x-1;
if(ac==LeftForward)
y=y-1;
if(ac==RightForward)
y=y+1; if(agent.arrow==True)
{
if(w[x][y]==Living_Wumpus)
w[x][y]=Dead_Wumpus;
} agent.arrow=Fasle; }void Wumpus_World::do_action(const Action ACTION,int x,int y,Action a,Object w[5][5]){ switch(ACTION) { case UpForward: do_UpForward(); break; case RightForward: do_RightForward();break; case LeftForward: do_LeftForward();break;
case DownForward: do_DownForward(); break; case Grab: do_Grab(); break; case Shoot: do_Shoot(x,y,a,w); break; };}/*void Wumpus_World::evaluate(Abstract_Agent &a, const unsigned int MAX_STEPS){ unsigned int steps=0; long score=0; cout << endl << "Starting evaluation..." << endl; reset_agent(); set_percepts(); do { show(); do_action(a.select_action(agent.percept)); score=score-ACTION_PENALTY; steps++; }while ((agent.alive) && (!agent.escaped) && (steps < MAX_STEPS)); if(!agent.alive) score-=DEATH_PENALTY; else if ((agent.escaped) && (agent.gold > 0)) score+=SUCCES_BONUS; cout << endl << "This agent has a score of " << score << endl; }*/void Wumpus_World::show(Percept percept1[5][5],Object w[5][5]){ unsigned int x; unsigned int y; cout << endl; for(x=4; x >0; x--) { for(y=1; y <=4; y++) { if((x==agent.x) && (y==agent.y) && (world[x][y]==Empty||world[x][y]==Dead_Wumpus)) {
cout << "A ";
} else {
if(w[x][y]==Pit)
cout<<"P ";
if(w[x][y]==Living_Wumpus)
cout<<"W ";
if(w[x][y]==Empty)
cout<<"E ";
if(w[x][y]==Dead_Wumpus)
cout<<"D ";
if(w[x][y]==Gold)
cout<<"G ";
/* if(percept1[x][y].breeze==Null)
cout<<"."<<" ";
else
{
if(percept1[x][y].breeze==True)
cout<<"B";
else
cout<<"";
if(percept1[x][y].glitter==True)
cout<<"G";
else
cout<<"";
if(percept1[x][y].stench==True)
cout<<"S";
else
cout<<"";
if(percept1[x][y].breeze==Fasle&&percept1[x][y].glitter==Fasle&&percept1[x][y].stench==Fasle)
cout<<"E";
}*/
}
}
cout<<endl; }
cout<<agent.x<<","<<agent.y<<" breeze"<<" glitter"<<" stench"<<endl;
cout<<" "<<agent.percept.breeze<<" "<<agent.percept.glitter<<" "<<agent.percept.stench<<endl; cout << "agent at location ("<<agent.x<<","<<agent.y<<")"<<endl; }// hier wordt de Wumpus World gecreeerd.Wumpus_World::Wumpus_World(){ /*unsigned int x=0; max_x=MAX_X; // 2 extra voor muren max_y=MAX_Y; // 2 extra voor muren // wereld creeeren world=new Object_Column[max_x+2]; for(x=0; x < max_x+2; x++) world[x]=new Object[max_y+2]; // nu de wereld nog initializeren init();*/}// hier wordt de Wumpus World vernietigdWumpus_World::~Wumpus_World(){ /* unsigned int x=0; for(x=0; x < max_x+2; x++) delete []world[x]; delete []world; world=NULL;*/}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -