It is currently Wed Jul 06, 2011 12:57 pm

All times are UTC - 8 hours




 Page 1 of 1 [ 1 post ] 
Author Message
 Post subject: Maze Generator
PostPosted: Wed Mar 02, 2011 4:51 pm 

Joined: Mon Feb 21, 2011 10:03 am
Posts: 26
Location: San Diego, CA
Here's a basic maze generator. Note that this is *not* a game - all it does is paint the maze.

/**
* Maze Generator
*
* This program draws a maze on the screen.
*
* It uses a peculiar maze generation algorithm that builds the maze
* one row at a time without keeping a history of the parts it has already
* generated.  This also means that it does not currently retain enough
* information to implement a game.  That would be easy to remedy in itself,
* however this device doesn't have enough memory to do so except for a
* fairly coarse maze.  Perhaps someone can take this code and do more with it.
*
* You can change the density of the maze by setting CELL_SIZE (minimum 2)
*
* Copyright (C) 2011, Duane Maxwell [email protected]
*
* Permission to use, copy, modify, and/or distribute this software for 
* any purpose with or without fee is hereby granted, provided that the 
* above copyright notice and this permission notice appear in all copies. 

* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 
* BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES 
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
* SOFTWARE.
**/

#include <pulse_os.h>
#include <pulse_types.h>

#include <stdint.h>

// a simple random number generator
uint32_t m_w, m_z;

void srand() {
   struct pulse_time_tm tm;
   pulse_get_time_date(&tm);
   m_w = (((tm.tm_hour<<6)+tm.tm_min)<<6)+tm.tm_sec;
   m_z = (((tm.tm_year<<4)+tm.tm_mon)<<5)+tm.tm_mday;
}

uint32_t rand() {
   m_z = 36969L * (m_z & 65535L) + (m_z >> 16);
   m_w = 18000L * (m_w & 65535L) + (m_w >> 16);
   return ((m_w & 0x65535L) + (m_z << 16)) & 0x7fffffff;
}


#define CELL_SIZE 4
#define CELLS_PER_ROW ((SCREEN_WIDTH)/CELL_SIZE)
#define ROWS_PER_SCREEN ((SCREEN_HEIGHT-1)/CELL_SIZE)

int x,y;

void resetMaze() {
   pulse_blank_canvas();
   x = 0;
   y = -CELL_SIZE+1;
}

color24_t white = {0xff,0xff,0xff,0x00};

void output(char *s) {
   char c;
   int i;
   while ((c=(*s++))) {
      switch (c) {
         case '|':
            pulse_set_draw_window(x,y-1,x,y+CELL_SIZE-1);
            for (i=0;i<=CELL_SIZE;i++) {
               pulse_draw_point24(white);
            }
         case '.':
            break;
         case '_':
            pulse_set_draw_window(x,y+CELL_SIZE-1,x+CELL_SIZE,y+CELL_SIZE-1);
            for (i=0;i<=CELL_SIZE;i++) {
               pulse_draw_point24(white);
            }
         case ' ':
            x += CELL_SIZE;
            break;
         case '\n':
            x = 0; y += CELL_SIZE;
            break;
      }
   }
}

void drawMaze() {
   resetMaze();
   char out[3] = "XX";
   int c,e;
   int left[CELLS_PER_ROW],right[CELLS_PER_ROW];
   left[0] = 1;
   for (e=CELLS_PER_ROW; --e; left[e] = right[e] = e)
      output("._");
   output("\n|");
   int height = ROWS_PER_SCREEN;
   while (--height) {
      for (c=CELLS_PER_ROW; --c; output(out)) {
         if (c != (e=left[c-1]) && 6<<27<rand()) {
            right[e] = right[c];
            left[right[c]] = e;
            right[c] = c-1;
            left[c-1] = c;
            out[1] = '.';
         } else {
            out[1] = '|';
         }
         if (c != (e=left[c]) && 6<<27<rand()) {
            right[e] = right[c];
            left[right[c]] = e;
            left[c] = c;
            right[c] = c;
            out[0] = '_';
         } else {
            out[0] = ' ';
         }
      }
      output("\n|");
   }
   out[0] = '_';
   for (c=CELLS_PER_ROW; --c; output(out)) {
      if (c != (e=left[c-1]) && (c==right[c] || 6<<27<rand())) {
         left[right[e]=right[c]] = e;
         left[right[c]=c-1] = c;
         out[1] = '.';
      } else {
         out[1] = '|';
      }
      e = left[c];
      right[e] = right[c];
      left[right[c]] = e;
      left[c] = c;
      right[c] = c;
   }
   output("\n");
}

void handle_button_causing_wakeup();

void main_app_init() {
   srand();
   pulse_blank_canvas();
   pulse_oled_set_brightness(100);
    pulse_update_power_down_timer(15000);
    pulse_register_callback(ACTION_WOKE_FROM_BUTTON, &handle_button_causing_wakeup);
   drawMaze();
}

void handle_button_causing_wakeup() {
   pulse_oled_set_brightness(100);
   pulse_update_power_down_timer(15000);
   drawMaze();
}

void main_app_handle_button_down() {
    drawMaze();
   pulse_update_power_down_timer(20000);
}

void main_app_handle_button_up() {
}

void main_app_loop() {
}

void main_app_handle_doz() {
    for (int i = 100; i >= 0; i-=6) {
        pulse_oled_set_brightness(i);
        pulse_mdelay(60);
    }
}

void main_app_handle_hardware_update(enum PulseHardwareEvent event) {
}


Attachments:

maze.jpg [ 30.2 KiB | Viewed 198 times ]
Offline
 Profile  
 
Display posts from previous:  Sort by  
 Page 1 of 1 [ 1 post ] 

All times are UTC - 8 hours


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to: