home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / c / snippets / maze_1.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  4KB  |  185 lines

  1. /*
  2.    This program makes 10x10 mazes and prints them on the screen.  No
  3.    promise of portability is made, but it does seem to work on NS GNX
  4.    C.
  5.  
  6.    Public Domain by Jonathan Guthrie.
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <time.h>
  12.  
  13. #define UP  1
  14. #define DN  2
  15. #define LT  4
  16. #define RT  8
  17.  
  18. int  addelem(int, int [12][12], int *, int, int);
  19. void openwall(int [12][12], int, int);
  20. void writemaze(int [12][12]);
  21.  
  22. main()
  23. {
  24.       int i, j, base;
  25.       int search[150], array[12][12];
  26.  
  27.       for(i=1 ; i<11 ; ++i)
  28.       {
  29.             array[i][0] = -1;
  30.             array[i][11] = -1;
  31.             array[0][i] = -1;
  32.             array[11][i] = -1;
  33.             for(j=1 ; j<11 ; ++j)
  34.                   array[i][j] = 0;
  35.       }
  36.  
  37.       srand((int)time(NULL));
  38.       i = rand() % 10 + 1;
  39.       j = rand() % 10 + 1;
  40.       base = addelem(0, array, search, i, j);
  41.       array[i][j] = RT + RT;      /* Not a valid value */
  42.       while(0 < base)
  43.       {
  44.             i = rand() % base;
  45.             j = search[i];
  46.             search[i] = search[--base];
  47.             i = j % 100;
  48.             j /= 100;
  49.             openwall(array, i, j);
  50.             base = addelem(base, array, search, i, j);
  51.       }
  52.  
  53.       writemaze(array);
  54.       return 0;
  55. }
  56.  
  57.  
  58. int addelem(int base, int maze[12][12], int *search, int row, int col)
  59. {
  60.       if(0 == maze[row-1][col])
  61.       {
  62.             search[base++] = row + col * 100 - 1;
  63.             maze[row-1][col] = -DN;
  64.       }
  65.       else if(0 > maze[row-1][col])
  66.             maze[row-1][col] -= DN;
  67.  
  68.       if(0 == maze[row+1][col])
  69.       {
  70.             search[base++] = row + col * 100 + 1;
  71.             maze[row+1][col] = -UP;
  72.       }
  73.       else if(0 > maze[row+1][col])
  74.             maze[row+1][col] -= UP;
  75.  
  76.       if(0 == maze[row][col-1])
  77.       {
  78.             search[base++] = row + col * 100 - 100;
  79.             maze[row][col-1] = -RT;
  80.       }
  81.       else if(0 > maze[row][col-1])
  82.             maze[row][col-1] -= RT;
  83.  
  84.       if(0 == maze[row][col+1])
  85.       {
  86.             search[base++] = row + col * 100 + 100;
  87.             maze[row][col+1] = -LT;
  88.       }
  89.       else if(0 > maze[row][col+1])
  90.             maze[row][col+1] -= LT;
  91.  
  92.       return base;
  93. }
  94.  
  95.  
  96. void openwall(int maze[12][12], int row, int col)
  97. {
  98.       int directions, max, direction, temprow, tempcol, temp, back;
  99.  
  100.       directions = -maze[row][col];
  101.  
  102.       max = 0;
  103.       if(directions & UP)
  104.       {
  105.             temp = rand();
  106.             if(temp > max)
  107.             {
  108.                   max = temp;
  109.                   direction = UP;
  110.                   back = DN;
  111.                   temprow = row - 1;
  112.                   tempcol = col;
  113.             }           
  114.       }
  115.  
  116.       if(directions & DN)
  117.       {
  118.             temp = rand();
  119.             if(temp > max)
  120.             {
  121.                   max = temp;
  122.                   direction = DN;
  123.                   back = UP;
  124.                   temprow = row + 1;
  125.                   tempcol = col;
  126.             }
  127.       }
  128.  
  129.       if(directions & LT)
  130.       {
  131.             temp = rand();
  132.             if(temp > max)
  133.             {
  134.                   max = temp;
  135.                   direction = LT;
  136.                   back = RT;
  137.                   temprow = row;
  138.                   tempcol = col - 1;
  139.             }
  140.       }
  141.  
  142.       if(directions & RT)
  143.       {
  144.             temp = rand();
  145.             if(temp > max)
  146.             {
  147.                   max = temp;
  148.                   direction = RT;
  149.                   back = LT;
  150.                   temprow = row;
  151.                   tempcol = col + 1;
  152.             }
  153.       }
  154.     
  155.       maze[row][col] = direction;
  156.       maze[temprow][tempcol] += back;
  157. }
  158.  
  159. void writemaze(int maze[12][12])
  160. {
  161.       int i, j;
  162.  
  163.       puts("*********************");
  164.       for(i=1 ; i<11 ; ++i)
  165.       {
  166.             putchar('*');
  167.             for(j=1 ; j<11 ; ++j)
  168.             {
  169.                   putchar(' ');
  170.                   if(maze[i][j] & RT)
  171.                         putchar(' ');
  172.                   else  putchar('*');
  173.             }
  174.             putchar('\n');
  175.             for(j=1 ; j<11 ; ++j)
  176.             {
  177.                   putchar('*');
  178.                   if(maze[i][j] & DN)
  179.                         putchar(' ');
  180.                   else  putchar('*');
  181.             }
  182.             puts("*");
  183.       }
  184. }
  185.