home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
577a.lha
/
TownMaze_v1.1
/
src.lzh
/
townmaze.h
< prev
next >
Wrap
C/C++ Source or Header
|
1991-08-04
|
5KB
|
186 lines
/*
** townmaze.h Copyright 1991 Kent Paul Dolan,
** Mountain View, CA, USA 94039-0755
**
** Written to satisfy an inquiry on USENet's rec.games.programmer newsgroup.
** May be freely used or modified in any non-commercial work. Copyrighted
** only to prevent patenting by someone else.
*/
/*
** Avoid infinite loops in several routines.
*/
#define MAXTRIES 5000
/*
** Define PROGRESS as 1 to see a "walking progress" line of routines
** announcing themselves as they run, 0 otherwise.
**
** Define SHOWSTART as 1 to see a debug maze that shows the situation
** after the gates and courts are added but before the streets are
** otherwise built; 0 to skip it.
**
** Define SHOWEND as 1 to see a debug maze that shows the situation
** after the maze is completed; 0 to skip it;
**
** Define HEADER as 1 to see the parameter values echoed back just above
** the maze, 0 to suppress the header.
**
** Define RAND48 in the makefile to use the srand48() and lrand48()
** functions instead of the srandom() and random() functions.
*/
#define PROGRESS 0
#define SHOWSTART 0
#define SHOWEND 0
#define HEADER 1
#ifdef RAND48
#include <math.h>
#define RANDOM lrand48
#define SEEDRANDOM srand48
#else
#define RANDOM random
#define SEEDRANDOM srandom
#endif
/*
** Control for defintion (allocation) of globals in main only,
** declaration only elsewhere.
*/
#ifdef MAINLINE
#define SIDETRACK
#else
#define SIDETRACK extern
#endif
/*
**
** The maze is sized in terms of X cells by Y cells, and of X charcters
** by Y characters; there are 2*cells+1 characters in each maze
** direction. For purposes of screen display, the horizontal direction
** is X and the vertical direction is Y, and the origin is at the top
** left, with Y positive going down and X positive going right.
**
** For various reasons in the code, a maze must have at least 5 cells
** per side (which will be a very boring maze indeed. Corner cells are
** not used, to ease the design problem.
**
** The primary maze determinant is its size in characters; this
** must be odd in both dimensions.
**
*/
/*
** P A R A M E T E R S
**
** -h mazeheight -- Y size in characters
** -w mazewidth -- X size in characters
** listsize -- number of cells in the cell array; computed global
** -r randomseed -- use to get the same maze again; replaces clock
** seed; seed used is reported in the header for use
** in a repeat run.
** -g mazegates -- number of streets to start at the city wall
** -l leftgates -- number of them to leave doors leading outside on
** -c mazecourts -- number of streets to start away from the city wall
** -u mazeunused -- number of cells to leave unused in the maze
** -s mazestraightness -- times per thousand to retry on average before
** accepting a random cell that makes a street turn
** rather than go straight
**
** All parameters have default values. Listsize is computed when mazeheight
** and mazewidth are known.
**
*/
#ifdef MAINLINE
int mazeheight = 23;
int mazewidth = 77;
int listsize;
long randomseed;
int mazegates = 4;
int leftgates = 2;
int mazecourts = 0;
int mazeunused = 0;
int mazestraightness = 750;
#else
extern int mazeheight;
extern int mazewidth;
extern int listsize;
extern long randomseed;
extern int mazegates;
extern int leftgates;
extern int mazecourts;
extern int mazeunused;
extern int mazestraightness;
#endif
/*
** T Y P E D E F S
*/
typedef struct dlelem
{
int next;
int prev;
int status;
int streetnum;
int streetdir;
} DLENODE;
/*
** M A Z E A R R A Y S
*/
/*
** The cell list used for storing cell status information. Although the
** maze is 2D, this list is kept 1D to make it simple to use list array
** indices as link list "pointers".
*/
SIDETRACK DLENODE *statlist;
SIDETRACK int isolated, street, live, dead, unused;
SIDETRACK int isolatedct,streetct,livect,deadct, unusedct;
SIDETRACK int streetnumct;
/*
** The maze used for display.
*/
SIDETRACK char **cmaze;
/*
** P R I N T I N G S Y M B O L S
*/
/*
** maze drawing elements for ascii screen presentation
*/
#define WALL '#'
#define VDOOR '|'
#define HDOOR '-'
#define BLANK ' '
/*
** D E F I N E D C O N S T A N T S
*/
/*
** status of maze locations
*/
#define ISOLATED 1
#define LIVE 2
#define DEAD 3
#define STREET 4
#define UNUSED 5
/*
** Bogus null pointer for indices used as pointers, since zero is valid.
*/
#define NOPOINTER -1