daily pastebin goal
22%
SHARE
TWEET

arduino snake game

a guest Dec 27th, 2012 556 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_PCD8544.h>
  4.  
  5. /******** istanze ************/
  6. Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6);
  7. /********* variabili costanti *******/
  8. #define LEFT 1
  9. #define RIGHT 2
  10. #define UP 3
  11. #define DOWN 4
  12. #define MAX_WIDTH 84        //risoluzione display 84x48
  13. #define MAX_HEIGHT 48
  14.  
  15. /**/int x=5, y=5;
  16. /**/int xC, yC;                //cordinate testa snake
  17. /**/int xFruit=0, yFruit=0;    //cordinate frutto
  18. /**/int point=0, points=10;
  19. boolean left=false,right=true, up=false, down=false, pause=true;
  20. /**/int speakerPin = 8;
  21. /**/int dr = 0, dc = 1, i;
  22. /**/int snake_cols[260];    // vettore che contiene le cordinate delle singole parti dello snake { cols[0], row[0] }  corrispondono alla testa
  23. /**/int snake_row[260];     // vettore che contiene le cordinate delle singole parti dello snake { cols[snake_lenght], row[snake_lenght] } corrispondono alla coda
  24. /**/int snake_lenght = 10;  // lunghrzza snake
  25. /**/int level=0, time=20;
  26. /**/int g, m, j, l, k;      //sensori ingressi (button)
  27. /*****************************/
  28. void(* reset)(void) = 0;    //reset arduino
  29. /******** Setup *************/
  30. void setup() {
  31.   Serial.begin(9600);
  32.   randomSeed(analogRead(A0));
  33.   display.begin();
  34.   pinMode(speakerPin, OUTPUT);
  35.   pinMode(9, OUTPUT);
  36.   pinMode(10, OUTPUT);
  37.   digitalWrite(9, HIGH);
  38.   digitalWrite(10, HIGH);
  39.  
  40.   xFruit = display.width()/2;
  41.   yFruit = display.height()/2;
  42.  
  43.   display.clearDisplay();
  44.   display.setTextSize(1);
  45.   display.setTextColor(BLACK);
  46.   display.setCursor(0,0);
  47.   display.println("Snake v1.0");
  48.   display.setCursor(0,20);
  49.   display.print("Developed by: Ouarrak Ayoub");
  50.   display.display();
  51.   delay(3500);
  52.   display.clearDisplay();
  53.   display.setTextSize(2);
  54.   display.setTextColor(BLACK);
  55.   display.setCursor(0,0);
  56.   display.println("Enjoy");
  57.   display.display();
  58.   delay(2000);
  59.  
  60. }
  61. /********** Loop ***********/
  62. void loop() {
  63.   xC=snake_cols[0];        //cordinate testa snake
  64.   yC=snake_row[0];
  65.  
  66.   if(point == 0 or point == points){    
  67.     level++;
  68.     display.clearDisplay();
  69.     display.setTextSize(2);
  70.     display.setTextColor(BLACK);
  71.     display.setCursor(0,0);
  72.     display.print("Level:");
  73.     display.setTextSize(2);
  74.     display.setCursor(0,30);
  75.     display.print(level);
  76.     display.display();
  77.     delay(2000);
  78.     upLevel(level);
  79.     point=1;
  80.     points+=10;
  81.     resetValues();
  82.   }
  83.    
  84.   display.clearDisplay();
  85.    
  86.   m=analogRead(A2);    //leggo valori dei button  (1023 è stato premuto, 0 non è stato premuto)
  87.   k=analogRead(A5);
  88.   j=analogRead(A4);
  89.   l=analogRead(A3);
  90.   g=analogRead(A1);
  91.  
  92.   moveSnake(g,k,l,m,j);        
  93.  
  94.   //lo snake ha mangiato il frutto (da destra o da sinistra)
  95.   for(int i=0; i < 3 ; i++) {
  96.     if((xC+i == xFruit) or (xC == xFruit+i)) {     //controllo la testa dello snake(x) con cordinate x del frutto        
  97.       if((yC == yFruit) or (yC+i == yFruit) or (yC == yFruit+i)) { //controllo la testa dello snake(y) con cordinate y del frutto
  98.         point++;
  99.         beep(8, 2000, 10);
  100.         xFruit = random(1, 80);      //nuove cordinate frutto in modo casuale
  101.         yFruit = random(1, 46);
  102.         snake_lenght+=2;              //aumento lunghezza snake
  103.         drawSnake();
  104.       }
  105.     }
  106.     //lo snake ha mangiato il frutto (da sopra o da sotto)
  107.     if((yC+i == yFruit) or (yC == yFruit+i)) {
  108.       if((xC == xFruit) or (xC+i == xFruit) or (xC == xFruit+i)) {
  109.         point++;
  110.         beep(8, 2000, 10);
  111.         xFruit = random(1, 80);
  112.         yFruit = random(1, 46);
  113.         snake_lenght+=2;
  114.         drawSnake();
  115.       }
  116.     }
  117.   }
  118.   /*****************/
  119.   if(left == true) {
  120.     if(xC==1) {              //snake tocca parete sinistra
  121.        gameover();
  122.     }
  123.     if(xC > 1)
  124.       drawSnake();
  125.   }
  126.   /*****************/
  127.   if(right == true){
  128.     if(xC == MAX_WIDTH-1)  //snake tocca parete destra
  129.        gameover();
  130.     if(xC < MAX_WIDTH-1)  
  131.       drawSnake();
  132.   }
  133.   /*****************/
  134.   if(up == true){
  135.     if(yC==1)             //snake tocca parete sopra
  136.       gameover();
  137.     if(yC > 1)
  138.       drawSnake();
  139.   }
  140.   /*****************/
  141.   if(down == true){
  142.     if(yC == MAX_HEIGHT-1) //snake tocca parete sotto
  143.       gameover();
  144.     if(yC < MAX_HEIGHT-1)
  145.       drawSnake();
  146.   }
  147.   /*****************/
  148.   //questa parte va rivista perchè non funzione (snake mangia se stesso)
  149.    /*for (i=1; i<snake_lenght; i++)
  150.     if ((xC == snake_row[i] and yC == snake_cols[-snake_lenght+i]))
  151.      { gameover();
  152.      /* Serial.print(snake_row[snake_lenght-1]);
  153.       Serial.print(" = ");
  154.       Serial.print(snake_row[i]);
  155.       Serial.print("  and  ");
  156.       Serial.print(snake_cols[snake_lenght-1]);
  157.       Serial.print(" = ");
  158.       Serial.println(snake_cols[i]);
  159.      }*/
  160.   delay(time);
  161. }
  162. /***************************************/
  163. void resetValues() {
  164.   snake_lenght = 10;                      
  165.   for(int i=0; i<snake_lenght-1; i++) {      //inizializzo posizione snake
  166.      snake_cols[i]=i;
  167.      snake_row[i]=(MAX_HEIGHT/2);
  168.   }
  169.   left=false;
  170.   right=true;
  171.   up=false;
  172.   down=false;
  173.   dr = 0;
  174.   dc = 1;
  175. }
  176. /***************************************/
  177. void upLevel(int lev) {
  178.   switch(lev) {
  179.     case 1: time;    break;
  180.     case 2: time-=4; break;
  181.     case 3: time-=4; break;
  182.     case 4: time-=4; break;
  183.     case 5: time-=4; break;
  184.     case 6: time-=4; break;
  185.   }
  186. }
  187. /***************************************/
  188. void drawSnake(){
  189.   display.drawRect(0,0,MAX_WIDTH,MAX_HEIGHT,BLACK);
  190.  
  191.   for(int i=snake_lenght; i>0; i--)
  192.     display.drawCircle(snake_cols[i], snake_row[i], 1,  BLACK);
  193.  
  194.   display.fillRect(xFruit, yFruit, 3, 3, BLACK);  
  195.   display.display();
  196.  
  197.   for(int i=snake_lenght; i>0; i--) {
  198.     snake_row[i] = snake_row[i-1];
  199.     snake_cols[i] = snake_cols[i-1];
  200.   }
  201.   snake_row[0]  += dr;
  202.   snake_cols[0] += dc;
  203. }
  204. /***************************************/
  205. void direc(int d){
  206.   switch(d) {
  207.     case 1: { left=true ; right=false; up=false; down=false; dr = 0; dc = -1;} break;
  208.     case 2: { left=false; right=true ; up=false; down=false; dr = 0; dc = +1;} break;
  209.     case 3: { left=false; right=false; up=true ; down=false; dr = -1; dc = 0;} break;
  210.     case 4: { left=false; right=false; up=false; down=true ; dr = +1; dc = 0;} break;
  211.   }
  212. }
  213. /***************************************/
  214. void gameover(){
  215.     display.clearDisplay();
  216.     display.setTextSize(1);
  217.     display.setTextColor(BLACK);
  218.     display.setCursor(15,0);
  219.     display.println("Game Over");
  220.     display.setTextSize(1);
  221.     display.setTextColor(BLACK);
  222.     display.setCursor(0,20);
  223.     display.print("points: ");
  224.     display.setCursor(50,20);
  225.     display.print(point-1);
  226.     display.setCursor(0, 30);
  227.     display.print("level: ");
  228.     display.setCursor(50,30);
  229.     display.print(level);
  230.     display.display();
  231.     delay(2500);
  232.     display.clearDisplay();
  233.     display.setTextSize(1);
  234.     display.setTextColor(BLACK);
  235.     display.setCursor(0,0);
  236.     display.println("Try again");
  237.     display.display();
  238.     delay(1500);
  239.     point=0;
  240.     points=10;
  241.     level=0;
  242.     resetValues();
  243. }
  244. /***************************************/
  245. void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
  246. {
  247.     int x;      
  248.     long delayAmount = (long)(1000000/frequencyInHertz);
  249.     long loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2));
  250.     for (x=0;x<loopTime;x++)    
  251.     {    
  252.         digitalWrite(speakerPin,HIGH);
  253.         delayMicroseconds(delayAmount);
  254.         digitalWrite(speakerPin,LOW);
  255.         delayMicroseconds(delayAmount);
  256.     }    
  257.    
  258.     delay(2);
  259.     //a little delay to make all notes sound separate
  260. }
  261. /***************************************/        
  262. void moveSnake(int g, int k, int l, int m, int j) {
  263.     if(g > 900) {
  264.           display.clearDisplay();
  265.           display.setTextSize(2);
  266.           display.setTextColor(BLACK);
  267.           display.setCursor(0,0);
  268.           display.println("Pause");
  269.           display.setTextSize(1);
  270.           display.setCursor(0,20);
  271.           display.print("points: ");
  272.           display.setCursor(50,20);
  273.           display.print(point-1);
  274.           display.setCursor(0, 30);
  275.           display.print("level: ");
  276.           display.setCursor(50,30);
  277.           display.print(level);
  278.           display.display();
  279.           delay(2500);
  280.     }    
  281.     if(k > 900 and right==false) {
  282.       if ((xC > 0 or xC <= display.width()-xC))
  283.         direc(LEFT);
  284.     }
  285.     if(l > 900 and left==false) {
  286.       if ((xC > 0 or xC <= display.width()-xC))
  287.         direc(RIGHT);
  288.     }
  289.     if(m > 900 and down==false) {
  290.       if((yC > 0 or yC <= display.height()-yC))    
  291.         direc(UP);
  292.     }
  293.     if(j > 900 and up==false) {
  294.        if((yC > 0 or yC <= display.height()-yC))  
  295.            direc(DOWN);  
  296.     }
  297. }
RAW Paste Data
Top