From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/maze_1.c | 183 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/maze_1.c (limited to 'reference/C/CONTRIB/SNIP/maze_1.c') diff --git a/reference/C/CONTRIB/SNIP/maze_1.c b/reference/C/CONTRIB/SNIP/maze_1.c new file mode 100755 index 0000000..8746357 --- /dev/null +++ b/reference/C/CONTRIB/SNIP/maze_1.c @@ -0,0 +1,183 @@ +/* + This program makes 10x10 mazes and prints them on the screen. No + promise of portability is made, but it does seem to work on NS GNX + C. + + Public Domain by Jonathan Guthrie. +*/ + +#include +#include +#include + +#define UP 1 +#define DN 2 +#define LT 4 +#define RT 8 + +int addelem(int, int [12][12], int *, int, int); +void openwall(int [12][12], int, int); +void writemaze(int [12][12]); + +void main(void) +{ + int i, j, base; + int search[150], array[12][12]; + + for(i=1 ; i<11 ; ++i) + { + array[i][0] = -1; + array[i][11] = -1; + array[0][i] = -1; + array[11][i] = -1; + for(j=1 ; j<11 ; ++j) + array[i][j] = 0; + } + + srand((int)time(NULL)); + i = rand() % 10 + 1; + j = rand() % 10 + 1; + base = addelem(0, array, search, i, j); + array[i][j] = RT + RT; /* Not a valid value */ + while(0 < base) + { + i = rand() % base; + j = search[i]; + search[i] = search[--base]; + i = j % 100; + j /= 100; + openwall(array, i, j); + base = addelem(base, array, search, i, j); + } + + writemaze(array); +} + + +int addelem(int base, int maze[12][12], int *search, int row, int col) +{ + if(0 == maze[row-1][col]) + { + search[base++] = row + col * 100 - 1; + maze[row-1][col] = -DN; + } + else if(0 > maze[row-1][col]) + maze[row-1][col] -= DN; + + if(0 == maze[row+1][col]) + { + search[base++] = row + col * 100 + 1; + maze[row+1][col] = -UP; + } + else if(0 > maze[row+1][col]) + maze[row+1][col] -= UP; + + if(0 == maze[row][col-1]) + { + search[base++] = row + col * 100 - 100; + maze[row][col-1] = -RT; + } + else if(0 > maze[row][col-1]) + maze[row][col-1] -= RT; + + if(0 == maze[row][col+1]) + { + search[base++] = row + col * 100 + 100; + maze[row][col+1] = -LT; + } + else if(0 > maze[row][col+1]) + maze[row][col+1] -= LT; + + return base; +} + + +void openwall(int maze[12][12], int row, int col) +{ + int directions, max, direction, temprow, tempcol, temp, back; + + directions = -maze[row][col]; + + max = 0; + if(directions & UP) + { + temp = rand(); + if(temp > max) + { + max = temp; + direction = UP; + back = DN; + temprow = row - 1; + tempcol = col; + } + } + + if(directions & DN) + { + temp = rand(); + if(temp > max) + { + max = temp; + direction = DN; + back = UP; + temprow = row + 1; + tempcol = col; + } + } + + if(directions & LT) + { + temp = rand(); + if(temp > max) + { + max = temp; + direction = LT; + back = RT; + temprow = row; + tempcol = col - 1; + } + } + + if(directions & RT) + { + temp = rand(); + if(temp > max) + { + max = temp; + direction = RT; + back = LT; + temprow = row; + tempcol = col + 1; + } + } + + maze[row][col] = direction; + maze[temprow][tempcol] += back; +} + +void writemaze(int maze[12][12]) +{ + int i, j; + + puts("*********************"); + for(i=1 ; i<11 ; ++i) + { + putchar('*'); + for(j=1 ; j<11 ; ++j) + { + putchar(' '); + if(maze[i][j] & RT) + putchar(' '); + else putchar('*'); + } + putchar('\n'); + for(j=1 ; j<11 ; ++j) + { + putchar('*'); + if(maze[i][j] & DN) + putchar(' '); + else putchar('*'); + } + puts("*"); + } +} -- cgit v1.2.3-54-g00ecf