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 ColumnThought 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