Alvin Jorgih / Mbed 2 deprecated Snake-game-fall2020-student-Shell

Dependencies:   mbed wave_player 4DGL-uLCD-SE MMA8452

Revision:
7:7ab2f4b09196
Parent:
6:fbaee888e5ea
Child:
8:34fd253d0fa5
--- a/main.cpp	Thu Nov 19 04:33:29 2020 +0000
+++ b/main.cpp	Fri Nov 20 01:55:19 2020 +0000
@@ -60,6 +60,10 @@
 int speedCounter;
 bool invincibility = false;
 int shieldCounter = 0;
+int slowflakeCounter = 0;
+void additional_info();
+int redCounter = 0;
+int blueCounter = 0;
 
 // Function prototypes
 
@@ -82,6 +86,7 @@
 #define IN_GAME_MENU 11
 #define NOT_RIGHT 12
 #define SNAKE_MAX_LENGTH 50
+#define WIN_GAME 13
 
 
 // Get Actions from User (push buttons & accelerometer)
@@ -174,6 +179,38 @@
  */
 void draw_game(int draw_option)
 {   
+    if (draw_option == WIN_GAME) {
+      int u = 58;
+      int v = 56;
+      uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+      uLCD.text_width(1);
+      uLCD.text_height(1);
+      uLCD.locate(5,7);
+      uLCD.color(RED);
+      uLCD.printf("YOU WIN\n");
+      draw_snake_head(u+11, v+11);
+      draw_snake_body(u, v+11);
+      draw_snake_tail(u-11, v+11);
+        
+      uLCD.textbackground_color(BLACK);
+      uLCD.color(0xFFFFFF);
+      uLCD.text_width(1);
+      uLCD.text_height(1);
+      uLCD.locate(4, 10);
+      uLCD.printf("Press  'B2'\n");
+      uLCD.locate(2, 11);
+      uLCD.printf("to play again!\n");  
+      
+      do {
+         input = read_inputs();   
+      } while(input.b2);
+        
+      uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+      main2();  
+        
+    }
+
+    
     // prints game over if the player loses.
    if (draw_option == GAME_OVER) {
       int u = 58;
@@ -363,10 +400,10 @@
    int u = 58;
    int v = 56; 
    
-   uLCD.filled_rectangle(0,     9, 127,  14, GREEN); // Top
-   uLCD.filled_rectangle(0,    13,   2, 114, GREEN); // Left
-   uLCD.filled_rectangle(0,   114, 127, 117, GREEN); // Bottom
-   uLCD.filled_rectangle(124,  14, 127, 117, GREEN); // Right
+   uLCD.filled_rectangle(0,     9, 127,  14, 0xADD8E6); // Top
+   uLCD.filled_rectangle(0,    13,   2, 114, 0xADD8E6); // Left
+   uLCD.filled_rectangle(0,   114, 127, 117, 0xADD8E6); // Bottom
+   uLCD.filled_rectangle(124,  14, 127, 117, 0xADD8E6); // Right
     
    uLCD.text_width(1);
    uLCD.text_height(1);
@@ -376,9 +413,9 @@
     
    uLCD.text_width(1);
    uLCD.text_height(1);
-   uLCD.locate(3, 4);
+   uLCD.locate(1, 4);
    uLCD.color(0xFFFFFF);
-   uLCD.printf("Extra Life!");
+   uLCD.printf("Score w/o length");
     
    uLCD.text_width(1);
    uLCD.text_height(1);
@@ -386,8 +423,8 @@
    uLCD.color(0xFFFFFF);
    uLCD.printf("Invincibility");
     
-   draw_life(u-22, v);
-   draw_shield(u+22, v);
+   draw_shield(u-22, v);
+   draw_blue_potion(u+22, v);
     
    uLCD.textbackground_color(BLACK);
    uLCD.color(0xFFFFFF);
@@ -422,20 +459,18 @@
     
    uLCD.text_width(1);
    uLCD.text_height(1);
-   uLCD.locate(2, 4);
+   uLCD.locate(5, 4);
    uLCD.color(0xFFFFFF);
-   uLCD.printf("FORCES 6 STEPS");
+   uLCD.printf("Reverse");
     
    uLCD.text_width(1);
    uLCD.text_height(1);
-   uLCD.locate(3, 5);
+   uLCD.locate(1, 5);
    uLCD.color(0xFFFFFF);
-   uLCD.printf("OF DIRECTION");
+   uLCD.printf("Length w/o score");
     
-   draw_arrow_down(u-33, v);
-   draw_arrow_up(u-11, v);
-   draw_arrow_right(u+33, v);
-   draw_arrow_left(u+11, v);
+   draw_red_potion(u-22, v);
+   draw_reverse(u+22, v);
     
    uLCD.textbackground_color(BLACK);
    uLCD.color(0xFFFFFF);
@@ -450,6 +485,7 @@
       input = read_inputs();    
    } while(input.b2);
    uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+   
 }
 
 void harmful_items2() {
@@ -504,6 +540,33 @@
    uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
 }
 
