HasPit = $Pit; // Initialize Variables
$this->HasWumpus = $Wumpus;
$this->HasExit = $Exit;
$this->HasGold = $Gold;
}
function IsWumpus() {return $this->HasWumpus;}
function IsPit() {return $this->HasPit;}
function IsExit() {return $this->HasExit;}
function IsGold() {return $this->HasGold;}
function SetWumpus($x) {$this->HasWumpus = $x;}
function SetPit($x) {$this->HasPit = $x;}
function SetExit($x) {$this->HasExit = $x;}
function SetGold($x) {$this->HasGold = $x;}
}
// Set Up Initial Map
$WumpusSpot = rand(1, MapArea - 1);
$PitSpot = rand(1, MapArea - 1);
$GoldSpot = rand(1, MapArea - 1);
$ExitSpot = MapArea;
for ($lcv = 1; $lcv <= MapArea; $lcv++)
{
$PitHere = ($PitSpot == $lcv);
$WumpusHere = ($WumpusSpot == $lcv);
$ExitHere = ($ExitSpot == $lcv);
$GoldHere = ($GoldSpot == $lcv);
$Map[$lcv] = new MapSquare($PitHere,$WumpusHere,$ExitHere,$GoldHere);
}
function DrawMap($MapArray, $AgentLocation)
{
?>
| IsPit()) ? "" : " ";
echo ($MapArray[$ThisCell]->IsWumpus()) ? "" : " ";
echo ($MapArray[$ThisCell]->IsExit()) ? "" : " ";
echo ($MapArray[$ThisCell]->IsGold()) ? "" : " ";
echo ($ThisCell == $AgentLocation) ? "" : " ";
echo "\r\n";?> |
HasPit = 0; // Initialize Variables
$this->HasWumpus = 0;
$this->HasExit = false;
$this->HasVisited = false;
}
function KnowWumpus() {return $this->HasWumpus;}
function KnowPit() {return $this->HasPit;}
function KnowExit() {return $this->HasExit;}
function KnowVisited() {return $this->HasVisited;}
function LearnWumpus($a) { $this->HasWumpus = $a;}
function LearnPit($b) { $this->HasPit = $b;}
function LearnExit($c) { $this->HasExit = $c;}
function LearnVisited($d) { $this->HasVisited = $d;}
}
// Initialize Agent Knowledge
for ($lcv = 1; $lcv <= MapArea; $lcv++)
{$MapKnowledge[$lcv] = new MemorySquare();}
$MapKnowledge[MapArea]->LearnExit(True);
$MapKnowledge[MapArea]->LearnWumpus(-1);
$MapKnowledge[MapArea]->LearnPit(-1);
$MyLocation = MapArea;
$HaveGold = False;
$HaveShot = True;
function DrawMemory($MemoryMap, $AgentLocation)
{
?> ";
if ($MemoryMap[$ThisCell]->KnowPit() == 0) {echo "";}
else echo ($MemoryMap[$ThisCell]->KnowPit() == 1) ? "Pit! " : "No pits here. ";
if ($MemoryMap[$ThisCell]->KnowWumpus() == 0) {echo "";}
else {echo ($MemoryMap[$ThisCell]->KnowWumpus() == 1) ? "Wumpus! " : "No Wumpus. ";}
if ($MemoryMap[$ThisCell]->KnowExit() == NULL) {echo "";}
else {echo ($MemoryMap[$ThisCell]->KnowExit()) ? "The exit. " : "";}
if ($MemoryMap[$ThisCell]->KnowVisited() == NULL) {echo "";}
else {echo ($MemoryMap[$ThisCell]->KnowVisited()) ? "Visited." : "";}
echo "\r\n";?> |
MapWidth) ? $x - MapWidth : NULL;}
function NeighborBelow($x){return ($x <= MapArea - MapWidth) ? $x + MapWidth : NULL;}
function SenseBreeze($MapArray, $location)
{
return (
( (NeighborLeft($location) != NULL) && ($MapArray[NeighborLeft($location)]->IsPit()) ) ||
( (NeighborRight($location) != NULL) && ($MapArray[NeighborRight($location)]->IsPit()) ) ||
( (NeighborAbove($location) != NULL) && ($MapArray[NeighborAbove($location)]->IsPit()) ) ||
( (NeighborBelow($location) != NULL) && ($MapArray[NeighborBelow($location)]->IsPit()) )
);
}
function SenseSmell($MapArray, $location)
{
return (
( (NeighborLeft($location) != NULL) && ($MapArray[NeighborLeft($location)]->IsWumpus()) ) ||
( (NeighborRight($location) != NULL) && ($MapArray[NeighborRight($location)]->IsWumpus()) ) ||
( (NeighborAbove($location) != NULL) && ($MapArray[NeighborAbove($location)]->IsWumpus()) ) ||
( (NeighborBelow($location) != NULL) && ($MapArray[NeighborBelow($location)]->IsWumpus()) )
);
}
function SenseGlitter($MapArray, $Location)
{
return ($MapArray[$Location]->IsGold());
}
function AgentThink(&$Memory, $Map, $Location)
{
$Memory[$Location]->LearnVisited(true); // Agent has visited Current Square
if (!$Map[$Location]->IsPit())
$Memory[$Location]->LearnPit(-1);
else {echo "Died in Pit"; Return "failure";}
if (!$Map[$Location]->IsWumpus())
$Memory[$Location]->LearnWumpus(-1);
else {echo "Killed by Wumpus"; Return "failure";}
if (!SenseBreeze($Map, $Location))
{
if (NeighborLeft($Location) != NULL) {$Memory[NeighborLeft($Location)]->LearnPit(-1);}
if (NeighborRight($Location) != NULL) {$Memory[NeighborRight($Location)]->LearnPit(-1);}
if (NeighborAbove($Location) != NULL) {$Memory[NeighborAbove($Location)]->LearnPit(-1);}
if (NeighborBelow($Location) != NULL) {$Memory[NeighborBelow($Location)]->LearnPit(-1);}
}
else {echo "I feel a breeze.
";}
if (!SenseSmell($Map, $Location))
{
if (NeighborLeft($Location) != NULL) $Memory[NeighborLeft($Location)]->LearnWumpus(-1);
if (NeighborRight($Location) != NULL) $Memory[NeighborRight($Location)]->LearnWumpus(-1);
if (NeighborAbove($Location) != NULL) $Memory[NeighborAbove($Location)]->LearnWumpus(-1);
if (NeighborBelow($Location) != NULL) $Memory[NeighborBelow($Location)]->LearnWumpus(-1);
}
else {echo "I smell a Wumpus.
";}
if (!function_exists('DetectDanger'))
{
function DetectDanger ($place, $MapArray, &$Memory)
{
$MaybePit = 0;
$MaybePitCount = 0;
if ( (NeighborLeft($place) != NULL) && ($Memory[NeighborLeft($place)]->KnowPit() == 0) ) {$MaybePit = NeighborLeft($place); $MaybePitCount++;}
if ( (NeighborRight($place) != NULL) && ($Memory[NeighborRight($place)]->KnowPit() == 0) ) {$MaybePit = NeighborRight($place); $MaybePitCount++;}
if ( (NeighborAbove($place) != NULL) && ($Memory[NeighborAbove($place)]->KnowPit() == 0) ) {$MaybePit = NeighborAbove($place); $MaybePitCount++;}
if ( (NeighborBelow($place) != NULL) && ($Memory[NeighborBelow($place)]->KnowPit() == 0) ) {$MaybePit = NeighborBelow($place); $MaybePitCount++;}
if ($MaybePitCount == 1) $Memory[$MaybePit]->LearnPit(1);
$MaybeWumpus = 0;
$MaybeWumpusCount = 0;
if ( (NeighborLeft($place) != NULL) && ($Memory[NeighborLeft($place)]->KnowWumpus() == 0) ) {$MaybeWumpus = NeighborLeft($place); $MaybeWumpusCount++;}
if ( (NeighborRight($place) != NULL) && ($Memory[NeighborRight($place)]->KnowWumpus() == 0) ) {$MaybeWumpus = NeighborRight($place); $MaybeWumpusCount++;}
if ( (NeighborAbove($place) != NULL) && ($Memory[NeighborAbove($place)]->KnowWumpus() == 0) ) {$MaybeWumpus = NeighborAbove($place); $MaybeWumpusCount++;}
if ( (NeighborBelow($place) != NULL) && ($Memory[NeighborBelow($place)]->KnowWumpus() == 0) ) {$MaybeWumpus = NeighborBelow($place); $MaybeWumpusCount++;}
if ($MaybeWumpusCount == 1) $Memory[$MaybeWumpus]->LearnWumpus(1);
}
}
DetectDanger($Location, $Map, $Memory);
if ((NeighborLeft($Location) != NULL) && ($Memory[NeighborLeft($Location)]->KnowVisited())) DetectDanger(NeighborLeft($Location), $Map, $Memory);
if ((NeighborRight($Location) != NULL) && ($Memory[NeighborRight($Location)]->KnowVisited())) DetectDanger(NeighborRight($Location), $Map, $Memory);
if ((NeighborAbove($Location) != NULL) && ($Memory[NeighborAbove($Location)]->KnowVisited())) DetectDanger(NeighborAbove($Location), $Map, $Memory);
if ((NeighborBelow($Location) != NULL) && ($Memory[NeighborBelow($Location)]->KnowVisited())) DetectDanger(NeighborBelow($Location), $Map, $Memory);
}
function AgentMove($Map, &$RealMap, &$Location, &$HaveShot, &$HaveGold)
{
//If Agent is in a Wumpus or Pit Square, then die.
if ($RealMap[$Location]->IsWumpus() || $RealMap[$Location]->IsPit()) //Agent is killed.
{echo "I got killed!"; return -1;} //-1 Means loser
//If Agent has gold and it at the exit, then win.
if ($HaveGold && $RealMap[$Location]->IsExit()) //Agent can escape with gold.
{echo "Leaving with the gold!"; return 1;} //1 Means winner
//If Agent knows it is next to the Wumpus, shoot it. (Why not?)
if ((NeighborLeft($Location) != NULL) && //Valid Location
($Map[NeighborLeft($Location)]->KnowWumpus() == 1) && //Wumpus to the Left
($HaveShot)) //Have Ammo
{$RealMap[NeighborLeft($Location)]->SetWumpus(False); $HaveShot = False; echo "Shooting at wumpus."; return 0;} //So Shoot It
if ((NeighborAbove($Location) != NULL) && //Valid Location
($Map[NeighborAbove($Location)]->KnowWumpus() == 1) && //Wumpus Above
($HaveShot)) //Have Ammo
{$RealMap[NeighborAbove($Location)]->SetWumpus(False); $HaveShot = False; echo "Shooting at wumpus."; return 0;} //So Shoot It
if ((NeighborRight($Location) != NULL) && //Valid Location
($Map[NeighborRight($Location)]->KnowWumpus() == 1) && //Wumpus to the Right
($HaveShot)) //Have Ammo
{$RealMap[NeighborRight($Location)]->SetWumpus(False); $HaveShot = False; echo "Shooting at wumpus."; return 0;} //So Shoot It
if ((NeighborBelow($Location) != NULL) && //Valid Location
($Map[NeighborBelow($Location)]->KnowWumpus() == 1) && //Wumpus Below
($HaveShot)) //Have Ammo
{$RealMap[NeighborBelow($Location)]->SetWumpus(False); $HaveShot = False; echo "Shooting at wumpus."; return 0;} //So Shoot It
//If Agent has the gold and is not at the exit, head to a visited square (backtrack).
if ($HaveGold) //Have the Gold.
{
if ((NeighborBelow($Location) != NULL) && //Valid Location
($Map[NeighborBelow($Location)]->KnowVisited()) && //Visited
($Map[NeighborBelow($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborBelow($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborBelow($Location)); echo "Looking for exit with gold."; return 0;} //So go back
if ((NeighborRight($Location) != NULL) && //Valid Location
($Map[NeighborRight($Location)]->KnowVisited()) && //Visited
($Map[NeighborRight($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborRight($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborRight($Location)); echo "Looking for exit with gold."; return 0;} //So go back
if ((NeighborAbove($Location) != NULL) && //Valid Location
($Map[NeighborAbove($Location)]->KnowVisited()) && //Visited
($Map[NeighborAbove($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborAbove($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborAbove($Location)); echo "Looking for exit with gold."; return 0;} //So go back
if ((NeighborLeft($Location) != NULL) && //Valid Location
($Map[NeighborLeft($Location)]->KnowVisited()) && //Visited
($Map[NeighborLeft($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborLeft($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborLeft($Location)); echo "Looking for exit with gold."; return 0;} //So go back
}
//If Agent is standing on the square with the gold, get it.
if (SenseGlitter($RealMap, $Location)) //Gold is here
{$RealMap[$Location]->SetGold(False); $HaveGold = True; echo "Grabbing the gold."; return 0;} //So get it
//If Agent is next to an unvisited safe square, go to it.
if ((NeighborLeft($Location) != NULL) && //Valid Location
(!$Map[NeighborLeft($Location)]->KnowVisited()) && //Unvisited
($Map[NeighborLeft($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborLeft($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborLeft($Location)); echo "Exploring."; return 0;} //So go there
if ((NeighborAbove($Location) != NULL) && //Valid Location
(!$Map[NeighborAbove($Location)]->KnowVisited()) && //Unvisited
($Map[NeighborAbove($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborAbove($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborAbove($Location)); echo "Exploring."; return 0;} //So go there
if ((NeighborRight($Location) != NULL) && //Valid Location
(!$Map[NeighborRight($Location)]->KnowVisited()) && //Unvisited
($Map[NeighborRight($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborRight($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborRight($Location)); echo "Exploring."; return 0;} //So go there
if ((NeighborBelow($Location) != NULL) && //Valid Location
(!$Map[NeighborBelow($Location)]->KnowVisited()) && //Unvisited
($Map[NeighborBelow($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborBelow($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborBelow($Location)); echo "Exploring."; return 0;} //So go there
//If Agent is at a dead-end, backtrack.
if ((NeighborBelow($Location) != NULL) && //Valid Location
($Map[NeighborBelow($Location)]->KnowVisited()) && //Visited
($Map[NeighborBelow($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborBelow($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborBelow($Location)); echo "Backtracking."; return 0;} //So go back
if ((NeighborRight($Location) != NULL) && //Valid Location
($Map[NeighborRight($Location)]->KnowVisited()) && //Visited
($Map[NeighborRight($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborRight($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborRight($Location)); echo "Backtracking."; return 0;} //So go back
if ((NeighborAbove($Location) != NULL) && //Valid Location
($Map[NeighborAbove($Location)]->KnowVisited()) && //Visited
($Map[NeighborAbove($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborAbove($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborAbove($Location)); echo "Backtracking."; return 0;} //So go back
if ((NeighborLeft($Location) != NULL) && //Valid Location
($Map[NeighborLeft($Location)]->KnowVisited()) && //Visited
($Map[NeighborLeft($Location)]->KnowPit() == -1) && //No Pits \__ It's
($Map[NeighborLeft($Location)]->KnowWumpus() == -1)) //No Wumpus / Safe
{$Location = (NeighborLeft($Location)); echo "Backtracking."; return 0;} //So go back
}
?> | Map Column | Thought Column |
| | |
| (MapArea * 2) && $Map[$MyLocation]->IsExit()) break;
if ($Counter > (MapArea*3)) $Move = 2;
}
if ($Move == 1)
echo "I got the gold and escaped!";
if ($Move == -1)
echo "I died!";
if ($Move == 0)
echo "I gave up and left!";
if ($Move == 2)
echo "I got lost!";
?> |
Wumpus World Program By Matthew Walsh. December 2002.
source