From 297095a1662f371eee96985de4c3a1cbd6d77a1d Mon Sep 17 00:00:00 2001 From: Pedro Costa Date: Thu, 13 Feb 2020 11:10:28 +0000 Subject: [PATCH] fruits + deaths --- snake.ino | 63 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/snake.ino b/snake.ino index 1bed8c5..984d855 100644 --- a/snake.ino +++ b/snake.ino @@ -1,5 +1,5 @@ #define BOARD_LENGTH 8 -#define SNAKE_MAX_SIZE 12 +#define SNAKE_MAX_SIZE 32 struct pair { int x; @@ -12,11 +12,14 @@ private: int snake_size; pair pos[64]; pair get_next_move(pair p); + pair fruitPos; + bool fruit; public: Snake() { this->state = 'U'; this->snake_size = 4; + fruit = false; for (int i = snake_size - 1; i >= 0; i--) { pair p; p.x = 5; @@ -44,11 +47,36 @@ public: pair p = pos[i]; pixels[p.x][p.y] = LOW; // TURN ON PIXELS OF SNAKE } + if(fruit) + pixels[fruitPos.x][fruitPos.y] = LOW; } - void next_move(); pair snake_head() { return pos[0]; } + void generate_fruit() { + if(!fruit) { + fruit = true; + fruitPos.x = random(7); + fruitPos.y = random(7); + } + } + void next_move() { + for (int i = snake_size; i > 0; i--) { + pos[i] = pos[i - 1]; + } + pos[0] = get_next_move(pos[0]); + if (fruit) { + if (pos[0].x == fruitPos.x && pos[0].y == fruitPos.y) { + grow(); + fruit = false; + } + } + } + bool eats_itself() { + for(int i = 1; i < snake_size; i++) + if( pos[0].x == pos[i].x && pos[0].y == pos[i].y ) return true; + return false; + } }; pair Snake::get_next_move(pair p) { @@ -74,13 +102,6 @@ pair Snake::get_next_move(pair p) { return r; } -void Snake::next_move() { - for (int i = snake_size; i > 0; i--) { - pos[i] = pos[i - 1]; - } - pos[0] = get_next_move(pos[0]); -} - void Snake::grow() { if (snake_size < SNAKE_MAX_SIZE) { pos[snake_size] = pos[snake_size - 1]; @@ -124,14 +145,36 @@ void setup() { } void loop() { - if(random(50) == 0) snake.grow(); + if(random(20) == 0) snake.generate_fruit(); snake.snake_to_matrix(pixels); snake.next_move(); // draw the screen: + if(snake.eats_itself()){ + for(int i = 0; i < 3; i++){ + for(int j = 0; j < 100; j++) + Display(); + delay(500); + } + int dead[8][8] = { + {0,1,1,1,1,1,1,0}, + {1,0,1,1,1,1,0,1}, + {1,1,0,1,1,0,1,1}, + {1,1,1,0,0,1,1,1}, + {1,1,1,0,0,1,1,1}, + {1,1,0,1,1,0,1,1}, + {1,0,1,1,1,1,0,1}, + {0,1,1,1,1,1,1,0}, + }; + for(int i = 0; i < 8; i++) + for(int j = 0; j < 8; j++) + pixels[i][j] = dead[i][j]; + while(true) Display(); + } for(int i = 0; i < 30; i++) { Display(); snake.change_state(read_sensors()); } + } void readSensors() {