Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Adafruit_GFX.h>
- #include <Adafruit_PCD8544.h>
- /******** istanze ************/
- Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6);
- /********* variabili costanti *******/
- #define LEFT 1
- #define RIGHT 2
- #define UP 3
- #define DOWN 4
- #define MAX_WIDTH 84 //risoluzione display 84x48
- #define MAX_HEIGHT 48
- /**/int x=5, y=5;
- /**/int xC, yC; //cordinate testa snake
- /**/int xFruit=0, yFruit=0; //cordinate frutto
- /**/int point=0, points=10;
- boolean left=false,right=true, up=false, down=false, pause=true;
- /**/int speakerPin = 8;
- /**/int dr = 0, dc = 1, i;
- /**/int snake_cols[260]; // vettore che contiene le cordinate delle singole parti dello snake { cols[0], row[0] } corrispondono alla testa
- /**/int snake_row[260]; // vettore che contiene le cordinate delle singole parti dello snake { cols[snake_lenght], row[snake_lenght] } corrispondono alla coda
- /**/int snake_lenght = 10; // lunghrzza snake
- /**/int level=0, time=20;
- /**/int g, m, j, l, k; //sensori ingressi (button)
- /*****************************/
- void(* reset)(void) = 0; //reset arduino
- /******** Setup *************/
- void setup() {
- Serial.begin(9600);
- randomSeed(analogRead(A0));
- display.begin();
- pinMode(speakerPin, OUTPUT);
- pinMode(9, OUTPUT);
- pinMode(10, OUTPUT);
- digitalWrite(9, HIGH);
- digitalWrite(10, HIGH);
- xFruit = display.width()/2;
- yFruit = display.height()/2;
- display.clearDisplay();
- display.setTextSize(1);
- display.setTextColor(BLACK);
- display.setCursor(0,0);
- display.println("Snake v1.0");
- display.setCursor(0,20);
- display.print("Developed by: Ouarrak Ayoub");
- display.display();
- delay(3500);
- display.clearDisplay();
- display.setTextSize(2);
- display.setTextColor(BLACK);
- display.setCursor(0,0);
- display.println("Enjoy");
- display.display();
- delay(2000);
- }
- /********** Loop ***********/
- void loop() {
- xC=snake_cols[0]; //cordinate testa snake
- yC=snake_row[0];
- if(point == 0 or point == points){
- level++;
- display.clearDisplay();
- display.setTextSize(2);
- display.setTextColor(BLACK);
- display.setCursor(0,0);
- display.print("Level:");
- display.setTextSize(2);
- display.setCursor(0,30);
- display.print(level);
- display.display();
- delay(2000);
- upLevel(level);
- point=1;
- points+=10;
- resetValues();
- }
- display.clearDisplay();
- m=analogRead(A2); //leggo valori dei button (1023 è stato premuto, 0 non è stato premuto)
- k=analogRead(A5);
- j=analogRead(A4);
- l=analogRead(A3);
- g=analogRead(A1);
- moveSnake(g,k,l,m,j);
- //lo snake ha mangiato il frutto (da destra o da sinistra)
- for(int i=0; i < 3 ; i++) {
- if((xC+i == xFruit) or (xC == xFruit+i)) { //controllo la testa dello snake(x) con cordinate x del frutto
- if((yC == yFruit) or (yC+i == yFruit) or (yC == yFruit+i)) { //controllo la testa dello snake(y) con cordinate y del frutto
- point++;
- beep(8, 2000, 10);
- xFruit = random(1, 80); //nuove cordinate frutto in modo casuale
- yFruit = random(1, 46);
- snake_lenght+=2; //aumento lunghezza snake
- drawSnake();
- }
- }
- //lo snake ha mangiato il frutto (da sopra o da sotto)
- if((yC+i == yFruit) or (yC == yFruit+i)) {
- if((xC == xFruit) or (xC+i == xFruit) or (xC == xFruit+i)) {
- point++;
- beep(8, 2000, 10);
- xFruit = random(1, 80);
- yFruit = random(1, 46);
- snake_lenght+=2;
- drawSnake();
- }
- }
- }
- /*****************/
- if(left == true) {
- if(xC==1) { //snake tocca parete sinistra
- gameover();
- }
- if(xC > 1)
- drawSnake();
- }
- /*****************/
- if(right == true){
- if(xC == MAX_WIDTH-1) //snake tocca parete destra
- gameover();
- if(xC < MAX_WIDTH-1)
- drawSnake();
- }
- /*****************/
- if(up == true){
- if(yC==1) //snake tocca parete sopra
- gameover();
- if(yC > 1)
- drawSnake();
- }
- /*****************/
- if(down == true){
- if(yC == MAX_HEIGHT-1) //snake tocca parete sotto
- gameover();
- if(yC < MAX_HEIGHT-1)
- drawSnake();
- }
- /*****************/
- //questa parte va rivista perchè non funzione (snake mangia se stesso)
- /*for (i=1; i<snake_lenght; i++)
- if ((xC == snake_row[i] and yC == snake_cols[-snake_lenght+i]))
- { gameover();
- /* Serial.print(snake_row[snake_lenght-1]);
- Serial.print(" = ");
- Serial.print(snake_row[i]);
- Serial.print(" and ");
- Serial.print(snake_cols[snake_lenght-1]);
- Serial.print(" = ");
- Serial.println(snake_cols[i]);
- }*/
- delay(time);
- }
- /***************************************/
- void resetValues() {
- snake_lenght = 10;
- for(int i=0; i<snake_lenght-1; i++) { //inizializzo posizione snake
- snake_cols[i]=i;
- snake_row[i]=(MAX_HEIGHT/2);
- }
- left=false;
- right=true;
- up=false;
- down=false;
- dr = 0;
- dc = 1;
- }
- /***************************************/
- void upLevel(int lev) {
- switch(lev) {
- case 1: time; break;
- case 2: time-=4; break;
- case 3: time-=4; break;
- case 4: time-=4; break;
- case 5: time-=4; break;
- case 6: time-=4; break;
- }
- }
- /***************************************/
- void drawSnake(){
- display.drawRect(0,0,MAX_WIDTH,MAX_HEIGHT,BLACK);
- for(int i=snake_lenght; i>0; i--)
- display.drawCircle(snake_cols[i], snake_row[i], 1, BLACK);
- display.fillRect(xFruit, yFruit, 3, 3, BLACK);
- display.display();
- for(int i=snake_lenght; i>0; i--) {
- snake_row[i] = snake_row[i-1];
- snake_cols[i] = snake_cols[i-1];
- }
- snake_row[0] += dr;
- snake_cols[0] += dc;
- }
- /***************************************/
- void direc(int d){
- switch(d) {
- case 1: { left=true ; right=false; up=false; down=false; dr = 0; dc = -1;} break;
- case 2: { left=false; right=true ; up=false; down=false; dr = 0; dc = +1;} break;
- case 3: { left=false; right=false; up=true ; down=false; dr = -1; dc = 0;} break;
- case 4: { left=false; right=false; up=false; down=true ; dr = +1; dc = 0;} break;
- }
- }
- /***************************************/
- void gameover(){
- display.clearDisplay();
- display.setTextSize(1);
- display.setTextColor(BLACK);
- display.setCursor(15,0);
- display.println("Game Over");
- display.setTextSize(1);
- display.setTextColor(BLACK);
- display.setCursor(0,20);
- display.print("points: ");
- display.setCursor(50,20);
- display.print(point-1);
- display.setCursor(0, 30);
- display.print("level: ");
- display.setCursor(50,30);
- display.print(level);
- display.display();
- delay(2500);
- display.clearDisplay();
- display.setTextSize(1);
- display.setTextColor(BLACK);
- display.setCursor(0,0);
- display.println("Try again");
- display.display();
- delay(1500);
- point=0;
- points=10;
- level=0;
- resetValues();
- }
- /***************************************/
- void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
- {
- int x;
- long delayAmount = (long)(1000000/frequencyInHertz);
- long loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2));
- for (x=0;x<loopTime;x++)
- {
- digitalWrite(speakerPin,HIGH);
- delayMicroseconds(delayAmount);
- digitalWrite(speakerPin,LOW);
- delayMicroseconds(delayAmount);
- }
- delay(2);
- //a little delay to make all notes sound separate
- }
- /***************************************/
- void moveSnake(int g, int k, int l, int m, int j) {
- if(g > 900) {
- display.clearDisplay();
- display.setTextSize(2);
- display.setTextColor(BLACK);
- display.setCursor(0,0);
- display.println("Pause");
- display.setTextSize(1);
- display.setCursor(0,20);
- display.print("points: ");
- display.setCursor(50,20);
- display.print(point-1);
- display.setCursor(0, 30);
- display.print("level: ");
- display.setCursor(50,30);
- display.print(level);
- display.display();
- delay(2500);
- }
- if(k > 900 and right==false) {
- if ((xC > 0 or xC <= display.width()-xC))
- direc(LEFT);
- }
- if(l > 900 and left==false) {
- if ((xC > 0 or xC <= display.width()-xC))
- direc(RIGHT);
- }
- if(m > 900 and down==false) {
- if((yC > 0 or yC <= display.height()-yC))
- direc(UP);
- }
- if(j > 900 and up==false) {
- if((yC > 0 or yC <= display.height()-yC))
- direc(DOWN);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement