From 147d60865d5fdbd9a867c645c6bbde4c1256a93f Mon Sep 17 00:00:00 2001 From: Patrick Davison Date: Tue, 15 Nov 2011 00:17:46 -0800 Subject: Tutorial, Map Position:'s, Solver. --- includes/maps.php | 44 ++++---- pages/gallery.php | 315 ++++++++++++++++++++++++++++++++++++++++++++++++++--- pages/tutorial.php | 55 ++++++++-- 3 files changed, 367 insertions(+), 47 deletions(-) diff --git a/includes/maps.php b/includes/maps.php index ef1d6e0..1c51f6d 100644 --- a/includes/maps.php +++ b/includes/maps.php @@ -28,45 +28,43 @@ function DisplayMap($mapMatrix, $idprefix = 1, $style = 'normal', $speed = NULL) $maptable .= ""; for($j = 0; $j < count($mapMatrix[$i]); $j++) { - //== - $index++; $handle = "$idprefix,$i,$j"; switch($mapMatrix[$i][$j]) { - case 's': $maptable .= ""; break; - case 'f': $maptable .= ""; break; + case 's': $maptable .= ""; break; + case 'f': $maptable .= ""; break; //TP1 - case 't': $maptable .= ""; break; - case 'u': $maptable .= ""; break; + case 't': $maptable .= ""; break; + case 'u': $maptable .= ""; break; //TP2 - case 'm': $maptable .= ""; break; - case 'n': $maptable .= ""; break; + case 'm': $maptable .= ""; break; + case 'n': $maptable .= ""; break; //TP3 - case 'g': $maptable .= ""; break; - case 'h': $maptable .= ""; break; + case 'g': $maptable .= ""; break; + case 'h': $maptable .= ""; break; //TP4 - case 'i': $maptable .= ""; break; - case 'j': $maptable .= ""; break; + case 'i': $maptable .= ""; break; + case 'j': $maptable .= ""; break; //TP5 - case 'k': $maptable .= ""; break; - case 'l': $maptable .= ""; break; + case 'k': $maptable .= ""; break; + case 'l': $maptable .= ""; break; - case 'a': $maptable .= ""; break; - case 'b': $maptable .= ""; break; - case 'c': $maptable .= ""; break; - case 'd': $maptable .= ""; break; - case 'e': $maptable .= ""; break; - - case 'r': $maptable .= ""; break; //rock - case 'R': $maptable .= ""; break; //metalic looking rock + case 'a': $maptable .= ""; break; + case 'b': $maptable .= ""; break; + case 'c': $maptable .= ""; break; + case 'd': $maptable .= ""; break; + case 'e': $maptable .= ""; break; + + case 'r': $maptable .= ""; break; //rock + case 'R': $maptable .= ""; break; //metalic looking rock case 'p': $maptable .= ""; break; //path. case 'q': $maptable .= ""; break; //transparent case 'w': $maptable .= ""; break; //wall - //default: $maptable .= "".$index.""; + // default; normally 'o'. default: $maptable .= ""; //default: $maptable .= "".$mapMatrix[$i][$j].""; } diff --git a/pages/gallery.php b/pages/gallery.php index 259ac2a..4bcdc05 100644 --- a/pages/gallery.php +++ b/pages/gallery.php @@ -1,26 +1,15 @@ "; -echo "
"; -echo ""; - -echo rand(0,1); -echo rand(0,1); -echo rand(0,1); -echo rand(0,1); -echo rand(0,1); - //15x9.c3.r28.w12.t2.:0s.8r.4f.0s.9r.3f.0s.12r.0f.0s.8r.0r.3f.0s.5r.5r.1f.0s.1r.11f.0s.0r.8r.1r.1f.0s.8r.4f.0s.4r.3r.4f. $map = GenerateMap( @@ -128,6 +117,306 @@ $a[1] = 't'; $a['1'] = 'hi'; echo $a[1]; + + +$myshape[] = "qqqqqfffffqqqqq"; +$myshape[] = "qqqqq?????qqqqq"; +$myshape[] = "qqooo??b??oooqq"; +$myshape[] = "qqoRR?????RRoqq"; +$myshape[] = "qqoRR?????RRoqq"; +$myshape[] = "f?????????????f"; +$myshape[] = "f?????????????f"; +$myshape[] = "f?a????s????c?f"; +$myshape[] = "f?????????????f"; +$myshape[] = "f?p???????????f"; +$myshape[] = "qqpRR?????RRoqq"; +$myshape[] = "qqpRR?????RRoqq"; +$myshape[] = "qqpppp?d??oooqq"; +$myshape[] = "qqqqq?????qqqqq"; +$myshape[] = "qqqqqfffffqqqqq"; + +$basic[] = "soooooooootoof"; +$basic[] = "soooooooooooof"; +$basic[] = "soooooooooooof"; +$basic[] = "soobooooroooof"; +$basic[] = "sooroooooaooof"; +$basic[] = "srorooooorroof"; +$basic[] = "soooooooorooof"; +$basic[] = "soooooocodooof"; +$basic[] = "soorooorroooof"; +$basic[] = "soooeoooooooof"; +$basic[] = "suooooooooooof"; + + +$basic2[] = "soooooooorotof"; +$basic2[] = "soooooooodooof"; +$basic2[] = "soorooooooooof"; +$basic2[] = "soooooooooooof"; +$basic2[] = "soooaoooooooof"; +$basic2[] = "suocooooooobof"; + + +$basic3[] = "soooooooooof"; +$basic3[] = "soooooooooof"; +$basic3[] = "sooooaooooof"; +$basic3[] = "soooooooooof"; +$basic3[] = "soooooooooof"; + + +$myparams['checkpoints'] = 1; +$myparams['teleports'] = 0; +$myparams['rockchance'] = 100; +$myparams['walls'] = 10; +//$map = GenerateShapedMap($basic3, $myparams); + +$motd = MapOfTheDay(2); +$map = $motd['map']; + + +//Benchmark +$time_start = microtime(true); + + +$newmap = executeTryMaze($map); +echo DisplayMap($newmap, 2); + + +$time_end = microtime(true); +$time = round($time_end - $time_start, 4); +echo "
Solution created in $time seconds\n
"; + +//Return an array of effected tiles. +function getEffected($route) { + //Determin starting location. + $start = explode(",", $route['start']); + $x=$start[0]; + $y=$start[1]; + + //Run through the path + $pathary = str_split($route['path']); + foreach ($pathary as $position => $char) { + switch($char) { + case 1: $y--; break; //up + case 2: $x++; break; //right + case 3: $y++; break; //down + case 4: $x--; break; //left + default: continue 2; + } + //add the positions + $effected["$y,$x"]++; + } + //arsort($effected); + return $effected; +} +// http://awesomescreenshot.com/0d7nyx9b2 + +function executeTryMaze($mapMatrix, $intensity = 1) { + $mapdata['height'] = $mapMatrix[0][0]; + $mapdata['width'] = $mapMatrix[0][1]; + $mapdata['points'] = $mapMatrix[0][2]; + $mapdata['rocks'] = $mapMatrix[0][3]; + $mapdata['walls'] = $mapMatrix[0][4]; + //Override hack. + //$mapdata['walls'] = 12; + $mapdata['teleports'] = $mapMatrix[0][5]; + + + //PROCSES BEGIN + $wallcount = 0; + $iterations = 0; + $lastRefresh = 0; + do { + $iterations++; + $done = false; + $path = routePath($mapMatrix); + $effected = getEffected($path); + + $curcount = 1000; + $bestmoves = $path['moves'] - 1; + + foreach ($effected as $position => $count) { + //Find location + $loc = explode(",", $position); + $x=$loc[0]; + $y=$loc[1]; + //Is it open? + if ($mapMatrix[$x][$y] != "o") { + continue; + } + + + //Set a wall and calculate the new path + $mapMatrix[$x][$y] = 'R'; + $curpath = routePath($mapMatrix); + $trymoves = $curpath['moves']; + + //echo "T($x,$y)\n:"; + + //path blocked? + if ($curpath['blocked'] == true) { + //Sometimes it's better to remove a different wall; + + //Put a wall here. + $arrayWalls[$x][$y] = true; + + //determin wall values. + $walllist = wallvalues($mapMatrix, $arrayWalls); + + //Put the best wall to remove on top; - A mono directional bubble sort would be better here. + $walllist["$x,$y"]++; + asort($walllist); + + //Get location of wall to remove. + $nwallposition = key($walllist); + + echo "*$nwallposition vs $x,$y*\n"; + + $nloc = explode(",", $nwallposition); + $x=$nloc[0]; + $y=$nloc[1]; + //Remove that wall instead. + $mapMatrix[$x][$y] = 'o'; + + //echo "Rem[$x,$y]"; + + //$curpath = routePath($mapMatrix); + //echo $curpath['blocked']; + //echo "]"; + + unset($arrayWalls[$x][$y]); + continue; + } + //The last choice, or first choice? + //if ($trymoves >= $bestmoves) { + if ($trymoves >= $bestmoves) { + $bestmoves = $trymoves; + $bestx = $x; + $besty = $y; + $mapMatrix[$x][$y] = 'o'; + break; + } + $mapMatrix[$x][$y] = 'o'; + } + //Place the wall in the best spot we found; + $arrayWalls[$bestx][$besty] = true; + echo $mapMatrix[$bestx][$besty]; + $mapMatrix[$bestx][$besty] = 'R'; + $wallcount++; + echo "B($bestx,$besty)\n:"; + + //Refresh walls (Remove obsolete walls) + if ($iterations % 4 == 0 AND $wallcount > ($mapdata['walls'] * .6)) + { + echo "RW"; + $walllist = wallvalues($mapMatrix, $arrayWalls); + //Remove low valued wall; + $lowvaluewall = true; + $nullwalls = 0; + foreach ($walllist as $nwallposition => $wallvalue) { + if ($wallvalue == 0 OR ($lowvaluewall == true AND $wallvalue == 1)) + { + $nloc = explode(",", $nwallposition); + $x=$nloc[0]; + $y=$nloc[1]; + $mapMatrix[$x][$y] = 'o'; + unset($arrayWalls[$x][$y]); + $wallcount--; + + $nullwalls++; + if ($nullwalls >= 2) { + break; + } + if ($lowvaluewall == true AND $wallvalue == 1) { + $lowvaluewall = false; + } + } + } + } + + //Refresh walls if we hit the wall count limit, once. + if($wallcount >= $mapdata['walls'] && $lastRefresh == 0) + { + $lastRefresh = 1; + $walllist = wallvalue($mapMatrix, "R"); + foreach ($walllist as $nwallposition => $wallvalue) { + if ($wallvalue <= 1) { + $nloc = explode(",", $nwallposition); + $i=$nloc[0]; + $j=$nloc[1]; + $mapMatrix[$i][$j] = 'o'; + $wallcount--; + } + } + echo "End Refresh walls to:[$wallcount]"; + } + + //If all walls are placed even after refresh, we're done + if ($wallcount >= $mapdata['walls']) { + echo "END;($wallcount)"; + break; + } + } while ($done == false); + + echo "print"; + print_r(wallvalue($mapMatrix, "R")); + echo "endprint"; + return $mapMatrix; +} + + +//Returns the essential 'move value' of individual walls in an array. +function wallValues($mapMatrix, $arrayWalls) { + $curpath = routePath($mapMatrix); + $curmoves = $curpath['moves']; + //Prepare to return an array. + $r = Array(); + foreach ($arrayWalls as $x => $a) { + foreach ($a as $y => $v) { + //echo "{O".$mapMatrix[$x][$y]."O}"; + if ($mapMatrix[$x][$y] <> 'R') { + continue; + } + //Imagine the maze without the wall. + $mapMatrix[$x][$y] = 'o'; + $newpath = routePath($mapMatrix); + $newmoves = $newpath['moves']; + //Great; so the value of that wall is: + $r["$x,$y"] = $curmoves - $newmoves; + //Okay, you can have your wall back. + $mapMatrix[$x][$y] = 'R'; + } + } + return $r; +} + + +//Returns the essential 'move value' of a wall. +function wallvalue($mapMatrix, $wall) { + $curpath = routePath($mapMatrix); + $curmoves = $curpath['moves']; + for( $i = 1; $i <= $mapMatrix[0][1]; $i++) { //Number of Rows + for( $j = 0; $j < $mapMatrix[0][0]; $j++) { //Number of Columns + if ($mapMatrix[$i][$j] == $wall) { + $mapMatrix[$i][$j] = 'o'; + $newpath = routePath($mapMatrix); + $mapMatrix[$i][$j] = 'r'; + $newmoves = $newpath['moves']; + + $r["$i,$j"] = $curmoves - $newmoves; + + } + } + } + return $r; +} + + + + + +echo "
Path: "; +echo $bla['moves']; +echo "
"; $mapdisplay = DisplayMap($map); $code = GenerateMapCode($map); diff --git a/pages/tutorial.php b/pages/tutorial.php index ba8d21b..d7d4b24 100644 --- a/pages/tutorial.php +++ b/pages/tutorial.php @@ -25,10 +25,10 @@ function challengeGo(mapid) { case '2': if (moves >= 18) { flashelement('nextbtn', 15, null, 400); - updateDsp(1, 'instructions', 'Great Job, 18 moves!
Lets move on to the next shall we?'); + updateDsp(1, 'instructions', "Great, that's 18 moves!
Lets move on to the next shall we?"); //Unlock next button. } else { - updateDsp(1, 'instructions', 'As you can see, the path travels from the Start to A to Finish.
Place 2 walls where it\'s flashing to make the path longer'); + updateDsp(1, 'instructions', "The goal for this map is 18 moves.
Place 2 walls to make the path longer"); var tiles = ["2,3,5","2,4,6"]; markTiles(tiles); } @@ -37,10 +37,10 @@ function challengeGo(mapid) { case '3': if (moves >= 64) { flashelement('nextbtn', 15, null, 400); - updateDsp(1, 'instructions', 'I almost confused you! hehe.
Next?'); + updateDsp(1, 'instructions', '

I almost confused you! hehe.

Next?

'); //Unlock next button. } else { - updateDsp(1, 'instructions', 'The path can travel over the start and end tiles too.
'); + updateDsp(1, 'instructions', '

The path can travel over the start and end tiles too.


'); var tiles = ["3,3,6","3,4,7","3,3,2","3,2,1"]; markTiles(tiles); } @@ -73,6 +73,8 @@ function challengeGo(mapid) { } } + + function markTiles(tiles) { for(var i in tiles) { var tmp = tiles[i]; @@ -93,15 +95,45 @@ function challengeWall(mapid) { return; } } - updateDsp(1, 'instructions', 'Excellent; those wall placements look good!
Press Go and see the path it takes') + updateDsp(1, 'instructions', 'Excellent; those wall placements look good!
Press "Go!" and see the path it takes') } -function challengeLoad() { +function challengeLoad() {} + +function challenge() {} +challenge.prototype.unlock = function(id) { } +//var ch = new challenge(); + + + function highlightElement(Eid) { } + +function startChallenge(mapid) { + console.log("start challenge", mapid); + switch (mapid) { + case 1: + updateDsp(1, 'instructions', '

The point of this game is to create the longest path between the start and the finish.

Press Go!

'); + flashelement('1,btn', 10, null, 400); + break; + case 2: + updateDsp(1, 'instructions', "

Let's start off simple;

Start by pressing 'Go!' first.

"); + break; + case 3: + updateDsp(1, 'instructions', "The goal for this map is 64 moves
Press 'Go!'"); + break; + case 4: + updateDsp(1, 'instructions', "Teleports are traps. See if you can use the teleport to reach 45 moves!
Press 'Go!'"); + break; + case 5: + updateDsp(1, 'instructions', "Now for a difficult one. The goal for this one is 75 moves.
Press 'Go!' for help"); + break; + } +} + function TutorialView(low, high) { this.low = low; this.high = high; @@ -117,6 +149,7 @@ TutorialView.prototype.showTutorial = function(num) { } var elem = document.getElementById("tut-" + num); elem.className = elem.className.replace('hidden', ''); + startChallenge(num); } TutorialView.prototype.next = function() { this.showTutorial(++this.cur); @@ -227,20 +260,20 @@ $map5 = GenerateShapedMap($challenge5, $myparams); //Display maps. echo ''; ?>
- +
-- cgit v1.2.3