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

Dependencies:   mbed wave_player 4DGL-uLCD-SE MMA8452

Revision:
3:bb6f73642f01
Parent:
2:4947d6a82971
Child:
4:697e1120f821
--- a/main.cpp	Fri Oct 23 16:30:18 2020 -0400
+++ b/main.cpp	Mon Nov 16 20:38:03 2020 +0000
@@ -34,6 +34,18 @@
  * Possbile return values are defined below.
  */
 Snake snake;
+int score;
+GameInputs input;
+int main();
+void go_right();
+void go_left();
+void go_up();
+void go_down();
+int previousState;
+int thisState;
+int lives = 0;
+int main2();
+MapItem *nextHead;
 
 // Function prototypes
 
@@ -51,12 +63,41 @@
 #define GO_DOWN 6
 #define GAME_OVER 7
 #define FULL_DRAW 8
+#define INVINCIBILITY 9
+#define NOT_UP 10
+#define IN_GAME_MENU 11
+#define NOT_RIGHT 12
+
+
 // Get Actions from User (push buttons & accelerometer)
 // Based on push button and accelerometer inputs, determine which action
 // needs to be performed (may be no action).
 int get_action(GameInputs inputs)
 {
-    return 0;
+    // threshold for moving right
+    if (inputs.ax >= 0.30 && inputs.ax <= 0.60) {
+        return GO_RIGHT;
+    }
+    // threshold for moving left
+    if (inputs.ax <= -0.30 && inputs.ax >= -0.60) {
+        return GO_LEFT;
+    }
+    // threshold for moving up 
+    if (inputs.ay >= 0.30 && inputs.ay <= 0.60) {
+        return GO_UP;
+    }
+    // threshold for moving down
+    if (inputs.ay <= -0.30 && inputs.ay >= -0.60) {
+        return GO_DOWN;
+    }
+    
+    if (!inputs.b1) {
+        return INVINCIBILITY;
+    }
+    
+    // if we do not satisfy these conditions then 
+    // no action is done
+    return NO_ACTION;
 }
 /**
  * Update the game state based on the user action. For example, if the user
@@ -67,25 +108,34 @@
  * draw_game should not optimize drawing and should draw every tile, even if
  * the snake has not moved.
  */
-int update_game(int action)
-{
-    return 0;
-}
+
 
 /**
  * Draw the upper status bar.
  */
-void draw_upper_status()
+void draw_upper_status(int x, int y, int z)
 {
     uLCD.line(0, 9, 127, 9, GREEN);
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.color(0xFFFF00);
+    uLCD.locate(0,0);
+    uLCD.printf("POS:%d,%d", x, y);
+    uLCD.locate(10,0);
+    uLCD.printf("SCORE:%d", score);
 }
 
 /**
  * Draw the lower status bar.
  */
-void draw_lower_status()
+void draw_lower_status(int lives)
 {
-    uLCD.line(0, 118, 127, 118, GREEN);
+    uLCD.line(0, 118, 127, 118, 0xFFFF00);
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.color(0xFFFF00);
+    uLCD.locate(0,15);
+    uLCD.printf("LIVES:%d", lives);
 }
 
 /**
@@ -93,12 +143,13 @@
  */
 void draw_border()
 {
-    uLCD.filled_rectangle(0,     9, 127,  14, WHITE); // Top
-    uLCD.filled_rectangle(0,    13,   2, 114, WHITE); // Left
-    uLCD.filled_rectangle(0,   114, 127, 117, WHITE); // Bottom
-    uLCD.filled_rectangle(124,  14, 127, 117, WHITE); // Right
+     uLCD.filled_rectangle(0,     9, 127,  14, WHITE); // Top
+     uLCD.filled_rectangle(0,    13,   2, 114, WHITE); // Left
+     uLCD.filled_rectangle(0,   114, 127, 117, WHITE); // Bottom
+     uLCD.filled_rectangle(124,  14, 127, 117, WHITE); // Right
 }
 
+
 /**
  * Entry point for frame drawing. This should be called once per iteration of
  * the game loop. This draws all tiles on the screen, followed by the status
@@ -106,16 +157,58 @@
  * drawing tiles that have changed from the previous frame.
  */
 void draw_game(int draw_option)
