Snake Game using accelerometer with many fun features.

Dependencies:   C12832 MMA7660 mbed

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

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?

UserRevisionLine numberNew 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 }