GOPHERSPACE.DE - P H O X Y
gophering on tilde.club
        _     _                    _     _____  _                
       / \   | |__    ___   _   _ | |_  |_   _|| |__    ___      
      / _ \  | '_ \  / _ \ | | | || __|   | |  | '_ \  / _ \     
     / ___ \ | |_) || (_) || |_| || |_    | |  | | | ||  __/     
    /_/   \_\|_.__/  \___/  \__,_| \__|   |_|  |_| |_| \___|     
  ____                _                  __  __                  
 / ___|  ___   _ __  | |__    ___  _ __ |  \/  |  __ _  ____ ___ 
| |  _  / _ \ | '_ \ | '_ \  / _ \| '__|| |\/| | / _` ||_  // _ \
| |_| || (_) || |_) || | | ||  __/| |   | |  | || (_| | / /|  __/
 \____| \___/ | .__/ |_| |_| \___||_|   |_|  |_| \__,_|/___|\___|
              |_|                                                

The GopherMaze is a project I made during the tilde.club Weekly 
Webpage Workshop #5, to play with and learn more about the Gopher 
protocol.

Gopher, being primarily a text-based interface, tends to remind me 
of various text-based adventure games, which frequently required 
you to move around a map by specifying cardinal directions (north,
south, east and west).

Accordingly, I figured it would be fun to make a simple maze as a
Gopher site, with the path through the maze being represented by 
the directory hierarchy.

Play the Game

   __ __               _  __    _      __            __      
  / // /___  _    __   (_)/ /_  | | /| / /___   ____ / /__ ___
 / _  // _ \| |/|/ /  / // __/  | |/ |/ // _ \ / __//  '_/(_-<
/_//_/ \___/|__,__/  /_/ \__/   |__/|__/ \___//_/  /_/\_\/___/
                                                             
The first thing I needed was to generate a maze, so I headed over 
to Wikipedia to remind myself of some simple maze algorithms, and 
ended up using a randomized Prim's algorithm to generate the maze.

I chose not to use an algorithm which would include loops to 
simplify generating the navigation links on each page, and also 
because I didn't want to spend too long on this project!

I then hacked up some code to render the maze out to ASCII text, 
with the ability to mark the start, finish and a specific location
within the maze, which would represent the position of the player.
This would be displayed on each of the individual pages.

I considered using the grid location of each cell in the maze to
encode the URL.  This would have removed the requirement for 
subdirectories, but would mean anyone could cheat to jump to the 
end of the maze.  By using subdirectories, it forces the correct 
solution to the maze to be discovered.  After all, this is serious
business -- no cheating allowed!

I also hacked in some very ugly code to make sure the maze was 
hard enough -- as it's randomly generated, some of the mazes are 
particularly easy. This involves checking to make sure you can 
always go both directions from the start square, that you have to 
go in every direction at least once to get to the finish, and 
that there's a minimum number of steps required.

The result is a total of 160 gophermap files, one for each cell,
in 159 subdirectories.

   ____ ___   ____ 
  / __// _ | / __ \
 / _/ / __ |/ /_/ /
/_/  /_/ |_|\___\_\
                   
Q. I can't find my way out!
A. Try drawing on your screen with a Sharpie, it really does make
   things easier.  However, if you still can't find your way out,
   here is the complete set of steps required:

   E, S, S, S, S, S, S, S, E, S, E, N, E, N, E, E, E, N, N, N, N, 
   N, N, E, E, E, E, E, E, S, S, E, S, S, E, S, S, W, S, S, S, E

   ____                       
  /  _/___  ___ __ __ ___  ___
 _/ / (_-< (_-/___//___//___/\_,_/ \__//___/
                              
I originally started using relative links to go 'back' in the maze,
so for example, if you went east from the start location, then the 
west direction would load '../', the previous directory.

This worked perfectly in the web proxy, but when attempting to 
navigate to these relative links from the shell in Lynx, I would
get an error.

I'm not sure if this was me doing something wrong, or if there is 
no official ability to specify the parent directory in a gopher 
link.