While doing stuff like, making our home a little greener. Smoking meat. Working on diorama’s and my Escape game. I found time to make this little maze game.
Using an ESP32, mini joystick and a 8×8 led matrix. The objective is to get to the other side of the invisible maze.
It is a blind maze, so you have to figure out the path by trail and error. I found it quite fun and entertaining. (Coline had a hard time finishing the mode 3 maze)
I’ve got 3 settings on the maze:
0 – There is a trail where you have been.
1 – No trail, but only red leds showing walls.
2 – No trail, red reds and a reset to square 0,0 .. so you have to remember the path you previously took.
I’ll add code and schematics tomorrow …
Light blue shows you where you have been
Mode 2 game, reset when hitting a wall
Hitting the end block!
Maze is static at the moment, i’m planning to implement a “Recursive division method” to generate the maze.
Code
#include <Arduino.h> #include <Adafruit_NeoPixel.h> // joystick pins int up=33; int down=25; int left=32; int right=26; int cursor=32; // 0 easy = trail // 1 only red walls // 2 = reset to 0.0 int mode=2; //int trail=32; int trail=0; // Which pin on the Arduino is connected to the NeoPixels? #define LED_PIN 2 // How many NeoPixels are attached to the Arduino? #define LED_COUNT 64 // Declare our NeoPixel strip object: Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); // bits set opening in square // 2 // ----- // 1 | | 4 // ----- // 0 // so 5 is a passage from left to right (1+4) int maze[8][8] = { 4,5,3,6,5,5,5,3, 6,5,11,12,5,3,6,9, 14,1,12,5,3,10,12,1, 12,5,5,3,10,12,5,3, 2,6,5,9,14,5,1,10, 10,10,6,5,9,6,5,9, 12,11,10,6,1,10,6,1, 4,9,12,13,5,13,13,1, }; int displaymatrix[8][8] = { { 0,1,2,3,4,5,6,7 }, { 15,14,13,12,11,10,9,8 }, {16,17,18,19,20,21,22,23}, {31,30,29,28,27,26,25,24}, {32,33,34,35,36,37,38,39}, {47,46,45,44,43,42,41,40}, {48,49,50,51,52,53,54,55}, {63,62,61,60,59,58,57,56} }; int x = 0; int y = 0; void setup() { // joy pinMode(32, INPUT_PULLUP); pinMode(33, INPUT_PULLUP); pinMode(25, INPUT_PULLUP); pinMode(26, INPUT_PULLUP); // mode set with jumpers pinMode(34, INPUT_PULLUP); pinMode(35, INPUT_PULLUP); Serial.begin(115200); strip.begin(); strip.show(); // Initialize all pixels to 'off' strip.setBrightness(10); // set begin and end pixel strip.setPixelColor(displaymatrix[x][y], 0, 0, 255); strip.setPixelColor(displaymatrix[7][7], 0, 255, 0); strip.show(); //mode select if (digitalRead(34) == 0) { mode=0; if (digitalRead(35) == 0) { mode=2; } else { mode=1; } // finish effect uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } // reset to start (mode 2) void reset2start() { strip.setPixelColor(displaymatrix[x][y], 0, 0, 0); strip.show(); x = 0; y = 0; strip.begin(); strip.show(); // Initialize all pixels to 'off' strip.setBrightness(10); strip.setPixelColor(displaymatrix[x][y], 0, 0, 255); strip.setPixelColor(displaymatrix[7][7], 0, 255, 0); strip.show(); } // finish effect void rainbow(uint8_t wait) { uint16_t i, j; for(j=0; j<256; j++) { for(i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, Wheel((i+j) & 255)); } strip.show(); delay(wait); } } void loop() { int isUp = (bitRead(maze[x][y], 1)); int isRight = (bitRead(maze[x][y], 2)); int isDown = (bitRead(maze[x][y], 3)); int isLeft = (bitRead(maze[x][y], 0)); if (digitalRead(up) == 0) { if (isUp == 1){ strip.setPixelColor(displaymatrix[x][y], 0, 0, trail); x++; if ( x > 7) { x=7;} strip.setPixelColor(displaymatrix[x][y], 0, 0, 255); strip.show(); } else { strip.setPixelColor(displaymatrix[x][y], 255, 0, 0); strip.show(); if (mode == 2){ delay(1000); reset2start(); } } } if (digitalRead(down) == 0) { if (isDown == 1){ strip.setPixelColor(displaymatrix[x][y], 0, 0, trail); x--; if ( x < 0) { x=0;} strip.setPixelColor(displaymatrix[x][y], 0, 0, 255); strip.show(); } else { strip.setPixelColor(displaymatrix[x][y], 255, 0, 0); strip.show(); if (mode == 2){ delay(1000); reset2start(); } } } if (digitalRead(left) == 0) { if (isLeft == 1){ strip.setPixelColor(displaymatrix[x][y], 0, 0, trail); y--; if ( y < 0) { y=0;} strip.setPixelColor(displaymatrix[x][y], 0, 0, 255); strip.show(); } else { strip.setPixelColor(displaymatrix[x][y], 255, 0, 0); strip.show(); if (mode == 2){ delay(1000); reset2start(); } } } if (digitalRead(right) == 0) { if (isRight == 1){ strip.setPixelColor(displaymatrix[x][y], 0, 0, trail); y++; if ( y > 7) { y=7;} strip.setPixelColor(displaymatrix[x][y], 0, 0, 255); strip.show(); } else { strip.setPixelColor(displaymatrix[x][y], 255, 0, 0); strip.show(); if (mode == 2){ delay(1000); reset2start(); } } } if (x ==7 && y == 7){ strip.begin(); strip.show(); // Initialize all pixels to 'off' rainbow(20); } delay(200); }