Mini Proyecto: Juego "pong" con Arduino - Programa C

Juego "pong" con Arduino


Asignatura: Interfases y microcontroladores.
- Primer parte del programa: Definimos los pines de la LCD.
- y de la bocina que estamos utilizando.

Solution:

  1. #include <NokiaLCD.h>
  2. #define PIN_SCLK  3
  3. #define PIN_SDIN  4
  4. #define PIN_DC    5
  5. #define PIN_RESET 6
  6. #define PIN_SCE   7
  7. #define OLED_RESET 8
  8. #define BEEPER    9
  9.  
  10. #define LCD_C     LOW
  11. #define LCD_D     HIGH
  12.  
  13. #define LCD_X     84
  14. #define LCD_Y     6
  15.  
  16. NokiaLCD NokiaLCD(3,4,5,6,7); // (SCK, MOSI, DC, RST, CS)
  17.  
  18. //Definimos variables adicionales que se van a utilizar.
  19. int barWidth = 16;
  20. int barHeight = 4;
  21. int ballPerimeter = 4;
  22. unsigned int bar1X = 0;
  23. unsigned int bar1Y = 0;
  24. unsigned int bar2X = 0;
  25. unsigned int bar2Y = LCD_Y * 8 - barHeight;
  26. int ballX = 0;
  27. int ballY = 0;
  28. boolean isBallUp = false;
  29. boolean isBallRight = true;
  30.  
  31. byte pixels[LCD_X][LCD_Y];
  32. unsigned long lastRefreshTime;
  33. const int refreshInterval = 150;
  34. byte gameState = 1;
  35. byte ballSpeed = 1;
  36. byte player1WinCount = 0;
  37. byte player2WinCount = 0;
  38. byte hitCount = 0;
  39.  
  40. //En el setup colocamos la configuración inicial
  41. void setup(){
  42.   Serial.begin(9600);
  43.   LcdInitialise();
  44.   restartGame();
  45.  
  46. NokiaLCD.init(); // Init screen.
  47.  NokiaLCD.clear(); // Clear screen.
  48.  
  49. }
  50. void splash()
  51. {
  52.   NokiaLCD.clear();
  53. }
  54.  
  55.  
  56. void loop(){
  57.   unsigned long now = millis();
  58.  
  59.   NokiaLCD.setCursor(1,1);
  60.  NokiaLCD.print("IPN ESIMEZ");
  61.    NokiaLCD.setCursor(2,2);
  62.  NokiaLCD.print("JUEGO PONG");
  63.  
  64.   if(now - lastRefreshTime > refreshInterval){
  65.       update();
  66.       refreshScreen();
  67.       lastRefreshTime = now;  
  68.   }  
  69. }
  70.  
  71. void restartGame(){
  72.  
  73.    ballSpeed = 1;
  74.    gameState = 1;
  75.    ballX = random(0, 60);
  76.    ballY = 20;
  77.    isBallUp = false;
  78.    isBallRight = true;
  79.    hitCount = 0;
  80. }
  81.  
  82. void refreshScreen(){
  83.   if(gameState == 1){
  84.     for(int y = 0; y < LCD_Y; y++){
  85.         for(int x = 0; x < LCD_X; x++){
  86.            byte pixel = 0x00;
  87.            int realY = y * 8;
  88.            // Llamar la pelota
  89.            if(>= ballX && x <= ballX + ballPerimeter -1 && ballY + ballPerimeter > realY && ballY < realY + 8 ){
  90.              byte ballMask = 0x00;
  91.              for(int i = 0; i < realY + 8 - ballY; i++){
  92.                ballMask = ballMask >> 1;
  93.                if(< ballPerimeter)
  94.                  ballMask = 0x80 | ballMask;
  95.              }
  96.              pixel = pixel | ballMask;
  97.            }
  98.            
  99.            // Dibujamos las barras en el eje de las X
  100.            if(>= bar1X && x <= bar1X + barWidth -1 && bar1Y + barHeight > realY && bar1Y < realY + 8 ){
  101.              byte barMask = 0x00;
  102.              for(int i = 0; i < realY + 8 - bar1Y; i++){
  103.                barMask = barMask >> 1;
  104.                if(< barHeight)
  105.                  barMask = 0x80 | barMask;
  106.              }
  107.              pixel = pixel | barMask;
  108.            }
  109.            
  110.            if(>= bar2X && x <= bar2X + barWidth -1 && bar2Y + barHeight > realY && bar2Y < realY + 8 ){
  111.              byte barMask = 0x00;
  112.              for(int i = 0; i < realY + 8 - bar2Y; i++){
  113.                barMask = barMask >> 1;
  114.                if(< barHeight)
  115.                  barMask = 0x80 | barMask;
  116.              }
  117.              pixel = pixel | barMask;
  118.            }
  119.            LcdWrite(LCD_D, pixel);
  120.          }
  121.     }
  122.   } else if(gameState == 2){
  123.      
  124.   }
  125. }
  126.  
  127. void update(){
  128.   if(gameState == 1){
  129.      int barMargin = LCD_X - barWidth;
  130.      int pot1 = analogRead(A0); //Se lee el valor de los pot y confifuramos su posición
  131.      int pot2 = analogRead(A1);
  132.      //Debido a que los pot son de 10K el valor que le asignamos fue de 445
  133.      bar1X = pot1 / 2 * LCD_X / 445;
  134.      bar2X = pot2 / 2 * LCD_X / 445;
  135.    
  136.      if(bar1X > barMargin) bar1X = barMargin;
  137.      if(bar2X > barMargin) bar2X = barMargin;
  138.      
  139.      //Mover la pelota del PONG
  140.      if(isBallUp)
  141.        ballY -= ballSpeed;
  142.      else
  143.        ballY += ballSpeed;
  144.      if(isBallRight)
  145.        ballX += ballSpeed;
  146.      else
  147.        ballX -= ballSpeed;
  148.      //Comprobamos las colisiones  
  149.      if(ballX < 1){
  150.        isBallRight = true;
  151.        ballX = 0;
  152.      }
  153.      else if(ballX > LCD_X - ballPerimeter - 1){
  154.        isBallRight = false;
  155.        ballX = LCD_X - ballPerimeter;
  156.      }
  157.      if(ballY < barHeight){
  158.        if(ballX + ballPerimeter >= bar1X && ballX <= bar1X + barWidth){
  159.          isBallUp = false;
  160.          if(ballX + ballPerimeter/2 < bar1X + barWidth/2)
  161.            isBallRight = false;
  162.          else
  163.            isBallRight = true;
  164.          ballY = barHeight;
  165.          if(++hitCount % 10 == 0 && ballSpeed < 5)
  166.            ballSpeed++;
  167.        }else{ //Jugador 2 es el ganador
  168.          gameState = 2;
  169.          player2WinCount++;
  170.        }
  171.      }
  172.      if(ballY + ballPerimeter > LCD_Y * 8 - barHeight){
  173.        if(ballX + ballPerimeter >= bar2X && ballX <= bar2X + barWidth){ //ball bounces from bar2
  174.          isBallUp = true;
  175.          if(ballX + ballPerimeter/2 < bar2X + barWidth/2)
  176.            isBallRight = false;
  177.          else
  178.            isBallRight = true;
  179.          ballY = LCD_Y * 8 - barHeight - ballPerimeter;
  180.          if(++hitCount % 10 == 0 && ballSpeed < 5)
  181.            ballSpeed++;
  182.        }else{ // El jugador 1 es el ganador
  183.          gameState = 2;
  184.          player1WinCount++;
  185.        }
  186.      }
  187.   }else if(gameState == 2){
  188.       for(int i =0; i < 4; i++){
  189.         LcdWrite(LCD_C, 0x0D );  // Pantalla nokia en modo inverso
  190.         delay(30);
  191.         LcdWrite(LCD_C, 0x0C );  // Pantalla nokia en modo inverso
  192.         delay(30);
  193.       }
  194.       restartGame();
  195.   }  
  196. }
  197.  
  198. void LcdInitialise(void){
  199.   pinMode(PIN_SCE, OUTPUT);
  200.   pinMode(PIN_RESET, OUTPUT);
  201.   pinMode(PIN_DC, OUTPUT);
  202.   pinMode(PIN_SDIN, OUTPUT);
  203.   pinMode(PIN_SCLK, OUTPUT);
  204.   delay(20);
  205.   digitalWrite(PIN_RESET, LOW);
  206.   delay(50);
  207.   digitalWrite(PIN_RESET, HIGH);
  208.   LcdWrite(LCD_C, 0x21 );
  209.   LcdWrite(LCD_C, 0xB1 );  
  210.   LcdWrite(LCD_C, 0x04 );  
  211.   LcdWrite(LCD_C, 0x14 );
  212.   LcdWrite(LCD_C, 0x0C );  
  213.   LcdWrite(LCD_C, 0x20 );
  214.   LcdWrite(LCD_C, 0x80 );
  215.   LcdWrite(LCD_C, 0x40 );
  216.   LcdWrite(LCD_C, 0x0C );
  217. }
  218.  
  219. void LcdWrite(byte dc, byte data){
  220.   digitalWrite(PIN_DC, dc);
  221.   digitalWrite(PIN_SCE, LOW);
  222.   shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
  223.   digitalWrite(PIN_SCE, HIGH);
  224. }


Learn More :