+void additional_info() {
+
+   input = read_inputs();
+   
+   uLCD.text_width(1);
+   uLCD.text_height(1);
+   uLCD.locate(1, 3);
+   uLCD.color(0xFFFFFF);
+   uLCD.printf("B1: OTHER ITEMS!");
+   
+   uLCD.text_width(1);
+   uLCD.text_height(1);
+   uLCD.locate(2, 6);
+   uLCD.color(0xFFFFFF);
+   uLCD.printf("B2: DIFFICULTY MODES!");
+   
+   if (!input.b1) {
+        harmful_items2();
+   }
+   
+   do {
+      input = read_inputs();    
+   } while(input.b3);
+   
+    uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+}
+
 
 /**
  * Initialize the main world map. Add walls around the edges, interior chambers,
@@ -527,8 +590,23 @@
    add_goodie(16, 5);
    add_lightspeed(15, 6);
    add_goodie(7, 5);
-   add_reverse(18, 5);
-
+   //add_reverse(18, 5);
+   //add_blue_potion(20,5);
+   add_red_potion(22, 5);
+   add_goodie(27, 5);
+   add_goodie(27, 4);
+   add_goodie(27, 3); 
+   add_goodie(26, 3);
+   add_goodie(25, 3);
+   add_goodie(24, 3);
+   add_blue_potion(8, 5);
+   for (int i = 0; i < 40; i++) {
+   add_goodie(i, 6);    
+    }
+   
+   
+   
+    
    pc.printf("Adding walls!\r\n");
    add_wall(0,              0,              HORIZONTAL, map_width());
    add_wall(0,              map_height()-1, HORIZONTAL, map_width());
@@ -615,6 +693,11 @@
      speedCounter--;
      return;  
    }
+    if (slowflakeCounter <= 20 && slowflakeCounter != 0) {
+      slowflakeCounter--;
+      wait(1);
+      return; 
+    }
 
    wait(0.2);
 }
@@ -665,6 +748,11 @@
      speedCounter--;
      return;  
    }
+    if (slowflakeCounter <= 20 && slowflakeCounter != 0) {
+      slowflakeCounter--;
+      wait(1);
+      return; 
+    }
 
    wait(0.2); 
 }
@@ -715,11 +803,22 @@
      speedCounter--;
      return;  
    }
+   
+    if (slowflakeCounter <= 20 && slowflakeCounter != 0) {
+      slowflakeCounter--;
+      wait(1);
+      return; 
+    }
 
    wait(0.2);  
 }
 
 void go_left2() {
+   
+   if (get_here(snake.head_x - 1, snake.head_y)->walkable) {
+       return;
+    }
+
    add_nothing(snake.tail_x, snake.tail_y);
 // previous coordinate of the snake head which will be used by the body
    int previousX = snake.head_x;
@@ -765,6 +864,12 @@
      speedCounter--;
      return;  
    }
+   
+   if (slowflakeCounter <= 20 && slowflakeCounter != 0) {
+      slowflakeCounter--;
+      wait(1);
+      return; 
+    }
 
    wait(0.2);  
 
@@ -783,23 +888,34 @@
     //snake.locations[0].x = snake.body_x;
     //snake.locations[0].y = snake.body_y;
     
-    pc.printf("Shield Counter: %d\n", shieldCounter);
+    if (score == 20) {
+    draw_game(WIN_GAME);    
+    }
+    
+    
+    //pc.printf("Shield Counter: %d\n", shieldCounter);
    switch(action) {
         
       case GO_RIGHT:
          nextHead = get_east(snake.head_x, snake.head_y);
          pc.printf("GO RIGHT\n");
-         if (nextHead->walkable && nextHead->type != LIFE && nextHead->type != GOODIE && nextHead->type != SWORD && nextHead->type != REVERSE && nextHead->type != LIGHTSPEED && nextHead->type != SHIELD) {
+         if (nextHead->walkable && nextHead->type != LIFE && nextHead->type != GOODIE && nextHead->type != SWORD && nextHead->type != REVERSE && nextHead->type != LIGHTSPEED && nextHead->type != SHIELD && nextHead->type != SNOWFLAKE && nextHead->type != BLUEPOTION && nextHead->type !=REDPOTION && nextHead->type != BLUEPOTION) {
             pc.printf("Before:\n");
             pc.printf("head_x: %d, head_y: %d\n", snake.head_x, snake.head_y);
             pc.printf("body_x: %d, body_y: %d\n", snake.body_x, snake.body_y);
             pc.printf("tail_x: %d, tail_y: %d\n", snake.tail_x, snake.tail_y);
             pc.printf("reverseCounter: %d\n\n", reverseCounter);
+            pc.printf("speedCounter: %d\n\n", speedCounter);
+            pc.printf("shieldCounter: %d\n\n", shieldCounter);
+            pc.printf("slowflakeCounter: %d", slowflakeCounter);
+            pc.printf("blueCounter: %d\n", blueCounter);
+            pc.printf("redCounter: %d", redCounter);
             if (reverseCounter == 0) {
             go_right2();   
             }
             if (reverseCounter <= 20 && reverseCounter != 0) {
             go_left2(); 
+            pc.printf("reverseCounter: %d", reverseCounter);
             reverseCounter--;  
             }
            //draw_snake_head(snake.head_pi, snake.head_pj);
@@ -813,6 +929,12 @@
             if (shieldCounter <= 15 && shieldCounter != 0) {
              shieldCounter--;
              }
+            if (blueCounter <= 20 && blueCounter != 0) {
+              blueCounter--;  
+            }
+            if (redCounter <= 20 && redCounter != 0) {
+              redCounter--;  
+            }
          }
         
          if (!nextHead->walkable && invincibility == false) {
@@ -832,10 +954,14 @@
          }
         
          if (nextHead->type == GOODIE) {
+            if (redCounter == 0) {
             score++;
+            }
+            
             map_erase(snake.head_x, snake.head_y);
             add_nothing(snake.head_x + 1, snake.head_y);
             
+            if (blueCounter == 0) {
             // if the snake is straight right
             if ((snake.body_x - 1) == (snake.tail_x)) {
                add_snake_body(snake.body_x - 1, snake.body_y);
@@ -902,19 +1028,22 @@
                pc.printf("i: %d\n", i);
             }
          }
+        }
         
          if (nextHead->type == SNOWFLAKE) {
-            wait(5);
+            slowflakeCounter = 20; 
             map_erase(snake.head_x, snake.head_y);
-            add_nothing(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x + 1, snake.head_y);
          } 
         
          if (nextHead->type == SWORD) {
-            if (lives == 0) {
+            if (lives == 0 && shieldCounter == 0) {
                draw_game(GAME_OVER);
             }
             else {
-               lives--;  
+               if (shieldCounter == 0) {
+               lives--; 
+               } 
             }
             map_erase(snake.head_x, snake.head_y);
             add_nothing(snake.head_x + 1, snake.head_y);
@@ -937,21 +1066,42 @@
          map_erase(snake.head_x, snake.head_y);
          add_nothing(snake.head_x + 1, snake.head_y);  
          }
+         
+         if (nextHead->type == REDPOTION) {
+         redCounter = 20; 
+         map_erase(snake.head_x, snake.head_y);
+         add_nothing(snake.head_x + 1, snake.head_y);  
+         }
+         
+         if (nextHead->type == BLUEPOTION) {
+         blueCounter = 20; 
+         map_erase(snake.head_x, snake.head_y);
+         add_nothing(snake.head_x + 1, snake.head_y);  
+         }
+         
          break;
         
       case GO_LEFT:
          nextHead = get_west(snake.head_x, snake.head_y);
          pc.printf("GO LEFT\n");
-         if (nextHead->walkable && nextHead->type != LIFE && nextHead->type != GOODIE && nextHead->type != SWORD && nextHead->type != REVERSE && nextHead->type != LIGHTSPEED && nextHead->type != SHIELD) {
+         if (nextHead->walkable && nextHead->type != LIFE && nextHead->type != GOODIE && nextHead->type != SWORD && nextHead->type != REVERSE && nextHead->type != LIGHTSPEED && nextHead->type != SHIELD && nextHead->type != SNOWFLAKE && nextHead->type != BLUEPOTION && nextHead->type != REDPOTION) {
             pc.printf("Before:\n");
             pc.printf("head_x: %d, head_y: %d\n", snake.head_x, snake.head_y);
             pc.printf("body_x: %d, body_y: %d\n", snake.body_x, snake.body_y);
             pc.printf("tail_x: %d, tail_y: %d\n", snake.tail_x, snake.tail_y);
+            pc.printf("reverseCounter: %d\n\n", reverseCounter);
+            pc.printf("speedCounter: %d\n\n", speedCounter);
+            pc.printf("shieldCounter: %d\n\n", shieldCounter);
+             pc.printf("slowflakeCounter: %d", slowflakeCounter);
+             pc.printf("blueCounter: %d", blueCounter);
+             pc.printf("redCounter: %d", redCounter);
             if (reverseCounter == 0) {
             go_left2();
             }
             if (reverseCounter <= 20 && reverseCounter != 0) {
-            go_right2();    
+            go_right2();  
+            pc.printf("reverseCounter: %d", reverseCounter);
+            reverseCounter--;  
             }
            //draw_snake_head(snake.head_pi, snake.head_pj);
            //draw_snake_body(snake.body_pi, snake.body_pj);
@@ -964,6 +1114,12 @@
             if (shieldCounter <= 15 && shieldCounter != 0) {
              shieldCounter--;
              }
+            if (blueCounter <= 20 && blueCounter != 0) {
+              blueCounter--;  
+            }
+            if (redCounter <= 20 && redCounter != 0) {
+              redCounter--;  
+            }
          }
         
          if (!nextHead->walkable && invincibility == false) {
@@ -984,9 +1140,14 @@
          }
         
          if (nextHead->type == GOODIE) {
+            if (redCounter == 0) {
             score++;
+            }
+            
             map_erase(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x - 1, snake.head_y); // eat the goodie
             
+            if (blueCounter == 0) {
             if ((snake.body_x + 1) == (snake.tail_x)) {
                add_nothing(snake.head_x - 1, snake.head_y); // eat the goodie
                add_snake_body(snake.body_x + 1, snake.body_y);
@@ -1005,7 +1166,6 @@
                add_snake_tail(snake.tail_x, snake.tail_y + 1);    
             }
             
-            
             // this places a new body coordinate before the main body, this is go right function
             for (int i = 0; i < SNAKE_MAX_LENGTH; i++) {
                if (snake.locations[i].x == 0 && snake.locations[i].y == 0) {
@@ -1051,19 +1211,23 @@
                pc.printf("i: %d\n", i);
             }
          }
+    }
+        
         
          if (nextHead->type == SNOWFLAKE) {
-            wait(5);
+            slowflakeCounter = 20; 
             map_erase(snake.head_x, snake.head_y);
-            add_nothing(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x - 1, snake.head_y);
          } 
         
-         if (nextHead->type == SWORD) {
+         if (nextHead->type == SWORD && shieldCounter == 0) {
             if (lives == 0) {
                draw_game(GAME_OVER);
             }
             else {
-               lives--;  
+               if (shieldCounter == 0) {
+               lives--; 
+               } 
             }
             map_erase(snake.head_x, snake.head_y);
             add_nothing(snake.head_x-1, snake.head_y);
@@ -1087,23 +1251,42 @@
             add_nothing(snake.head_x - 1, snake.head_y);
          }
          
+         if (nextHead->type == REDPOTION) {
+            redCounter = 20; 
+            map_erase(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x - 1, snake.head_y);
+         }
+         
+         if (nextHead->type == BLUEPOTION) {
+            blueCounter = 20; 
+            map_erase(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x - 1, snake.head_y);
+         }
          break;
         
         
       case GO_UP:
          nextHead = get_north(snake.head_x, snake.head_y);
          pc.printf("GO UP\n");
-         if (nextHead->walkable && nextHead->type != LIFE && nextHead->type != GOODIE && nextHead->type != SWORD && nextHead->type != REVERSE && nextHead->type != LIGHTSPEED && nextHead->type != SHIELD) {
+         if (nextHead->walkable && nextHead->type != LIFE && nextHead->type != GOODIE && nextHead->type != SWORD && nextHead->type != REVERSE && nextHead->type != LIGHTSPEED && nextHead->type != SHIELD && nextHead->type != SNOWFLAKE && nextHead->type != BLUEPOTION && nextHead->type != REDPOTION) {
             pc.printf("Before:\n");
             pc.printf("head_x: %d, head_y: %d\n", snake.head_x, snake.head_y);
             pc.printf("body_x: %d, body_y: %d\n", snake.body_x, snake.body_y);
             pc.printf("tail_x: %d, tail_y: %d\n", snake.tail_x, snake.tail_y);
+            pc.printf("reverseCounter: %d\n\n", reverseCounter);
+            pc.printf("speedCounter: %d\n\n", speedCounter);
+            pc.printf("shieldCounter: %d\n\n", shieldCounter);
+             pc.printf("slowflakeCounter: %d", slowflakeCounter);
+             pc.printf("blueCounter: %d", blueCounter);
+             pc.printf("redCounter: %d", redCounter);
             // reverse direction 
             if (reverseCounter == 0) {
             go_up2();
             }
             if (reverseCounter <= 20 && reverseCounter != 0) {
             go_down2();   
+            pc.printf("reverseCounter: %d", reverseCounter);
+            reverseCounter--;
             }
            //draw_snake_head(snake.head_pi, snake.head_pj);
            //draw_snake_body(snake.body_pi, snake.body_pj);
@@ -1116,6 +1299,12 @@
             if (shieldCounter <= 15 && shieldCounter != 0) {
              shieldCounter--;
              }
+            if (blueCounter <= 20 && blueCounter != 0) {
+              blueCounter--;  
+            }
+            if (redCounter <= 20 && redCounter != 0) {
+              redCounter--;  
+            }
          }
         
          if (!nextHead->walkable && invincibility == false) {
@@ -1136,10 +1325,15 @@
          }
         
          if (nextHead->type == GOODIE) {
+            
+            if (redCounter == 0) {
             score++;
+            }
+            
             map_erase(snake.head_x, snake.head_y);
             add_nothing(snake.head_x, snake.head_y - 1); // eat the goodie
             
+            if (blueCounter == 0) {
             if ((snake.body_x - 1) == snake.tail_x) {
                add_snake_body(snake.body_x - 1, snake.body_y);
                add_snake_tail(snake.tail_x - 1, snake.tail_y);
@@ -1155,6 +1349,7 @@
                add_snake_tail(snake.tail_x, snake.tail_y + 1);
             }
             
+    
             // this places a new body coordinate before the main body, this is go right function
             for (int i = 0; i < SNAKE_MAX_LENGTH; i++) {
                if (snake.locations[i].x == 0 && snake.locations[i].y == 0) {
@@ -1204,19 +1399,22 @@
                pc.printf("i: %d\n", i);
             }
          }
+        }
         
          if (nextHead->type == SNOWFLAKE) {
-            wait(5);
+            slowflakeCounter = 20; 
             map_erase(snake.head_x, snake.head_y);
-            add_nothing(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x - 1, snake.head_y);
          } 
         
-         if (nextHead->type == SWORD) {
+         if (nextHead->type == SWORD && shieldCounter == 0) {
             if (lives == 0) {
                draw_game(GAME_OVER);
             }
             else {
-               lives--;  
+               if (shieldCounter == 0) {
+               lives--; 
+               } 
             }
             map_erase(snake.head_x, snake.head_y);
             add_nothing(snake.head_x, snake.head_y);
@@ -1234,28 +1432,46 @@
             add_nothing(snake.head_x, snake.head_y - 1);
          }
          
-         if (nextHead->type == LIGHTSPEED) {
+         if (nextHead->type == SHIELD) {
             shieldCounter = 15; 
             map_erase(snake.head_x, snake.head_y);
             add_nothing(snake.head_x, snake.head_y - 1);
          }
-        
+         
+        if (nextHead->type == BLUEPOTION) {
+            blueCounter = 20; 
+            map_erase(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x, snake.head_y - 1);
+         }
+         if (nextHead->type == REDPOTION) {
+            redCounter = 20; 
+            map_erase(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x, snake.head_y - 1);
+         }
          break;
         
         
       case GO_DOWN:
          nextHead = get_south(snake.head_x, snake.head_y);
          pc.printf("GO DOWN\n");
-         if (nextHead->walkable && nextHead->type != LIFE && nextHead->type != GOODIE && nextHead->type != SWORD && nextHead->type != REVERSE && nextHead->type != LIGHTSPEED && nextHead->type != SHIELD) {
+         if (nextHead->walkable && nextHead->type != LIFE && nextHead->type != GOODIE && nextHead->type != SWORD && nextHead->type != REVERSE && nextHead->type != LIGHTSPEED && nextHead->type != SHIELD && nextHead->type != SNOWFLAKE && nextHead->type != BLUEPOTION && nextHead->type != REDPOTION) {
             pc.printf("Before:\n");
             pc.printf("head_x: %d, head_y: %d\n", snake.head_x, snake.head_y);
             pc.printf("body_x: %d, body_y: %d\n", snake.body_x, snake.body_y);
             pc.printf("tail_x: %d, tail_y: %d\n", snake.tail_x, snake.tail_y);
+            pc.printf("reverseCounter: %d\n\n", reverseCounter);
+            pc.printf("speedCounter: %d\n\n", speedCounter);
+            pc.printf("shieldCounter: %d\n\n", shieldCounter);
+            pc.printf("slowflakeCounter: %d", slowflakeCounter);
+            pc.printf("blueCounter: %d", blueCounter);
+            pc.printf("redCounter: %d", redCounter);
             if (reverseCounter == 0) {
             go_down2();
             }
             if (reverseCounter <= 20 && reverseCounter !=0) {
             go_up2();    
+            pc.printf("reverseCounter: %d", reverseCounter);
+            reverseCounter--;
             }
             //draw_snake_head(snake.head_pi, snake.head_pj);
            //draw_snake_body(snake.body_pi, snake.body_pj);
@@ -1268,6 +1484,12 @@
             if (shieldCounter <= 15 && shieldCounter != 0) {
              shieldCounter--;
              }
+            if (blueCounter <= 20 && blueCounter != 0) {
+              blueCounter--;  
+            }
+            if (redCounter <= 20 && redCounter != 0) {
+              redCounter--;  
+            }
          }
          
          if (!nextHead->walkable && invincibility == false) {
@@ -1288,10 +1510,15 @@
          }
         
          if (nextHead->type == GOODIE) {
+            
+            if (redCounter == 0) {
             score++;
+            }
+            
             map_erase(snake.head_x, snake.head_y);
             add_nothing(snake.head_x, snake.head_y + 1); // eat the goodie
             
+            if (blueCounter == 0) {
             // if the tail is to the left of the body
             if ((snake.body_x - 1) == snake.tail_x) {
                add_snake_body(snake.body_x - 1, snake.body_y);
@@ -1358,20 +1585,23 @@
                }
                pc.printf("i: %d\n", i);
             }
-         }
+        }
+     }
         
          if (nextHead->type == SNOWFLAKE) {
-            wait(5);
+            slowflakeCounter = 20; 
             map_erase(snake.head_x, snake.head_y);
-            add_nothing(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x - 1, snake.head_y);
          } 
         
-         if (nextHead->type == SWORD) {
+         if (nextHead->type == SWORD && shieldCounter == 0) {
             if (lives == 0) {
                draw_game(GAME_OVER);
             }
             else {
-               lives--;  
+               if (shieldCounter == 0) {
+               lives--; 
+               } 
             }
             map_erase(snake.head_x, snake.head_y);
             add_nothing(snake.head_x, snake.head_y+1);
@@ -1389,12 +1619,24 @@
             add_nothing(snake.head_x, snake.head_y + 1);
          }
          
-         if (nextHead->type == LIGHTSPEED) {
+         if (nextHead->type == SHIELD) {
             shieldCounter = 15; 
             map_erase(snake.head_x, snake.head_y);
             add_nothing(snake.head_x, snake.head_y + 1);
          }
          
+         if (nextHead->type == REDPOTION) {
+            redCounter = 20; 
+            map_erase(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x, snake.head_y + 1);
+         }
+         
+         if (nextHead->type == BLUEPOTION) {
+            blueCounter = 20; 
+            map_erase(snake.head_x, snake.head_y);
+            add_nothing(snake.head_x, snake.head_y + 1);
+         }
+         
          break;
         
       case HAX: 
@@ -1419,7 +1661,6 @@
  */
 int main()
 {
-   time_t t;
     // First things first: initialize hardware
    ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!");
     
@@ -1427,7 +1668,7 @@
     //title_page();
     //helpful_items();
     //harmful_items();
-    //harmful_items2();
+    //additional_info();
     
     // loading screen
     //uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
@@ -1491,12 +1732,35 @@
 }
 
 int main2() {
+    // First things first: initialize hardware
+   ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!");
+    
+    //start_game();
+    //title_page();
+    //helpful_items();
+    //harmful_items();
+    //additional_info();
+    
+    // loading screen
+    //uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+    //uLCD.textbackground_color(BLACK);
+    //uLCD.color(0xFFFFFF);
+    //uLCD.locate(4,7);
+    //uLCD.printf("GOOD LUCK!");
+    //uLCD.locate(4,8);
+    //uLCD.printf("Loading...");
+    //wait(4);
     //uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
     
-    //snake_init(&snake);
+   snake_init(&snake);
     // 0. Initialize the maps -- implement this function:
-    //maps_init();
-    //init_main_map();
+   maps_init();
+    
+
+    
+   init_main_map();
+        //init_map_2();
+    
 
     // Initialize game state
    set_active_map(0);
@@ -1536,7 +1800,7 @@
         // NOTE: Text is 8 pixels tall
       if (dt < 100) wait_ms(100 - dt);
    }
-    
+
 }
 
 // Plays a wavfile