C++ code for snake game

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player

Fork of MPR121_Demo by jim hamblen

Committer:
ykuris3
Date:
Mon Mar 13 20:13:00 2017 +0000
Revision:
2:97ec9d79e015
Parent:
1:2eaf4c475fde
Code developed by Lotanna Okoli; Hardware setup by Yusuf Ziya Kuris

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ykuris3 1:2eaf4c475fde 1 #include "mbed.h"
ykuris3 1:2eaf4c475fde 2 #include "mpr121.h"
ykuris3 1:2eaf4c475fde 3 #include "uLCD_4DGL.h"
ykuris3 1:2eaf4c475fde 4 #include "rtos.h"
ykuris3 1:2eaf4c475fde 5 #include "SDFileSystem.h"
ykuris3 1:2eaf4c475fde 6 #include "wave_player.h"
ykuris3 1:2eaf4c475fde 7 #include <ctime>
ykuris3 2:97ec9d79e015 8 // code developed by Lotanna Okoli and Yusuf Ziya Kuris
4180_1 0:e09703934ff4 9 DigitalOut led1(LED1);
4180_1 0:e09703934ff4 10 DigitalOut led2(LED2);
4180_1 0:e09703934ff4 11 DigitalOut led3(LED3);
4180_1 0:e09703934ff4 12 DigitalOut led4(LED4);
4180_1 0:e09703934ff4 13 // Create the interrupt receiver object on pin 26
4180_1 0:e09703934ff4 14 InterruptIn interrupt(p26);
ykuris3 1:2eaf4c475fde 15 // Setup the i2c bus on pins 9 and 10
ykuris3 1:2eaf4c475fde 16 I2C i2c(p28, p27);
ykuris3 1:2eaf4c475fde 17 uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
4180_1 0:e09703934ff4 18 // Setup the Mpr121:
4180_1 0:e09703934ff4 19 // constructor(i2c object, i2c address of the mpr121)
4180_1 0:e09703934ff4 20 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
ykuris3 1:2eaf4c475fde 21 volatile int bnum = 0;
ykuris3 1:2eaf4c475fde 22 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
ykuris3 1:2eaf4c475fde 23 AnalogOut DACout(p18);
ykuris3 1:2eaf4c475fde 24 wave_player waver(&DACout);
ykuris3 1:2eaf4c475fde 25 Timer timer;
4180_1 0:e09703934ff4 26
ykuris3 1:2eaf4c475fde 27 Mutex stdio_mutex;
ykuris3 1:2eaf4c475fde 28
ykuris3 1:2eaf4c475fde 29 Thread t1;
ykuris3 1:2eaf4c475fde 30 Thread t2;
ykuris3 1:2eaf4c475fde 31 Thread t3;
ykuris3 1:2eaf4c475fde 32
ykuris3 1:2eaf4c475fde 33 struct node {
ykuris3 1:2eaf4c475fde 34 int x;
ykuris3 1:2eaf4c475fde 35 int y;
ykuris3 1:2eaf4c475fde 36 node *next;
ykuris3 1:2eaf4c475fde 37 };
ykuris3 1:2eaf4c475fde 38
ykuris3 1:2eaf4c475fde 39 void drawNodes(node *nodes, int color);
ykuris3 1:2eaf4c475fde 40 node* getFoodNode(node *snake);
ykuris3 1:2eaf4c475fde 41 bool nodeCollision(node *nodes, node *snake, int start);
ykuris3 1:2eaf4c475fde 42
ykuris3 1:2eaf4c475fde 43 void startscreen() {
ykuris3 1:2eaf4c475fde 44 FILE *wave_file;
ykuris3 1:2eaf4c475fde 45 stdio_mutex.lock();
ykuris3 1:2eaf4c475fde 46 wave_file=fopen("/sd/startscreen.wav","r");
ykuris3 1:2eaf4c475fde 47 stdio_mutex.unlock();
ykuris3 1:2eaf4c475fde 48 waver.play(wave_file);
ykuris3 1:2eaf4c475fde 49 fclose(wave_file);
4180_1 0:e09703934ff4 50 }
4180_1 0:e09703934ff4 51
ykuris3 1:2eaf4c475fde 52 void gameover() {
ykuris3 1:2eaf4c475fde 53 FILE *wave_file;
ykuris3 1:2eaf4c475fde 54 stdio_mutex.lock();
ykuris3 1:2eaf4c475fde 55 wave_file=fopen("/sd/gameover.wav","r");
ykuris3 1:2eaf4c475fde 56 stdio_mutex.unlock();
ykuris3 1:2eaf4c475fde 57 waver.play(wave_file);
ykuris3 1:2eaf4c475fde 58 fclose(wave_file);
ykuris3 1:2eaf4c475fde 59 }
4180_1 0:e09703934ff4 60
ykuris3 1:2eaf4c475fde 61 void snakedie() {
ykuris3 1:2eaf4c475fde 62 FILE *wave_file;
ykuris3 1:2eaf4c475fde 63 stdio_mutex.lock();
ykuris3 1:2eaf4c475fde 64 wave_file=fopen("/sd/snakedie.wav","r");
ykuris3 1:2eaf4c475fde 65 stdio_mutex.unlock();
ykuris3 1:2eaf4c475fde 66 waver.play(wave_file);
ykuris3 1:2eaf4c475fde 67 fclose(wave_file);
ykuris3 1:2eaf4c475fde 68 }
4180_1 0:e09703934ff4 69
ykuris3 1:2eaf4c475fde 70 void eategg() {
ykuris3 1:2eaf4c475fde 71 FILE *wave_file;
ykuris3 1:2eaf4c475fde 72 stdio_mutex.lock();
ykuris3 1:2eaf4c475fde 73 wave_file=fopen("/sd/eategg2.wav","r");
ykuris3 1:2eaf4c475fde 74 stdio_mutex.unlock();
ykuris3 1:2eaf4c475fde 75 waver.play(wave_file);
ykuris3 1:2eaf4c475fde 76 fclose(wave_file);
ykuris3 1:2eaf4c475fde 77 }
4180_1 0:e09703934ff4 78
ykuris3 1:2eaf4c475fde 79 void stagebegin() {
ykuris3 1:2eaf4c475fde 80 FILE *wave_file;
ykuris3 1:2eaf4c475fde 81 stdio_mutex.lock();
ykuris3 1:2eaf4c475fde 82 wave_file=fopen("/sd/stagebegin.wav","r");
ykuris3 1:2eaf4c475fde 83 stdio_mutex.unlock();
ykuris3 1:2eaf4c475fde 84 waver.play(wave_file);
ykuris3 1:2eaf4c475fde 85 fclose(wave_file);
ykuris3 1:2eaf4c475fde 86 }
ykuris3 1:2eaf4c475fde 87
ykuris3 1:2eaf4c475fde 88 // Key hit/release interrupt routine
ykuris3 1:2eaf4c475fde 89 void fallInterrupt() {
ykuris3 1:2eaf4c475fde 90 int key_code = 0;
ykuris3 1:2eaf4c475fde 91 int i = 0;
ykuris3 1:2eaf4c475fde 92 int value = mpr121.read(0x00);
ykuris3 1:2eaf4c475fde 93 value += mpr121.read(0x01)<<8;
ykuris3 1:2eaf4c475fde 94 // LED demo mod
ykuris3 1:2eaf4c475fde 95 i = 0;
ykuris3 1:2eaf4c475fde 96 // puts key number out to LEDs for demo
ykuris3 1:2eaf4c475fde 97 for (i = 0; i < 12; i++) {
ykuris3 1:2eaf4c475fde 98 if (((value>>i)&0x01) == 1) {
ykuris3 1:2eaf4c475fde 99 key_code=i;
ykuris3 1:2eaf4c475fde 100 }
ykuris3 1:2eaf4c475fde 101 if (key_code != 0) {
ykuris3 1:2eaf4c475fde 102 bnum = key_code;
ykuris3 1:2eaf4c475fde 103 }
ykuris3 1:2eaf4c475fde 104
ykuris3 1:2eaf4c475fde 105 led4=key_code & 0x01;
ykuris3 1:2eaf4c475fde 106 led3=(key_code>>1) & 0x01;
ykuris3 1:2eaf4c475fde 107 led2=(key_code>>2) & 0x01;
ykuris3 1:2eaf4c475fde 108 led1=(key_code>>3) & 0x01;
4180_1 0:e09703934ff4 109 }
ykuris3 1:2eaf4c475fde 110 }
ykuris3 1:2eaf4c475fde 111
ykuris3 1:2eaf4c475fde 112 int main() {
ykuris3 1:2eaf4c475fde 113 timer.start();
4180_1 0:e09703934ff4 114 interrupt.fall(&fallInterrupt);
4180_1 0:e09703934ff4 115 interrupt.mode(PullUp);
ykuris3 1:2eaf4c475fde 116 uLCD.baudrate(3000000);
ykuris3 1:2eaf4c475fde 117 int state = 0;
ykuris3 1:2eaf4c475fde 118 int score;
ykuris3 1:2eaf4c475fde 119 int deltax;
ykuris3 1:2eaf4c475fde 120 int deltay;
ykuris3 1:2eaf4c475fde 121 float waitTime;
ykuris3 1:2eaf4c475fde 122 node *snake;
ykuris3 1:2eaf4c475fde 123 node *start;
ykuris3 1:2eaf4c475fde 124 node *end;
ykuris3 1:2eaf4c475fde 125 node *food;
ykuris3 1:2eaf4c475fde 126 bool foodEaten;
ykuris3 1:2eaf4c475fde 127 bool pause;
ykuris3 1:2eaf4c475fde 128 while (1) {
ykuris3 1:2eaf4c475fde 129 srand((unsigned)timer.read_us());
ykuris3 1:2eaf4c475fde 130 if (state == 0) {
ykuris3 1:2eaf4c475fde 131 t1.start(startscreen);
ykuris3 1:2eaf4c475fde 132 uLCD.cls();
ykuris3 1:2eaf4c475fde 133 uLCD.media_init();
ykuris3 1:2eaf4c475fde 134 uLCD.set_sector_address(0x0000, 0x0104);
ykuris3 1:2eaf4c475fde 135 uLCD.display_video(0,0);
ykuris3 1:2eaf4c475fde 136 bnum = 0;
ykuris3 1:2eaf4c475fde 137 uLCD.cls();
ykuris3 1:2eaf4c475fde 138 uLCD.media_init();
ykuris3 1:2eaf4c475fde 139 uLCD.set_sector_address(0x0000, 0x0000);
ykuris3 1:2eaf4c475fde 140 uLCD.display_image(0,0);
ykuris3 1:2eaf4c475fde 141 while (state == 0) {
ykuris3 1:2eaf4c475fde 142 if (bnum == 6) {
ykuris3 1:2eaf4c475fde 143 state = 1;
ykuris3 1:2eaf4c475fde 144 break;
ykuris3 1:2eaf4c475fde 145 }
ykuris3 1:2eaf4c475fde 146 uLCD.filled_rectangle(0, 100, 127, 127, BLACK);
ykuris3 1:2eaf4c475fde 147 wait(1);
ykuris3 1:2eaf4c475fde 148 if (bnum == 6) {
ykuris3 1:2eaf4c475fde 149 state = 1;
ykuris3 1:2eaf4c475fde 150 break;
ykuris3 1:2eaf4c475fde 151 }
ykuris3 1:2eaf4c475fde 152 uLCD.locate(0, 14);
ykuris3 1:2eaf4c475fde 153 uLCD.printf(" Press Key 6");
ykuris3 1:2eaf4c475fde 154 wait(1);
ykuris3 1:2eaf4c475fde 155 }
ykuris3 1:2eaf4c475fde 156 }
ykuris3 1:2eaf4c475fde 157 if (state == 1) {
ykuris3 1:2eaf4c475fde 158 t1.start(stagebegin);
ykuris3 1:2eaf4c475fde 159 bnum = 0;
ykuris3 1:2eaf4c475fde 160 uLCD.cls();
ykuris3 1:2eaf4c475fde 161 uLCD.filled_rectangle(0, 0, 127, 5, GREEN);
ykuris3 1:2eaf4c475fde 162 uLCD.filled_rectangle(0, 122, 127, 127, GREEN);
ykuris3 1:2eaf4c475fde 163 uLCD.filled_rectangle(0, 0, 5, 127, GREEN);
ykuris3 1:2eaf4c475fde 164 uLCD.filled_rectangle(122, 0, 127, 127, GREEN);
ykuris3 1:2eaf4c475fde 165 uLCD.text_width(2);
ykuris3 1:2eaf4c475fde 166 uLCD.text_height(2);
ykuris3 1:2eaf4c475fde 167 uLCD.text_string("LEVEL 1", 1, 3, FONT_12X16, GREEN);
ykuris3 1:2eaf4c475fde 168 wait(4);
ykuris3 1:2eaf4c475fde 169 uLCD.cls();
ykuris3 1:2eaf4c475fde 170 score = 0;
ykuris3 1:2eaf4c475fde 171 waitTime = 0.4;
ykuris3 1:2eaf4c475fde 172 uLCD.printf("Score: %d", score);
ykuris3 1:2eaf4c475fde 173 uLCD.filled_rectangle(0, 10, 127, 15, 0xEF4400);
ykuris3 1:2eaf4c475fde 174 uLCD.filled_rectangle(0, 122, 127, 127, 0xEF4400);
ykuris3 1:2eaf4c475fde 175 uLCD.filled_rectangle(0, 10, 5, 127, 0xEF4400);
ykuris3 1:2eaf4c475fde 176 uLCD.filled_rectangle(122, 10, 127, 127, 0xEF4400);
ykuris3 1:2eaf4c475fde 177 snake = new node;
ykuris3 1:2eaf4c475fde 178 start = snake;
ykuris3 1:2eaf4c475fde 179 for (int i = 4; i >= 0; i--) {
ykuris3 1:2eaf4c475fde 180 snake->x = 60 + (4*i);
ykuris3 1:2eaf4c475fde 181 snake->y = 60;
ykuris3 1:2eaf4c475fde 182 snake->next = new node;
ykuris3 1:2eaf4c475fde 183 if (i != 0) {
ykuris3 1:2eaf4c475fde 184 snake = snake->next;
ykuris3 1:2eaf4c475fde 185 }
ykuris3 1:2eaf4c475fde 186 }
ykuris3 1:2eaf4c475fde 187 snake->next = 0;
ykuris3 1:2eaf4c475fde 188 end = snake;
ykuris3 1:2eaf4c475fde 189 drawNodes(start, 0x00FF00);
ykuris3 1:2eaf4c475fde 190 food = getFoodNode(start);
ykuris3 1:2eaf4c475fde 191 drawNodes(food, 0xFFCC00);
ykuris3 1:2eaf4c475fde 192 deltax = -1;
ykuris3 1:2eaf4c475fde 193 deltay = 0;
ykuris3 1:2eaf4c475fde 194 state = 1;
ykuris3 1:2eaf4c475fde 195 foodEaten = false;
ykuris3 1:2eaf4c475fde 196 pause = false;
ykuris3 1:2eaf4c475fde 197 while (state == 1) {
ykuris3 1:2eaf4c475fde 198 if (bnum == 6) {
ykuris3 1:2eaf4c475fde 199 pause = !pause;
ykuris3 1:2eaf4c475fde 200 bnum = 0;
ykuris3 1:2eaf4c475fde 201 }
ykuris3 1:2eaf4c475fde 202 if (!pause) {
ykuris3 1:2eaf4c475fde 203 if (bnum == 2 && deltax != 1 && deltay != 0) {
ykuris3 1:2eaf4c475fde 204 deltax = -1;
ykuris3 1:2eaf4c475fde 205 deltay = 0;
ykuris3 1:2eaf4c475fde 206 } else if (bnum == 10 && deltax != -1 && deltay != 0) {
ykuris3 1:2eaf4c475fde 207 deltax = 1;
ykuris3 1:2eaf4c475fde 208 deltay = 0;
ykuris3 1:2eaf4c475fde 209 } else if (bnum == 5 && deltax != 0 && deltay != -1) {
ykuris3 1:2eaf4c475fde 210 deltax = 0;
ykuris3 1:2eaf4c475fde 211 deltay = 1;
ykuris3 1:2eaf4c475fde 212 } else if (bnum == 7 && deltax != 0 && deltay != 1) {
ykuris3 1:2eaf4c475fde 213 deltax = 0;
ykuris3 1:2eaf4c475fde 214 deltay = -1;
ykuris3 1:2eaf4c475fde 215 }
ykuris3 1:2eaf4c475fde 216 snake = new node;
ykuris3 1:2eaf4c475fde 217 snake->x = end->x + (deltax * 4);
ykuris3 1:2eaf4c475fde 218 snake->y = end->y + (deltay * 4);
ykuris3 1:2eaf4c475fde 219 snake->next = 0;
ykuris3 1:2eaf4c475fde 220 if (!(snake->x > 5 && snake->x < 122 && snake->y > 15 && snake->y < 122) || nodeCollision(snake, start, 0)) {
ykuris3 1:2eaf4c475fde 221 t1.start(snakedie);
ykuris3 1:2eaf4c475fde 222 bnum = 0;
ykuris3 1:2eaf4c475fde 223 state = 2;
ykuris3 1:2eaf4c475fde 224 break;
ykuris3 1:2eaf4c475fde 225 } else if (nodeCollision(food, snake, 0)) {
ykuris3 1:2eaf4c475fde 226 t1.start(eategg);
ykuris3 1:2eaf4c475fde 227 if (waitTime > 0) {
ykuris3 1:2eaf4c475fde 228 waitTime -= 0.01;
ykuris3 1:2eaf4c475fde 229 }
ykuris3 1:2eaf4c475fde 230 foodEaten = true;
ykuris3 1:2eaf4c475fde 231 uLCD.filled_rectangle(food->x, food->y, food->x + 3, food->y + 3, 0x000000);
ykuris3 1:2eaf4c475fde 232 end->next = snake;
ykuris3 1:2eaf4c475fde 233 end = snake;
ykuris3 1:2eaf4c475fde 234 drawNodes(end, 0x00FF00);
ykuris3 1:2eaf4c475fde 235 food = getFoodNode(start);
ykuris3 1:2eaf4c475fde 236 drawNodes(food, 0xFFCC00);
ykuris3 1:2eaf4c475fde 237 score += 10;
ykuris3 1:2eaf4c475fde 238 uLCD.filled_rectangle(0, 0, 127, 9, 0x000000);
ykuris3 1:2eaf4c475fde 239 uLCD.locate(0, 0);
ykuris3 1:2eaf4c475fde 240 uLCD.printf("Score: %d", score);
ykuris3 1:2eaf4c475fde 241
ykuris3 1:2eaf4c475fde 242 }
ykuris3 1:2eaf4c475fde 243 if (!foodEaten) {
ykuris3 1:2eaf4c475fde 244 end->next = snake;
ykuris3 1:2eaf4c475fde 245 end = snake;
ykuris3 1:2eaf4c475fde 246 drawNodes(end, 0x00FF00);
ykuris3 1:2eaf4c475fde 247 uLCD.filled_rectangle(start->x, start->y, start->x + 3, start->y + 3, 0x000000);
ykuris3 1:2eaf4c475fde 248 start = start->next;
ykuris3 1:2eaf4c475fde 249 }
ykuris3 1:2eaf4c475fde 250 foodEaten = false;
ykuris3 1:2eaf4c475fde 251 wait(waitTime);
ykuris3 1:2eaf4c475fde 252 }
ykuris3 1:2eaf4c475fde 253 }
ykuris3 1:2eaf4c475fde 254 }
ykuris3 1:2eaf4c475fde 255 if (state == 2) {
ykuris3 1:2eaf4c475fde 256 uLCD.cls();
ykuris3 1:2eaf4c475fde 257 uLCD.filled_rectangle(0, 0, 127, 5, GREEN);
ykuris3 1:2eaf4c475fde 258 uLCD.filled_rectangle(0, 122, 127, 127, GREEN);
ykuris3 1:2eaf4c475fde 259 uLCD.filled_rectangle(0, 0, 5, 127, GREEN);
ykuris3 1:2eaf4c475fde 260 uLCD.filled_rectangle(122, 0, 127, 127, GREEN);
ykuris3 1:2eaf4c475fde 261 uLCD.text_width(2);
ykuris3 1:2eaf4c475fde 262 uLCD.text_height(2);
ykuris3 1:2eaf4c475fde 263 uLCD.text_string("SCORE", 2, 2, FONT_12X16, GREEN);
ykuris3 1:2eaf4c475fde 264 char n_str[10];
ykuris3 1:2eaf4c475fde 265 sprintf(n_str, "%d", score);
ykuris3 1:2eaf4c475fde 266 int loc = 3;
ykuris3 1:2eaf4c475fde 267 if (score == 0) {
ykuris3 1:2eaf4c475fde 268 loc = 4;
ykuris3 1:2eaf4c475fde 269 }
ykuris3 1:2eaf4c475fde 270 uLCD.text_string(n_str, loc, 4, FONT_12X16, GREEN);
ykuris3 1:2eaf4c475fde 271 wait(6);
ykuris3 1:2eaf4c475fde 272 t1.start(gameover);
ykuris3 1:2eaf4c475fde 273 uLCD.cls();
ykuris3 1:2eaf4c475fde 274 uLCD.media_init();
ykuris3 1:2eaf4c475fde 275 uLCD.set_sector_address(0x0000, 0x00C3);
ykuris3 1:2eaf4c475fde 276 uLCD.display_image(0,0);
ykuris3 1:2eaf4c475fde 277 while (state == 2) {
ykuris3 1:2eaf4c475fde 278 if (bnum == 6) {
ykuris3 1:2eaf4c475fde 279 state = 1;
ykuris3 1:2eaf4c475fde 280 break;
ykuris3 1:2eaf4c475fde 281 }
ykuris3 1:2eaf4c475fde 282 uLCD.filled_rectangle(0, 100, 127, 127, BLACK);
ykuris3 1:2eaf4c475fde 283 wait(1);
ykuris3 1:2eaf4c475fde 284 if (bnum == 6) {
ykuris3 1:2eaf4c475fde 285 state = 1;
ykuris3 1:2eaf4c475fde 286 break;
ykuris3 1:2eaf4c475fde 287 }
ykuris3 1:2eaf4c475fde 288 uLCD.locate(0, 14);
ykuris3 1:2eaf4c475fde 289 uLCD.printf(" Press Key 6");
ykuris3 1:2eaf4c475fde 290 wait(1);
ykuris3 1:2eaf4c475fde 291 }
ykuris3 1:2eaf4c475fde 292 }
ykuris3 1:2eaf4c475fde 293 /*
ykuris3 1:2eaf4c475fde 294 mySpeaker.PlayNote(200.0, 0.25, 0.1);
ykuris3 1:2eaf4c475fde 295 mySpeaker.PlayNote(100.0, 0.80, 0.5);
ykuris3 1:2eaf4c475fde 296 mySpeaker.PlayNote(300.0, 0.95, 0.6);
ykuris3 1:2eaf4c475fde 297 mySpeaker.PlayNote(400.0, 0.25, 0.9);
ykuris3 1:2eaf4c475fde 298 switch (bnum) {
ykuris3 1:2eaf4c475fde 299 case 6: //number button 1
ykuris3 1:2eaf4c475fde 300 uLCD.cls();
ykuris3 1:2eaf4c475fde 301 uLCD.printf("The number is %d", bnum);
ykuris3 1:2eaf4c475fde 302 uLCD.filled_rectangle(50, 50, 100, 90, 0xFF0000);
ykuris3 1:2eaf4c475fde 303 t1.start(sound3);
ykuris3 1:2eaf4c475fde 304 break;
ykuris3 1:2eaf4c475fde 305 case 1: //number button 1
ykuris3 1:2eaf4c475fde 306 uLCD.cls();
ykuris3 1:2eaf4c475fde 307 uLCD.printf("The number is %d", bnum);
ykuris3 1:2eaf4c475fde 308 uLCD.filled_rectangle(50, 50, 100, 90, 0x0000FF);
ykuris3 1:2eaf4c475fde 309 t1.start(sound1);
ykuris3 1:2eaf4c475fde 310 break;
ykuris3 1:2eaf4c475fde 311 case 2: //number button 1 //snake color
ykuris3 1:2eaf4c475fde 312 uLCD.cls();
ykuris3 1:2eaf4c475fde 313 uLCD.printf("The number is %d", bnum);
ykuris3 1:2eaf4c475fde 314 uLCD.filled_rectangle(50, 50, 100, 90, 0x00FF00);
ykuris3 1:2eaf4c475fde 315 t1.start(sound2);
ykuris3 1:2eaf4c475fde 316 break;
ykuris3 1:2eaf4c475fde 317 case 3: //number button 1 //food color
ykuris3 1:2eaf4c475fde 318 uLCD.cls();
ykuris3 1:2eaf4c475fde 319 uLCD.printf("The number is %d", bnum);
ykuris3 1:2eaf4c475fde 320 uLCD.filled_rectangle(50, 50, 100, 90, 0xFFCC00);
ykuris3 1:2eaf4c475fde 321 break;
ykuris3 1:2eaf4c475fde 322 case 4: //number button 1
ykuris3 1:2eaf4c475fde 323 uLCD.cls();
ykuris3 1:2eaf4c475fde 324 uLCD.printf("The number is %d", bnum);
ykuris3 1:2eaf4c475fde 325 uLCD.filled_rectangle(50, 50, 100, 90, 0x777777);
ykuris3 1:2eaf4c475fde 326 break;
ykuris3 1:2eaf4c475fde 327 case 5: //number button 1
ykuris3 1:2eaf4c475fde 328 uLCD.cls();
ykuris3 1:2eaf4c475fde 329 uLCD.printf("The number is %d", bnum);
ykuris3 1:2eaf4c475fde 330 uLCD.filled_rectangle(50, 50, 100, 90, 0xEF4400);
ykuris3 1:2eaf4c475fde 331 break;
ykuris3 1:2eaf4c475fde 332 default:
ykuris3 1:2eaf4c475fde 333 break;
ykuris3 1:2eaf4c475fde 334 }
ykuris3 1:2eaf4c475fde 335 */
ykuris3 1:2eaf4c475fde 336 }
ykuris3 1:2eaf4c475fde 337 }
4180_1 0:e09703934ff4 338
ykuris3 1:2eaf4c475fde 339 void drawNodes(node *nodes, int color) {
ykuris3 1:2eaf4c475fde 340 while (nodes != 0) {
ykuris3 1:2eaf4c475fde 341 uLCD.filled_rectangle(nodes->x, nodes->y, nodes->x + 3, nodes->y + 3, color);
ykuris3 1:2eaf4c475fde 342 //uLCD.rectangle(nodes->x - 1, nodes->y - 1, nodes->x + 4, nodes->y + 4, BLACK);
ykuris3 1:2eaf4c475fde 343 nodes = nodes->next;
4180_1 0:e09703934ff4 344 }
4180_1 0:e09703934ff4 345 }
4180_1 0:e09703934ff4 346
ykuris3 1:2eaf4c475fde 347 node* getFoodNode(node *snake) {
ykuris3 1:2eaf4c475fde 348 bool leave = false;
ykuris3 1:2eaf4c475fde 349 bool check = false;
ykuris3 1:2eaf4c475fde 350 node *food = new node;
ykuris3 1:2eaf4c475fde 351 food->next = 0;
ykuris3 1:2eaf4c475fde 352 while (!leave) {
ykuris3 1:2eaf4c475fde 353 food->x = rand()%111 + 6;
ykuris3 1:2eaf4c475fde 354 food->y = rand()%101 + 16;
ykuris3 1:2eaf4c475fde 355 check = false;
ykuris3 1:2eaf4c475fde 356 check = nodeCollision(food, snake, -3);
ykuris3 1:2eaf4c475fde 357 if (!check) {
ykuris3 1:2eaf4c475fde 358 leave = true;
ykuris3 1:2eaf4c475fde 359 }
ykuris3 1:2eaf4c475fde 360 }
ykuris3 1:2eaf4c475fde 361 return food;
ykuris3 1:2eaf4c475fde 362 }
4180_1 0:e09703934ff4 363
ykuris3 1:2eaf4c475fde 364 bool nodeCollision(node *nodes, node *snake, int start) {
ykuris3 1:2eaf4c475fde 365 while (snake != 0) {
ykuris3 1:2eaf4c475fde 366 for (int i = 0; i < 4; i++) {
ykuris3 1:2eaf4c475fde 367 for (int j = 0; j < 4; j++) {
ykuris3 1:2eaf4c475fde 368 for (int a = start; a < 4; a++) {
ykuris3 1:2eaf4c475fde 369 for (int b = start; b < 4; b++) {
ykuris3 1:2eaf4c475fde 370 if (((snake->x + i) == (nodes->x + a)) && ((snake->y + j) == (nodes->y + b))) {
ykuris3 1:2eaf4c475fde 371 return true;
ykuris3 1:2eaf4c475fde 372 }
ykuris3 1:2eaf4c475fde 373 }
ykuris3 1:2eaf4c475fde 374 }
ykuris3 1:2eaf4c475fde 375 }
ykuris3 1:2eaf4c475fde 376 }
ykuris3 1:2eaf4c475fde 377 snake = snake->next;
ykuris3 1:2eaf4c475fde 378 }
ykuris3 1:2eaf4c475fde 379 return false;
ykuris3 1:2eaf4c475fde 380 }
ykuris3 1:2eaf4c475fde 381
ykuris3 1:2eaf4c475fde 382
ykuris3 1:2eaf4c475fde 383