//Game of Maze //Version 1.2.2 //By Benjamin Osborne //March 9, 2021 //Uses an Arduino Uno, LCD Display 20 char 4 lines, 8x8 LED display //LCD Display pins are SCL pin A5 and SDA pin A4 //Changelog //Added two rooms with coordinates 1,4 and 1,5 //Added a lose parameter that isn't a button. //Took win animation out of the winning square to easily change which square wins. //1.2.1, changed the winning square //1.2.2 //Changed around where winning room is coded // Changed it to a while loop near beginning of code //Removed coordinates and directions from LCD display and put them in serial monitor //Made starting coordinates a variable so it can be changed easily //Changed room draw names to be room[coordinate] //1.3 //Added more rooms //1.3.1 //add an enemy, random 0-6 number for die roll to beat. //add experience, +1 xp for each enemy win #include #include "LiquidCrystal_I2C.h" #include int DIN = 11; int CS = 7; int CLK = 13; const int onPin = 2; const int offPin = 3; const int upPin = 4; const int downPin = 5; const int restartPin = 8; const int selectPin = 6; int onState = 0; int offState = 0; int upState = 0; int downState = 0; int enemy1 = 1; int enemy2 = 1; int enemy1xp = 0; int enemy2xp = 0; int roll = 0; int playerxp = 0; bool left = 0; // 1 can go left 0 can't bool right = 1; // 1 can go right 0 can't bool up = 1; // 1 can go up 0 can't bool down = 0; // 1 can go down 0 can't bool restart = 0; //reset program to initial conditions. Restart game bool YouWon = 0; //Set winning bit to run win sequence bool YouLose = 0; bool SelectButton = 0; //select button bit bool RandomSet = 0; //set starting room byte startX = 2; byte startY = 2; byte RightorLeft = startX; byte UporDown = startY; LedControl lc=LedControl(DIN, CLK, CS,0); LiquidCrystal_I2C lcd(0x27,20,4); // This is the map of the maze. int room00 [8] ={B11111111,B10000001,B10000001,B10000001,B10000001,B10000001,B10000001,B11100111 }; int room10 [8] ={B11111111,B10000001,B10000001,B10000000,B10000000,B10000001,B10000001,B11111111 }; int room20 [8] ={B11111111,B10000001,B10000001,B00000001,B00000001,B10000001,B10000001,B11100111 }; int room01 [8] ={B11100111,B10000001,B10000001,B10000000,B10000000,B10000001,B10000001,B11111111 }; int room11 [8] ={B11111111,B10000001,B10000001,B00000000,B00000000,B10000001,B10000001,B11100111 }; int room21 [8]={B11100111,B10000001,B10000001,B00000001,B00000001,B10000001,B10000001,B11100111}; int room02 [8]={B11111111,B10000001,B10000001,B10000000,B10000000,B10000001,B10000001,B11111111}; int room12 [8]={B11100111,B10000001,B10000001,B00000000,B00000000,B10000001,B10000001,B11100111}; int room22 [8]={B11100111,B10000001,B10000001,B00000000,B00000000,B10000001,B10000001,B11111111}; int room13 [8]={B11100111,B10000001,B10000001,B10000000,B10000000,B10000001,B10000001,B11100111}; int room14 [8]={B11100111,B10000001,B10000001,B10000001,B10000001,B10000001,B10000001,B11111111}; int room23 [8]={B11111111,B10000001,B10000001,B00000000,B00000000,B10000001,B10000001,B11111111}; int room33 [8]={B11111111,B10000001,B10000001,B00000000,B00000000,B10000001,B10000001,B11111111}; int room32 [8]={B11111111,B10000001,B10000001,B00000000,B00000000,B10000001,B10000001,B11111111}; int room41 [8] ={B11111111,B10000001,B10000001,B00000001,B00000001,B10000001,B10000001,B11100111 }; int room31 [8]={B11111111,B10000001,B10000001,B10000000,B10000000,B10000001,B10000001,B11111111}; int room42 [8]={B11100111,B10000001,B10000001,B00000001,B00000001,B10000001,B10000001,B11100111}; //int room43 [8]={B11100111,B10000001,B10000001,B10000001,B10000001,B10000001,B10000001,B11100111}; int room44 [8]={B11100111,B10000001,B10000001,B10000001,B10000001,B10000001,B10000001,B11111111}; int room53 [8]={B11111111,B10000001,B10000001,B00000001,B00000001,B10000001,B10000001,B11111111}; int room43 [8]={B11100111,B10000001,B10000001,B00000000,B00000000,B10000001,B10000001,B11100111}; //winning animation int youwin1 [8]={B11111111,B10000001,B10000001,B10011001,B10011001,B10000001,B10000001,B11111111}; int youwin2 [8]={B11111111,B10000001,B10100101,B10000001,B10000001,B10100101,B10000001,B11111111}; int youwin3 [8]={B11111111,B11000011,B10000001,B10000001,B10000001,B10000001,B11000011,B11111111}; int youwin4 [8]={B10000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000001}; int box [8]={B11111111,B10000001,B10000001,B10000001,B10000001,B10000001,B10000001,B11111111}; //losing animation int youlose1 [8]={B11111111,B10000001,B10000001,B10000001,B10000001,B10000001,B10000001,B11111111}; int youlose2 [8]={B00000000,B01111110,B01000010,B01000010,B01000010,B01000010,B01111110,B00000000}; int youlose3 [8]={B00000000,B00000000,B00111100,B00100100,B00100100,B00111100,B00000000,B00000000}; int youlose4 [8]={B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000,B00000000}; int youlose5 [8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}; void setup() { lcd.init(); lcd.backlight(); pinMode(onPin, INPUT); pinMode(offPin, INPUT); Serial.begin(9600); lc.shutdown(0,false); lc.setIntensity(0,0); lc.clearDisplay(0); // set enemy random xp randomSeed(analogRead(3567)); } void loop(){ onState = digitalRead(onPin); offState = digitalRead(offPin); upState = digitalRead(upPin); downState = digitalRead(downPin); restart = digitalRead(restartPin); SelectButton = digitalRead(selectPin); //lcd.setCursor(0,0); // go to start of 2nd line lcd.setCursor(0,0); lcd.print("Game of Maze "); lcd.setCursor(0,1); lcd.print("Player XP - "); lcd.print(playerxp); lcd.setCursor(0,2); lcd.print(" "); lcd.setCursor(0,3); lcd.print(" "); if(onState == HIGH) { //if(RightorLeft < 4 && right == 1) { //set maximum if(right == 1) { RightorLeft = RightorLeft += 1; //increment value up delay(750); } } if(offState == HIGH) { // if(RightorLeft > 0 && left == 1) { //set minimum if(left == 1) { //set minimum RightorLeft = RightorLeft -= 1; //decrement value down delay(750); } } if(upState == HIGH) { // if(UporDown < 4 && down == 1) { //set maximum if(down == 1) { //set UporDown = UporDown += 1; //increment value up delay(750); } } if(downState == HIGH) { //if(UporDown > 0 && up == 1) { //set minimum if(up == 1) { //set UporDown = UporDown -= 1; //decrement value down delay(750); } } // Winning Rooms if( YouWon == 1 || RightorLeft == 0 && UporDown == 2) { //set the winning room YouWon = 1; RightorLeft = startX; UporDown = startY; Serial.print("Your Won!!!"); } // Losing Rooms if( YouLose == 1 || RightorLeft == 1 && UporDown == 4) { //set the losing room YouLose = 1; RightorLeft = startX; UporDown = startY; Serial.print("Your Lose!!!"); } while( YouWon == 1){ left = 0; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't lcd.setCursor(0,2); // this is the winning square //lcd.print(restart); //print 1 if restart button is pressed lcd.print(" Hold Restart "); lcd.setCursor(0,3); // this is the winning square lcd.print(" You Win!!! "); // for(int i=0;i<8;i++) lc.setRow(0,i,box[i]); //delay(250); for(int i=0;i<8;i++) lc.setRow(0,i,youwin1[i]); delay(250); for(int i=0;i<8;i++) lc.setRow(0,i,youwin2[i]); delay(250); for(int i=0;i<8;i++) lc.setRow(0,i,youwin3[i]); delay(250); for(int i=0;i<8;i++) lc.setRow(0,i,youwin4[i]); delay(250); if(digitalRead(restartPin) == HIGH){ YouWon = 0; } } while(YouLose == 1) { left = 0; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't lcd.setCursor(0,1); // this is the winning square //lcd.print(restart); //print 1 if restart button is pressed lcd.print(" Hold Restart"); lcd.setCursor(0,2); // this is the winning square lcd.print("You have been eaten"); lcd.setCursor(0,3); // this is the winning square lcd.print("by a grue!"); // for(int i=0;i<8;i++) lc.setRow(0,i,box[i]); //delay(250); for(int i=0;i<8;i++) lc.setRow(0,i,youlose1[i]); delay(250); for(int i=0;i<8;i++) lc.setRow(0,i,youlose2[i]); delay(250); for(int i=0;i<8;i++) lc.setRow(0,i,youlose3[i]); delay(250); for(int i=0;i<8;i++) lc.setRow(0,i,youlose4[i]); delay(250); for(int i=0;i<8;i++) lc.setRow(0,i,youlose5[i]); delay(250); if(digitalRead(restartPin) == HIGH){ YouLose = 0; } } if(RandomSet == 0){ enemy1xp = random(5,50); enemy2xp = random(5,50); RandomSet = 1; } while(enemy1 == 1 && RightorLeft == 2 && UporDown == 1) { left = 0; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't lcd.setCursor(0,0); lcd.print("You have encountered"); lcd.setCursor(0,1); lcd.print("a grue! "); lcd.setCursor(0,2); lcd.print("Press 'select' "); lcd.setCursor(0,3); lcd.print("to fight "); if(digitalRead(selectPin) == HIGH) { //set player roll roll = playerxp + random(100); Serial.println(roll); delay(1500); if(roll >= enemy1xp){ //player roll vs enemy xp lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); lcd.print("You rolled a "); lcd.print(roll); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,2); lcd.print("You have beat the "); lcd.setCursor(0,3); lcd.print(" grue! "); playerxp = playerxp + 10; delay(2000); enemy1 = 0; } else { lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); lcd.print("You rolled a "); lcd.print(roll); lcd.setCursor(0,1); lcd.print("You have Lost "); lcd.setCursor(0,2); lcd.print(" "); lcd.setCursor(0,3); lcd.print(" "); enemy1 = 0; restart = 1; delay(2000); } } } while(enemy2 == 1 && RightorLeft == 4 && UporDown == 4) { left = 0; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't lcd.setCursor(0,0); lcd.print("You have encountered"); lcd.setCursor(0,1); lcd.print("a grue! "); lcd.setCursor(0,2); lcd.print("Press 'select' "); lcd.setCursor(0,3); lcd.print("to fight "); if(digitalRead(selectPin) == HIGH) { //set player roll roll = playerxp + random(100); Serial.println(roll); delay(1500); if(roll >= enemy2xp){ //player roll vs enemy xp lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); lcd.print("You rolled a "); lcd.print(roll); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,2); lcd.print("You have beat the "); lcd.setCursor(0,3); lcd.print(" grue! "); playerxp = playerxp + 10; delay(2000); enemy2 = 0; } else { lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); lcd.print("You rolled a "); lcd.print(roll); lcd.setCursor(0,1); lcd.print("You have Lost "); lcd.setCursor(0,2); lcd.print(" "); lcd.setCursor(0,3); lcd.print(" "); enemy2 = 0; restart = 1; delay(2000); } } } if(RightorLeft == 0 && UporDown == 0) { left = 0; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 1; // 1 can go down 0 can't for(int i=0;i<8;i++) lc.setRow(0,i,room00[i]); } if(RightorLeft == 1 && UporDown == 0) { left = 0; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't for(int i=0;i<8;i++) lc.setRow(0,i,room10[i]); } if(RightorLeft == 2 && UporDown == 0) { for(int i=0;i<8;i++) lc.setRow(0,i,room20[i]); left = 1; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 1; // 1 can go down 0 can't } if(RightorLeft == 0 && UporDown == 1) { for(int i=0;i<8;i++) lc.setRow(0,i,room01[i]); left = 0; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 1; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't } if(RightorLeft == 1 && UporDown == 1) { for(int i=0;i<8;i++) lc.setRow(0,i,room11[i]); left = 1; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 1; // 1 can go down 0 can't } if(RightorLeft == 2 && UporDown == 1) { for(int i=0;i<8;i++) lc.setRow(0,i,room21[i]); left = 1; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 1; // 1 can go up 0 can't down = 1; // 1 can go down 0 can't } if(RightorLeft == 0 && UporDown == 2) { for(int i=0;i<8;i++) lc.setRow(0,i,room02[i]); left = 0; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't } if(RightorLeft == 1 && UporDown == 2) { for(int i=0;i<8;i++) lc.setRow(0,i,room12[i]); left = 1; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 1; // 1 can go up 0 can't down = 1; // 1 can go down 0 can't } if(RightorLeft == 2 && UporDown == 2) { for(int i=0;i<8;i++) lc.setRow(0,i,room22[i]); left = 1; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 1; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't } if(RightorLeft == 1 && UporDown == 3) { for(int i=0;i<8;i++) lc.setRow(0,i,room13[i]); left = 0; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 1; // 1 can go up 0 can't down = 1; // 1 can go down 0 can't } if(RightorLeft == 1 && UporDown == 4) { for(int i=0;i<8;i++) lc.setRow(0,i,room14[i]); left = 0; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 1; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't } if(RightorLeft == 3 && UporDown == 1) { for(int i=0;i<8;i++) lc.setRow(0,i,room31[i]); left = 0; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't } if(RightorLeft == 3 && UporDown == 3) { for(int i=0;i<8;i++) lc.setRow(0,i,room33[i]); left = 1; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't } if(RightorLeft == 4 && UporDown == 4) { for(int i=0;i<8;i++) lc.setRow(0,i,room44[i]); left = 0; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 1; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't } if(RightorLeft == 5 && UporDown == 3) { for(int i=0;i<8;i++) lc.setRow(0,i,room53[i]); left = 1; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't } if(RightorLeft == 4 && UporDown == 3) { for(int i=0;i<8;i++) lc.setRow(0,i,room43[i]); left = 1; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 1; // 1 can go up 0 can't down = 1; // 1 can go down 0 can't } if(RightorLeft == 4 && UporDown == 2) { for(int i=0;i<8;i++) lc.setRow(0,i,room42[i]); left = 1; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 1; // 1 can go up 0 can't down = 1; // 1 can go down 0 can't } if(RightorLeft == 3 && UporDown == 2) { for(int i=0;i<8;i++) lc.setRow(0,i,room32[i]); left = 1; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't } if(RightorLeft == 3 && UporDown == 1) { for(int i=0;i<8;i++) lc.setRow(0,i,room31[i]); left = 0; // 1 can go left 0 can't right = 1; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 0; // 1 can go down 0 can't } if(RightorLeft == 4 && UporDown == 1) { for(int i=0;i<8;i++) lc.setRow(0,i,room41[i]); left = 1; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 1; // 1 can go down 0 can't } if(RightorLeft == 2 && UporDown == 3) { for(int i=0;i<8;i++) lc.setRow(0,i,room23[i]); left = 1; // 1 can go left 0 can't right = 0; // 1 can go right 0 can't up = 0; // 1 can go up 0 can't down = 1; // 1 can go down 0 can't } // lcd.setCursor(0,2); //print restart bit status // lcd.print(restart); if(restart == 1){ //restart game after winning lcd.setCursor(0,3); lcd.print(" Game Over "); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,2); lcd.print(" "); delay(1000); lcd.setCursor(0,3); lcd.print(" "); restart = 0; RightorLeft = startX; UporDown = startY; RandomSet = 0; enemy1 = 1; enemy2 = 1; playerxp = 0; } //Print diagnostic stuff in serial monitor Serial.print("Coordinates:"); Serial.print(" "); Serial.print(RightorLeft); Serial.print(""); Serial.print(UporDown); Serial.print(" "); if (down == 1) { Serial.print("Down "); Serial.print(" "); } else { Serial.print("[ ]"); } if (up == 1) { Serial.print("Up "); Serial.print(" "); } else { Serial.print("[ ]"); } if (left == 1) { Serial.print("Left "); Serial.print(" "); }else { Serial.print("[ ]"); } if (right == 1) { Serial.print("Right"); Serial.print(" "); }else { Serial.print("[ ]"); } //if (YouWon == 1) { // Serial.print("Your Won!!!"); //} //Serial.println(); if(SelectButton == 1){ Serial.print("Select"); } else { Serial.print("no select "); } Serial.print("Player XP "); Serial.print(playerxp); Serial.print(" "); if(enemy1 == 1) { Serial.print("Enemy 1 active - xp "); Serial.print(enemy1xp); }else{ Serial.print("1 dead"); } Serial.print(" "); if(enemy2 == 1) { Serial.print("Enemy 2 active - xp "); Serial.print(enemy2xp); }else{ Serial.print("2 dead"); } Serial.print(" "); Serial.println(); }