Snake Game using accelerometer with many fun features.
Dependencies: C12832 MMA7660 mbed
Fork of app-board-Bubble-Level by
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 }
Generated on Thu Jul 28 2022 06:31:56 by 1.7.2