-{
+{   
+    // prints game over if the player loses.
+    if (draw_option == GAME_OVER) {
+        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("GAME OVER\n");
+        draw_snake_head(u+22, v+11);
+        draw_snake_tail(u-22, 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(5, 11);
+        uLCD.printf("to retry!\n");
+        
+        do {
+        input = read_inputs();   
+        } while(input.b2);
+        
+        uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+        main();
+          
+    }
+    
     // Draw game border first
     if(draw_option == FULL_DRAW) 
     {
         draw_border();
         int u = 58;
-        int v = 56;
+        int v = 59;
+        
+        snake.head_pi = u;
+        snake.head_pj = v;
+        
+        snake.body_pi = u - 11;
+        snake.body_pj = v;
+        
+        snake.tail_pi = u - 22;
+        snake.tail_pj = v;
+        
         draw_snake_head(u, v);
         draw_snake_body(u-11, v);
         draw_snake_tail(u-22, v);
+        
         return;
     }
     // Iterate over all visible map tiles
@@ -160,8 +253,183 @@
     }
 
     // Draw status bars
-    draw_upper_status();
-    draw_lower_status();
+    draw_upper_status(snake.head_x, snake.head_y, score);
+    draw_lower_status(lives);
+}
+
+void start_game() {
+    int u = 58;
+    int v = 56; 
+    
+    uLCD.textbackground_color(GREEN);
+    uLCD.filled_rectangle(0,     9, 127,  14, WHITE); // Top
+    uLCD.filled_rectangle(0,    13,   2, 114, WHITE); // Left
+    uLCD.filled_rectangle(0,   114, 127, 117, WHITE); // Bottom
+    uLCD.filled_rectangle(124,  14, 127, 117, WHITE); // Right
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(2, 3);
+    uLCD.color(RED);
+    uLCD.printf("-Sneaky Snakey-");
+    uLCD.textbackground_color(BLUE);
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(5, 4);
+    uLCD.color(0xFFFF00);
+    uLCD.printf("ECE 2035");
+    uLCD.locate(7,5);
+    
+    draw_snake_head(u, v);
+    draw_snake_body(u-11, v);
+    draw_snake_tail(u-22, v);
+    
+    draw_goodie(u+22, v);
+    
+    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(5, 11);
+    uLCD.printf("to start!\n");
+    
+    do {
+    input = read_inputs();    
+    } while(input.b2);
+    uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+}
+
+void title_page() {
+    
+    int u = 58;
+    int v = 56; 
+    
+    uLCD.filled_rectangle(0,     9, 127,  14, 0xFFFF00); // Top
+    uLCD.filled_rectangle(0,    13,   2, 114, 0xFFFF00); // Left
+    uLCD.filled_rectangle(0,   114, 127, 117, 0xFFFF00); // Bottom
+    uLCD.filled_rectangle(124,  14, 127, 117, 0xFFFF00); // Right
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(5, 3);
+    uLCD.color(RED);
+    uLCD.printf("OBJECTIVE");
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(2, 4);
+    uLCD.color(0xFFFFFF);
+    uLCD.printf("Eat 20 goodies!");
+    
+    uLCD.locate(7,5);
+    draw_goodie(u, v);
+    draw_goodie(u-22, v);
+    draw_goodie(u+22, v);
+    
+    uLCD.textbackground_color(BLACK);
+    uLCD.color(0xFFFFFF);
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(3, 10);
+    uLCD.printf("Press  'B2'\n");
+    uLCD.locate(3, 11);
+    uLCD.printf("to continue!\n");
+    
+    do {
+    input = read_inputs();    
+    } while(input.b2);
+    uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+    
+}
+
+void helpful_items() {
+   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.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(6, 3);
+    uLCD.color(0xFFFF00);
+    uLCD.printf("BUFFS");
+    
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(3, 4);
+    uLCD.color(0xFFFFFF);
+    uLCD.printf("Extra Life!");
+    
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(2, 5);
+    uLCD.color(0xFFFFFF);
+    uLCD.printf("Invincibility");
+    
+    draw_life(u-22, v);
+    draw_shield(u+22, v);
+    
+    uLCD.textbackground_color(BLACK);
+    uLCD.color(0xFFFFFF);
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(3, 10);
+    uLCD.printf("Press  'B2'\n");
+    uLCD.locate(3, 11);
+    uLCD.printf("to continue!\n");
+    
+     do {
+    input = read_inputs();    
+    } while(input.b2);
+    uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+    
+}
+
+void harmful_items() {
+    int u = 58;
+   int v = 56; 
+   
+    uLCD.filled_rectangle(0,     9, 127,  14, RED); // Top
+    uLCD.filled_rectangle(0,    13,   2, 114, RED); // Left
+    uLCD.filled_rectangle(0,   114, 127, 117, RED); // Bottom
+    uLCD.filled_rectangle(124,  14, 127, 117, RED); // Right
+    
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(5, 3);
+    uLCD.color(0xFFA500);
+    uLCD.printf("DEBUFFS");
+    
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(4, 4);
+    uLCD.color(0xFFFFFF);
+    uLCD.printf("Slowflakes");
+    
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(3, 5);
+    uLCD.color(0xFFFFFF);
+    uLCD.printf("Life drainer");
+    
+    draw_snowflake(u-22, v);
+    draw_sword(u+22, v);
+    
+    uLCD.textbackground_color(BLACK);
+    uLCD.color(0xFFFFFF);
+    uLCD.text_width(1);
+    uLCD.text_height(1);
+    uLCD.locate(3, 10);
+    uLCD.printf("Press  'B2'\n");
+    uLCD.locate(3, 11);
+    uLCD.printf("to continue!\n");
+    
+     do {
+    input = read_inputs();    
+    } while(input.b2);
+    uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
 }
 
 /**
@@ -169,14 +437,21 @@
  * and plants in the background so you can see motion.
  */
 void init_main_map()
-{
+{   
     // "Random" plants
     Map* map = set_active_map(0);
-    for(int i = map_width() + 3; i < map_area(); i += 39) {
-        add_goodie(i % map_width(), i / map_width());
-    }
     pc.printf("plants\r\n");
 
+    add_sword(10, 10);
+    add_goodie(8, 4);
+    add_goodie(11, 3);
+    add_goodie(5, 3);
+    add_shield(8, 7);
+    add_life(14,15);
+    add_snowflake(20, 20);
+    add_plant(7, 19);
+    add_snake_head(5, 4);
+
     pc.printf("Adding walls!\r\n");
     add_wall(0,              0,              HORIZONTAL, map_width());
     add_wall(0,              map_height()-1, HORIZONTAL, map_width());
@@ -184,15 +459,17 @@
     add_wall(map_width()-1,  0,              VERTICAL,   map_height());
     pc.printf("Walls done!\r\n");
     
-    add_snake_head(snake.locations[0].x, snake.locations[0].y);
-    add_snake_body(snake.locations[1].x, snake.locations[1].y);
-    add_snake_tail(snake.locations[2].x, snake.locations[2].y);
+    //add_snake_head(snake.locations[0].x, snake.locations[0].y);
+    //add_snake_body(snake.locations[1].x, snake.locations[1].y);
+    //add_snake_tail(snake.locations[2].x, snake.locations[2].y);
     
     pc.printf("Add extra chamber\r\n");
     add_wall(30, 0, VERTICAL, 10);
     add_wall(30, 10, HORIZONTAL, 10);
     add_wall(39, 0, VERTICAL, 10);
     pc.printf("Added!\r\n");
+    
+    
 
 
     // Add stairs to chamber (map 1)
@@ -202,6 +479,309 @@
     print_map();
 }
 
+
+void go_right() {
+
+if (previousState == 0 || previousState == GO_RIGHT) {
+snake.head_x += 1;
+snake.head_y += 0;
+snake.body_x = snake.head_px;
+snake.tail_x = snake.body_px;
+snake.body_y = snake.head_py;
+snake.tail_y = snake.body_py;
+previousState = GO_RIGHT;
+}
+
+if (previousState == GO_UP || thisState == NOT_UP || previousState == GO_DOWN) {
+    if (snake.head_pj != snake.body_pj && (previousState == GO_UP || thisState == NOT_UP)) {
+    draw_nothing(snake.tail_pi, snake.tail_pj);
+    draw_nothing(snake.body_pi, snake.body_pj); 
+    draw_nothing(snake.head_pi, snake.head_pj);   
+
+    snake.body_pi = snake.head_pi - 11;
+    snake.body_pj = snake.head_pj;
+    draw_snake_body(snake.body_pi, snake.body_pj);
+    snake.tail_pi = snake.body_pi;
+    snake.tail_pj = snake.body_pj + 11;
+    draw_snake_tail(snake.tail_pi, snake.tail_pj);
+    snake.head_pi = snake.head_pi;
+    snake.head_pj = snake.head_pj;
+    draw_snake_head(snake.head_pi, snake.head_pj);
+    
+    snake.tail_x = snake.body_px;
+    snake.tail_y = snake.body_py;
+    snake.body_x = snake.head_px;
+    snake.body_y = snake.head_py;
+    snake.head_x += 0;
+    snake.head_y -= 0;
+    thisState = NOT_RIGHT;
+    }
+    
+    else if (previousState == GO_DOWN && (thisState == NOT_RIGHT)) {
+     if (snake.head_pj != snake.body_pj) {
+    draw_nothing(snake.tail_pi, snake.tail_pj);
+    draw_nothing(snake.body_pi, snake.body_pj); 
+    draw_nothing(snake.head_pi, snake.head_pj);  
+    
+    snake.body_pi = snake.head_pi - 11;
+    snake.body_pj = snake.head_pj;
+    draw_snake_body(snake.body_pi, snake.body_pj);
+    snake.tail_pi = snake.body_pi;
+    snake.tail_pj = snake.body_pj - 11;
+    draw_snake_tail(snake.tail_pi, snake.tail_pj);
+    snake.head_pi = snake.head_pi;
+    snake.head_pj = snake.head_pj;
+    draw_snake_head(snake.head_pi, snake.head_pj);
+    
+    snake.tail_x = snake.body_px;
+    snake.tail_y = snake.body_py;
+    snake.body_x = snake.head_px;
+    snake.body_y = snake.head_py;
+    snake.head_x += 0;
+    snake.head_y -= 0;
+       }
+    }
+    
+    else {
+    draw_nothing(snake.tail_pi, snake.tail_pj);
+    draw_nothing(snake.body_pi, snake.body_pj); 
+    draw_nothing(snake.head_pi, snake.head_pj);   
+
+    snake.body_pi = snake.body_pi;
+    snake.body_pj = snake.body_pj;
+    draw_snake_body(snake.body_pi, snake.body_pj);
+    snake.tail_pi = snake.body_pi - 11;
+    snake.tail_pj = snake.body_pj;
+    draw_snake_tail(snake.tail_pi, snake.tail_pj);
+    snake.head_pi = snake.head_pi;
+    snake.head_pj = snake.head_pj;
+    draw_snake_head(snake.head_pi, snake.head_pj);
+    
+    snake.tail_x = snake.body_px;
+    snake.tail_y = snake.body_py;
+    snake.body_x = snake.head_px;    
+    snake.body_y = snake.head_py;
+    snake.head_x += 0;
+    snake.head_y -= 0;    
+        }
+    }
+    if ((snake.head_pj == snake.tail_pj) && (snake.body_pj == snake.tail_pj)) {
+    previousState = GO_RIGHT;
+    }
+
+wait(0.1);
+}
+
+void go_left() { 
+snake.head_x -= 1;
+snake.body_x = snake.head_px;
+snake.tail_x = snake.body_px;
+snake.head_y += 0;
+snake.body_y = snake.head_py;
+snake.tail_y = snake.body_py; 
+}
+
+void go_up() {
+    
+if (previousState == GO_UP) {
+snake.head_x += 0;
+snake.head_y -= 1;
+snake.body_x = snake.head_px;
+snake.tail_x = snake.body_px;
+snake.body_y = snake.head_py;
+snake.tail_y = snake.body_py;
+}
+
+if (previousState == 0 || previousState == GO_RIGHT) { 
+if (snake.head_pi != snake.body_pi) {  
+draw_nothing(snake.tail_pi, snake.tail_pj);
+draw_nothing(snake.body_pi, snake.body_pj);
+draw_nothing(snake.head_pi, snake.head_pj);
+snake.body_pi = snake.head_pi;
+snake.body_pj = snake.head_pj + 11;
+draw_snake_body(snake.body_pi, snake.body_pj);
+snake.tail_pi = snake.body_pi - 11;
+snake.tail_pj = snake.body_pj;
+draw_snake_tail(snake.tail_pi, snake.tail_pj);
+snake.head_pi = snake.head_pi;
+snake.head_pj = snake.head_pj;
+draw_snake_head(snake.head_pi, snake.head_pj);
+snake.tail_x = snake.body_px;
+snake.tail_y = snake.body_py;
+snake.body_x = snake.head_px;
+snake.body_y = snake.head_py;
+snake.head_x += 0;
+snake.head_y -= 0;
+thisState = NOT_UP;
+}
+else {
+    draw_nothing(snake.tail_pi, snake.tail_pj);
+draw_nothing(snake.body_pi, snake.body_pj);
+draw_nothing(snake.head_pi, snake.head_pj);
+snake.body_pi = snake.body_pi;
+snake.body_pj = snake.body_pj;
+draw_snake_body(snake.body_pi, snake.body_pj);
+snake.tail_pi = snake.body_pi;
+snake.tail_pj = snake.body_pj + 11;
+draw_snake_tail(snake.tail_pi, snake.tail_pj);
+snake.head_pi = snake.head_pi;
+snake.head_pj = snake.head_pj;
+draw_snake_head(snake.head_pi, snake.head_pj);
+snake.tail_x = snake.body_px;
+snake.tail_y = snake.body_py;
+snake.body_x = snake.head_px;
+snake.body_y = snake.head_py;
+snake.head_x += 0;
+snake.head_y -= 0;
+    }
+
+}
+
+if ((snake.head_pi == snake.tail_pi) && (snake.body_pi == snake.tail_pi)) {
+previousState = GO_UP;
+}
+
+wait(0.1);
+}
+
+void go_down() {
+    
+    if (previousState == GO_DOWN) {
+    snake.head_x += 0;
+    snake.head_y += 1;
+    snake.body_x = snake.head_px;
+    snake.tail_x = snake.body_px;
+    snake.body_y = snake.head_py;
+    snake.tail_y = snake.body_py;
+    }
+    
+    if (previousState == 0 || previousState == GO_RIGHT) {
+    if (snake.head_pi != snake.body_pi) { 
+    draw_nothing(snake.tail_pi, snake.tail_pj);
+    draw_nothing(snake.body_pi, snake.body_pj);
+    draw_nothing(snake.head_pi, snake.head_pj);
+    snake.body_pi = snake.head_pi;
+    snake.body_pj = snake.head_pj - 11;
+    draw_snake_body(snake.body_pi, snake.body_pj);
+    snake.tail_pi = snake.body_pi - 11;
+    snake.tail_pj = snake.body_pj;
+    draw_snake_tail(snake.tail_pi, snake.tail_pj);
+    snake.head_pi = snake.head_pi;
+    snake.head_pj = snake.head_pj;
+    draw_snake_head(snake.head_pi, snake.head_pj);
+    snake.tail_x = snake.body_px;
+    snake.tail_y = snake.body_py;
+    snake.body_x = snake.head_px;
+    snake.body_y = snake.head_py;
+    snake.head_x += 0;
+    snake.head_y -= 0;
+    }
+    else {
+    draw_nothing(snake.tail_pi, snake.tail_pj);
+    draw_nothing(snake.body_pi, snake.body_pj);
+    draw_nothing(snake.head_pi, snake.head_pj);
+    snake.body_pi = snake.body_pi;
+    snake.body_pj = snake.body_pj;
+    draw_snake_body(snake.body_pi, snake.body_pj);
+    snake.tail_pi = snake.body_pi;
+    snake.tail_pj = snake.body_pj - 11;
+    draw_snake_tail(snake.tail_pi, snake.tail_pj);
+    snake.head_pi = snake.head_pi;
+    snake.head_pj = snake.head_pj;
+    draw_snake_head(snake.head_pi, snake.head_pj);
+    snake.tail_x = snake.body_px;
+    snake.tail_y = snake.body_py;
+    snake.body_x = snake.head_px;
+    snake.body_y = snake.head_py;
+    snake.head_x += 0;
+    snake.head_y -= 0;
+    }
+    } 
+    
+    if ((snake.head_pi == snake.tail_pi) && (snake.body_pi == snake.tail_pi)) {
+    previousState = GO_DOWN;
+    
+    wait(0.1);
+}  
+}
+
+int update_game(int action)
+{   
+    
+    //MapItem *thisHead;
+    MapItem *nextBody;
+    snake.head_px = snake.head_x;
+    snake.body_px = snake.body_x;
+    snake.tail_px = snake.tail_x;
+    snake.head_py = snake.head_y;
+    snake.body_py = snake.body_y;
+    snake.tail_py = snake.head_y;
+    
+    switch(action) {
+        
+        case GO_RIGHT:
+        nextHead = get_east(snake.head_px, snake.head_py);
+        pc.printf("GO RIGHT\n");
+        if (nextHead->walkable) {
+           go_right();
+        }
+        if (!nextHead->walkable) {
+            draw_game(GAME_OVER);
+        }
+        break;
+        
+        case GO_LEFT:
+        nextBody = get_west(snake.body_px, snake.body_py);
+        pc.printf("GO LEFT\n");
+        if (nextHead->walkable) {
+           go_left();
+        }
+        if (!nextBody->walkable) {
+            draw_game(GAME_OVER);
+        }
+        break;
+        
+        
+        case GO_UP:
+        nextHead = get_north(snake.head_x, snake.head_y);
+        pc.printf("GO UP\n");
+        if (nextHead->walkable) {
+           go_up();
+        }
+        
+         if (!nextHead->walkable) {
+            draw_game(GAME_OVER);
+        }
+        
+        break;
+        
+        
+        case GO_DOWN:
+        nextHead = get_south(snake.head_px, snake.head_py);
+        pc.printf("GO DOWN\n");
+        if (nextHead->walkable) {
+            go_down();
+        }
+        break;
+        
+        case IN_GAME_MENU:
+        pc.printf("Menu Pressed!");
+        uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+        title_page();
+        helpful_items();
+        harmful_items();
+        main2();
+        break;
+        
+        default: break;
+        }
+        
+        
+        
+    return NO_RESULT;
+}
+
+
 /**
  * Program entry point! This is where it all begins.
  * This function or all the parts of the game. Most of your
@@ -210,9 +790,26 @@
  */
 int main()
 {
+
     // First things first: initialize hardware
     ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!");
-
+    
+    start_game();
+    //title_page();
+    //helpful_items();
+    //harmful_items();
+    
+    // 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);
     // 0. Initialize the maps -- implement this function:
     maps_init();
@@ -221,6 +818,10 @@
     // Initialize game state
     set_active_map(0);
     snake.head_x = snake.head_y = 5;
+    snake.body_x = 4;
+    snake.body_y = 5;
+    snake.tail_x = 3;
+    snake.tail_y = 5;
     // Initial drawing
     draw_game(FULL_DRAW);
     // Main game loop
@@ -254,6 +855,55 @@
     }
 }
 
+int main2() {
+    //uLCD.filled_rectangle(0, 0, 255, 255, BLACK);
+    
+    //snake_init(&snake);
+    // 0. Initialize the maps -- implement this function:
+    //maps_init();
+    //init_main_map();
+
+    // Initialize game state
+    set_active_map(0);
+    snake.head_x = snake.head_y = 5;
+    snake.body_x = 4;
+    snake.body_y = 5;
+    snake.tail_x = 3;
+    snake.tail_y = 5;
+    // Initial drawing
+    draw_game(FULL_DRAW);
+    // Main game loop
+    while(1) {
+        // Timer to measure game update speed
+        Timer t;
+        t.start();
+
+        // 1. Read inputs -- implement this function:
+        GameInputs inputs = read_inputs();
+        
+        // 2. Determine action (move, act, menu, etc.) -- implement this function:
+        int action = get_action(inputs);
+        
+        // 3. Update game -- implement this function:
+        int result = update_game(action);
+        
+        // 3b. Check for game over based on result
+        // and if so, handle game over -- implement this.
+                
+        // 4. Draw screen -- provided:
+        draw_game(result);
+        
+        // Compute update time
+        t.stop();
+        int dt = t.read_ms();
+
+        // Display and wait
+        // NOTE: Text is 8 pixels tall
+        if (dt < 100) wait_ms(100 - dt);
+}
+    
+    }
+
 // Plays a wavfile
 void playSound(char* wav)
 {