Snake Game using accelerometer with many fun features.
Dependencies: C12832 MMA7660 mbed
Fork of app-board-Bubble-Level by
main.cpp@3:2d625f49afb9, 2015-02-19 (annotated)
- Committer:
- Xinliang_Zhao
- Date:
- Thu Feb 19 10:26:14 2015 +0000
- Revision:
- 3:2d625f49afb9
- Parent:
- 2:dd83ac1aba6c
Snake game using accelerometer with many fun features
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Sissors | 0:bd0546063b0a | 1 | #include "mbed.h" |
Xinliang_Zhao | 2:dd83ac1aba6c | 2 | //#include "C12832_lcd.h" |
Xinliang_Zhao | 2:dd83ac1aba6c | 3 | #include "C12832.h" |
Xinliang_Zhao | 2:dd83ac1aba6c | 4 | #include "motion_detect.h" |
Xinliang_Zhao | 2:dd83ac1aba6c | 5 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 6 | #define N 200 |
Xinliang_Zhao | 2:dd83ac1aba6c | 7 | #define LEFT 0 |
Xinliang_Zhao | 2:dd83ac1aba6c | 8 | #define RIGHT 1 |
Xinliang_Zhao | 2:dd83ac1aba6c | 9 | #define UP 2 |
Xinliang_Zhao | 2:dd83ac1aba6c | 10 | #define DOWN 3 |
Xinliang_Zhao | 2:dd83ac1aba6c | 11 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 12 | #define WIDTH 128 |
Xinliang_Zhao | 2:dd83ac1aba6c | 13 | #define HEIGHT 32 |
Xinliang_Zhao | 2:dd83ac1aba6c | 14 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 15 | #define WIDTH_MOD 32 |
Xinliang_Zhao | 2:dd83ac1aba6c | 16 | #define HEIGHT_MOD 8 |
Xinliang_Zhao | 2:dd83ac1aba6c | 17 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 18 | DigitalIn fire(p14); |
Xinliang_Zhao | 2:dd83ac1aba6c | 19 | BusIn joy(p15,p12,p13,p16); |
Xinliang_Zhao | 2:dd83ac1aba6c | 20 | static C12832 lcd(p5, p7, p6, p8, p11); |
Xinliang_Zhao | 2:dd83ac1aba6c | 21 | //static C12832_LCD lcd; |
Xinliang_Zhao | 2:dd83ac1aba6c | 22 | PwmOut spkr(p26); |
Xinliang_Zhao | 2:dd83ac1aba6c | 23 | |
Xinliang_Zhao | 3:2d625f49afb9 | 24 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 25 | int level = 1; |
Xinliang_Zhao | 2:dd83ac1aba6c | 26 | int score = 0; |
Xinliang_Zhao | 2:dd83ac1aba6c | 27 | bool acc_joy = true; |
Xinliang_Zhao | 2:dd83ac1aba6c | 28 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 29 | struct Food { |
Xinliang_Zhao | 2:dd83ac1aba6c | 30 | int x; |
Xinliang_Zhao | 2:dd83ac1aba6c | 31 | int y; |
Xinliang_Zhao | 2:dd83ac1aba6c | 32 | int yes; |
Xinliang_Zhao | 2:dd83ac1aba6c | 33 | } food; |
Sissors | 0:bd0546063b0a | 34 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 35 | struct Snake { |
Xinliang_Zhao | 2:dd83ac1aba6c | 36 | int x[N]; |
Xinliang_Zhao | 2:dd83ac1aba6c | 37 | int y[N]; |
Xinliang_Zhao | 2:dd83ac1aba6c | 38 | int node_num; |
Xinliang_Zhao | 2:dd83ac1aba6c | 39 | int direction; |
Xinliang_Zhao | 2:dd83ac1aba6c | 40 | int life; |
Xinliang_Zhao | 2:dd83ac1aba6c | 41 | } snake; |
Xinliang_Zhao | 2:dd83ac1aba6c | 42 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 43 | void generate_food() { |
Xinliang_Zhao | 2:dd83ac1aba6c | 44 | food.x = rand() % WIDTH_MOD * 4; |
Xinliang_Zhao | 2:dd83ac1aba6c | 45 | food.y = rand() % HEIGHT_MOD * 4; |
Xinliang_Zhao | 2:dd83ac1aba6c | 46 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 47 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 48 | bool check_joy() { |
Xinliang_Zhao | 2:dd83ac1aba6c | 49 | if(joy == 0) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 50 | return false; |
Xinliang_Zhao | 2:dd83ac1aba6c | 51 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 52 | if(joy == 1) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 53 | if(snake.direction != DOWN) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 54 | snake.direction = UP; |
Xinliang_Zhao | 2:dd83ac1aba6c | 55 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 56 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 57 | if(joy == 2) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 58 | if(snake.direction != UP) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 59 | snake.direction = DOWN; |
Xinliang_Zhao | 2:dd83ac1aba6c | 60 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 61 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 62 | if(joy == 4) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 63 | if(snake.direction != RIGHT) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 64 | snake.direction = LEFT; |
Xinliang_Zhao | 2:dd83ac1aba6c | 65 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 66 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 67 | if(joy == 8) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 68 | if(snake.direction != LEFT) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 69 | snake.direction = RIGHT; |
Xinliang_Zhao | 2:dd83ac1aba6c | 70 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 71 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 72 | return true; |
Xinliang_Zhao | 2:dd83ac1aba6c | 73 | } |
Sissors | 0:bd0546063b0a | 74 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 75 | void game_play() { |
Xinliang_Zhao | 2:dd83ac1aba6c | 76 | level = 1; |
Xinliang_Zhao | 2:dd83ac1aba6c | 77 | score = 0; |
Xinliang_Zhao | 2:dd83ac1aba6c | 78 | acc_joy = true; |
Xinliang_Zhao | 2:dd83ac1aba6c | 79 | food.yes = 1; |
Xinliang_Zhao | 2:dd83ac1aba6c | 80 | snake.life = 1; |
Xinliang_Zhao | 2:dd83ac1aba6c | 81 | snake.direction = RIGHT; |
Xinliang_Zhao | 2:dd83ac1aba6c | 82 | snake.x[0] = 72; |
Xinliang_Zhao | 2:dd83ac1aba6c | 83 | snake.y[0] = 16; |
Xinliang_Zhao | 2:dd83ac1aba6c | 84 | snake.x[1] = 68; |
Xinliang_Zhao | 2:dd83ac1aba6c | 85 | snake.y[1] = 16; |
Xinliang_Zhao | 2:dd83ac1aba6c | 86 | snake.x[2] = 64; |
Xinliang_Zhao | 2:dd83ac1aba6c | 87 | snake.y[2] = 16; |
Xinliang_Zhao | 2:dd83ac1aba6c | 88 | snake.node_num = 3; |
Xinliang_Zhao | 3:2d625f49afb9 | 89 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 90 | while(true) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 91 | if(fire) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 92 | acc_joy = !acc_joy; |
Xinliang_Zhao | 2:dd83ac1aba6c | 93 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 94 | if(acc_joy == false) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 95 | check_joy(); |
Xinliang_Zhao | 2:dd83ac1aba6c | 96 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 97 | if(acc_joy == true) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 98 | motion_detect(snake.direction); |
Xinliang_Zhao | 2:dd83ac1aba6c | 99 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 100 | if(food.yes == 1) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 101 | generate_food(); |
Xinliang_Zhao | 2:dd83ac1aba6c | 102 | food.yes = 0; |
Xinliang_Zhao | 2:dd83ac1aba6c | 103 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 104 | 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); |
Xinliang_Zhao | 2:dd83ac1aba6c | 105 | if(food.yes == 0) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 106 | lcd.fillrect(food.x, food.y, food.x + 3, food.y + 3, 1); |
Xinliang_Zhao | 2:dd83ac1aba6c | 107 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 108 | for(int i = snake.node_num - 1; i > 0; i--) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 109 | snake.x[i] = snake.x[i - 1]; |
Xinliang_Zhao | 2:dd83ac1aba6c | 110 | snake.y[i] = snake.y[i - 1]; |
Xinliang_Zhao | 2:dd83ac1aba6c | 111 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 112 | switch(snake.direction) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 113 | case UP: |
Xinliang_Zhao | 2:dd83ac1aba6c | 114 | snake.y[0] -= 4; break; |
Xinliang_Zhao | 2:dd83ac1aba6c | 115 | case DOWN: |
Xinliang_Zhao | 2:dd83ac1aba6c | 116 | snake.y[0] += 4; break; |
Xinliang_Zhao | 2:dd83ac1aba6c | 117 | case LEFT: |
Xinliang_Zhao | 2:dd83ac1aba6c | 118 | snake.x[0] -= 4; break; |
Xinliang_Zhao | 2:dd83ac1aba6c | 119 | case RIGHT: |
Xinliang_Zhao | 2:dd83ac1aba6c | 120 | snake.x[0] += 4; break; |
Xinliang_Zhao | 2:dd83ac1aba6c | 121 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 122 | for(int i = 3; i < snake.node_num; i++) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 123 | if(snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0]) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 124 | snake.life = 0; |
Xinliang_Zhao | 2:dd83ac1aba6c | 125 | break; |
Xinliang_Zhao | 2:dd83ac1aba6c | 126 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 127 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 128 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 129 | if(snake.x[0] < 0 || snake.x[0] > 128 || snake.y[0] < 0 || snake.y[0] > 32 || snake.life == 0) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 130 | break; |
Xinliang_Zhao | 2:dd83ac1aba6c | 131 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 132 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 133 | if(snake.x[0] == food.x && snake.y[0] == food.y) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 134 | lcd.fillrect(food.x, food.y, food.x + 3, food.y + 3, 0); |
Xinliang_Zhao | 2:dd83ac1aba6c | 135 | snake.x[snake.node_num] = -20; |
Xinliang_Zhao | 2:dd83ac1aba6c | 136 | snake.y[snake.node_num] = -20; |
Xinliang_Zhao | 2:dd83ac1aba6c | 137 | snake.node_num++; |
Xinliang_Zhao | 2:dd83ac1aba6c | 138 | food.yes = 1; |
Xinliang_Zhao | 2:dd83ac1aba6c | 139 | score += 10 * level; |
Xinliang_Zhao | 2:dd83ac1aba6c | 140 | if(snake.node_num % 5 == 0) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 141 | level++; |
Xinliang_Zhao | 2:dd83ac1aba6c | 142 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 143 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 144 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 145 | for(int i = 0; i < snake.node_num; i++) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 146 | lcd.fillrect(snake.x[i], snake.y[i], snake.x[i] + 3, snake.y[i] + 3, 1); |
Xinliang_Zhao | 3:2d625f49afb9 | 147 | lcd.rect(0,0,127,31,1); |
Xinliang_Zhao | 2:dd83ac1aba6c | 148 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 149 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 150 | wait(0.5 - 0.1 * level); |
Sissors | 0:bd0546063b0a | 151 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 152 | } |
Sissors | 0:bd0546063b0a | 153 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 154 | int main() { |
Xinliang_Zhao | 2:dd83ac1aba6c | 155 | validity(); |
Xinliang_Zhao | 2:dd83ac1aba6c | 156 | while(true) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 157 | game_play(); |
Xinliang_Zhao | 2:dd83ac1aba6c | 158 | lcd.cls(); |
Xinliang_Zhao | 3:2d625f49afb9 | 159 | lcd.rect(0,0,127,31,1); |
Xinliang_Zhao | 2:dd83ac1aba6c | 160 | lcd.locate(35,6); |
Xinliang_Zhao | 2:dd83ac1aba6c | 161 | lcd.printf("GAME OVER"); |
Xinliang_Zhao | 2:dd83ac1aba6c | 162 | lcd.locate(16,16); |
Xinliang_Zhao | 2:dd83ac1aba6c | 163 | lcd.printf("MOVE THE JOYSTICK"); |
Xinliang_Zhao | 3:2d625f49afb9 | 164 | while(!check_joy() && !fire) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 165 | for (float i=2000.0; i<10000.0; i+=100) { |
Xinliang_Zhao | 3:2d625f49afb9 | 166 | if(check_joy() || fire) { |
Xinliang_Zhao | 2:dd83ac1aba6c | 167 | break; |
Xinliang_Zhao | 2:dd83ac1aba6c | 168 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 169 | spkr.period(1.0/i); |
Xinliang_Zhao | 2:dd83ac1aba6c | 170 | spkr=0.5; |
Xinliang_Zhao | 2:dd83ac1aba6c | 171 | wait(0.1); |
Xinliang_Zhao | 2:dd83ac1aba6c | 172 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 173 | spkr=0.0; |
Xinliang_Zhao | 2:dd83ac1aba6c | 174 | } |
Xinliang_Zhao | 2:dd83ac1aba6c | 175 | lcd.cls(); |
Xinliang_Zhao | 3:2d625f49afb9 | 176 | lcd.rect(0,0,127,31,1); |
Xinliang_Zhao | 2:dd83ac1aba6c | 177 | lcd.locate(35,6); |
Xinliang_Zhao | 2:dd83ac1aba6c | 178 | lcd.printf("LENGTH: %d", snake.node_num); |
Xinliang_Zhao | 2:dd83ac1aba6c | 179 | lcd.locate(35,16); |
Xinliang_Zhao | 2:dd83ac1aba6c | 180 | lcd.printf("SCORE: %d", score); |
Xinliang_Zhao | 3:2d625f49afb9 | 181 | |
Xinliang_Zhao | 3:2d625f49afb9 | 182 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 183 | |
Xinliang_Zhao | 2:dd83ac1aba6c | 184 | wait(3); |
Xinliang_Zhao | 3:2d625f49afb9 | 185 | lcd.cls(); |
Xinliang_Zhao | 2:dd83ac1aba6c | 186 | } |
Sissors | 0:bd0546063b0a | 187 | } |