Snake Game using accelerometer with many fun features.

Dependencies:   C12832 MMA7660 mbed

Fork of app-board-Bubble-Level by jim hamblen

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 //#include "C12832_lcd.h"
00003 #include "C12832.h"
00004 #include "motion_detect.h"
00005 
00006 #define N 200
00007 #define LEFT 0
00008 #define RIGHT 1
00009 #define UP 2
00010 #define DOWN 3
00011 
00012 #define WIDTH 128
00013 #define HEIGHT 32
00014 
00015 #define WIDTH_MOD 32
00016 #define HEIGHT_MOD 8
00017 
00018 DigitalIn fire(p14);
00019 BusIn joy(p15,p12,p13,p16);
00020 static C12832 lcd(p5, p7, p6, p8, p11);
00021 //static C12832_LCD lcd;
00022 PwmOut spkr(p26);
00023 
00024 
00025 int level = 1;
00026 int score = 0;
00027 bool acc_joy = true;
00028 
00029 struct Food {
00030     int x;
00031     int y;
00032     int yes;
00033 } food;
00034 
00035 struct Snake {
00036     int x[N];
00037     int y[N];
00038     int node_num;
00039     int direction;
00040     int life;
00041 } snake;
00042 
00043 void generate_food() {
00044     food.x = rand() % WIDTH_MOD * 4;
00045     food.y = rand() % HEIGHT_MOD * 4;
00046 }
00047 
00048 bool check_joy() {
00049     if(joy == 0) {
00050         return false;
00051     }
00052     if(joy == 1) {
00053         if(snake.direction != DOWN) {
00054             snake.direction = UP;
00055         }
00056     }
00057     if(joy == 2) {
00058         if(snake.direction != UP) {
00059             snake.direction = DOWN;
00060         }
00061     }
00062     if(joy == 4) {
00063         if(snake.direction != RIGHT) {
00064             snake.direction = LEFT;
00065         }
00066     }
00067     if(joy == 8) {
00068         if(snake.direction != LEFT) {
00069             snake.direction = RIGHT;
00070         }
00071     }
00072     return true;
00073 }
00074 
00075 void game_play() {
00076     level = 1;
00077     score = 0;
00078     acc_joy = true;
00079     food.yes = 1;
00080     snake.life = 1;
00081     snake.direction = RIGHT;
00082     snake.x[0] = 72;
00083     snake.y[0] = 16;
00084     snake.x[1] = 68;
00085     snake.y[1] = 16;
00086     snake.x[2] = 64;
00087     snake.y[2] = 16;
00088     snake.node_num = 3;
00089     
00090     while(true) {
00091         if(fire) {
00092             acc_joy = !acc_joy;
00093         }
00094         if(acc_joy == false) {
00095             check_joy();
00096         }
00097         if(acc_joy == true) {
00098             motion_detect(snake.direction);
00099         }
00100         if(food.yes == 1) {
00101             generate_food();
00102             food.yes = 0;
00103         }
00104         lcd.fillrect(snake.x[snake.node_num - 1], snake.y[snake.node_num - 1], snake.x[snake.node_num - 1] + 3, snake.y[snake.node_num - 1] + 3, 0);
00105         if(food.yes == 0) {
00106             lcd.fillrect(food.x, food.y, food.x + 3, food.y + 3, 1);
00107         }        
00108         for(int i = snake.node_num - 1; i > 0; i--) {
00109             snake.x[i] = snake.x[i - 1];
00110             snake.y[i] = snake.y[i - 1];
00111         }
00112         switch(snake.direction) {
00113             case UP:
00114                 snake.y[0] -= 4; break;
00115             case DOWN:
00116                 snake.y[0] += 4; break;
00117             case LEFT:
00118                 snake.x[0] -= 4; break;
00119             case RIGHT:
00120                 snake.x[0] += 4; break;
00121         }
00122         for(int i = 3; i < snake.node_num; i++) {
00123             if(snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0]) {
00124                 snake.life = 0;
00125                 break;
00126             }
00127         }
00128         
00129         if(snake.x[0] < 0 || snake.x[0] > 128 || snake.y[0] < 0 || snake.y[0] > 32 || snake.life == 0) {
00130             break;
00131         }
00132         
00133         if(snake.x[0] == food.x && snake.y[0] == food.y) {
00134             lcd.fillrect(food.x, food.y, food.x + 3, food.y + 3, 0);
00135             snake.x[snake.node_num] = -20;
00136             snake.y[snake.node_num] = -20;
00137             snake.node_num++;
00138             food.yes = 1;
00139             score += 10 * level;
00140             if(snake.node_num % 5 == 0) {
00141                 level++;
00142             }
00143         }
00144         
00145         for(int i = 0; i < snake.node_num; i++) {
00146             lcd.fillrect(snake.x[i], snake.y[i], snake.x[i] + 3, snake.y[i] + 3, 1);
00147             lcd.rect(0,0,127,31,1);
00148         }
00149         
00150         wait(0.5 - 0.1 * level);
00151     }
00152 }
00153 
00154 int main() {
00155     validity();
00156     while(true) {
00157         game_play();
00158         lcd.cls();
00159         lcd.rect(0,0,127,31,1);
00160         lcd.locate(35,6);
00161         lcd.printf("GAME OVER");
00162         lcd.locate(16,16);
00163         lcd.printf("MOVE THE JOYSTICK");
00164         while(!check_joy() && !fire) {
00165             for (float i=2000.0; i<10000.0; i+=100) {
00166                 if(check_joy() || fire) {
00167                     break;
00168                 }
00169                 spkr.period(1.0/i);
00170                 spkr=0.5;
00171                 wait(0.1);
00172             }
00173             spkr=0.0;
00174         }
00175         lcd.cls();
00176         lcd.rect(0,0,127,31,1);
00177         lcd.locate(35,6);
00178         lcd.printf("LENGTH: %d", snake.node_num);
00179         lcd.locate(35,16);
00180         lcd.printf("SCORE: %d", score);
00181                
00182         
00183         
00184         wait(3);
00185         lcd.cls();
00186     }
00187 }