Error de joystick en snake y problema con mensajes en matriz led 16x16

Buenas. estoy programando un snake con un esp32 en una matriz led 16x16 las cual cree yo mismo conectando dos matrices de 8x16. El problema que estoy teniendo es que el jotstick que utilizo para mover al snake funciona mas o menos bien en 3 direcciones derecha, arriba e izquierda pero cuando lo muevo para abajo funciona medio mal, a veces toma el movimiento y a veces no. Probe si era por culpa del joystick pero este es nuevo y funciona correctamente asi que debe ser algo de mi codigo.
El segundo error que se me presenta son los mensajes los cuales son SNAKE GAME el cual quiero que se muestre en ambas matrices de 8x16, es decir que arriba diga SNAKE y abajo GAME. Lo mismo con el mensaje de GAME OVER y que al finalizar este aparezca el SCORE arriba y abajo el total de frutas consumidas. Lo que pasa es que al probar esto el juego del snake se inicia y el mensaje SNAKE GAME aparece mientras el juego esta funcionando y ademas aparece todo junto lo cual no estoy buscando. Al chocar la serpiente con su propio cuerpo reinicia el juego y el mensaje GAME OVER aparece sobre el juego en funcionamiento y todo junto como el caso del snake.
Las librerias que estoy utilizando son MD_MAX72XX y MD_Parola y ademas un esp32. Puede que el codigo tenga varios errores pero estoy intentando aprender. Se agradece todo tipo de ayuda

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>


// Definiciones para el MAX7219
#define MAX7219_DIN  23  // Pin de datos
#define MAX7219_CLK  18  // Pin de reloj
#define MAX7219_CS   15  // Pin de selección

// Definiciones para el joystick
#define JOYSTICK_X_PIN 34  // Pin del eje X del joystick
#define JOYSTICK_Y_PIN 35  // Pin del eje Y del joystick
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW

// Variables para el juego Snake
const int grid_size = 16;
int snake_length = 1;
int snake_x[256], snake_y[256]; // Máximo tamaño del tablero

int fruit_x, fruit_y;
int score = 0;
int speed = 200; // Milisegundos entre movimientos (menos es más rápido)

MD_MAX72XX mx = MD_MAX72XX(MD_MAX72XX::FC16_HW, MAX7219_DIN, MAX7219_CLK, MAX7219_CS, 4);
MD_Parola P = MD_Parola(HARDWARE_TYPE, MAX7219_DIN, MAX7219_CLK, MAX7219_CS, 4);


uint8_t scrollSpeed = 60;    // default frame delay value
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_LEFT;
uint16_t scrollPause = 50; // in milliseconds

char snakeMessage[] = { "SNAKE GAME" };
char gameOverMessage[] = { "GAME OVER" };
char scoreMessage[] = { "SCORE" };


int dx = 1;
int dy = 0;

bool checkSelfCollision();
void resetGame();


void setup() {
  
Serial.begin(9600);


  pinMode(JOYSTICK_X_PIN, INPUT);
  pinMode(JOYSTICK_Y_PIN, INPUT);

  mx.begin();
  mx.control(MD_MAX72XX::INTENSITY, 2); // Brillo (ajústalo según tus preferencias)
  mx.clear();

  showSnakeMessage();
  delay(1000);

}


void loop() {

 P.displayAnimate();

  if (checkSelfCollision()) {
    resetGame();
    delay(1000);
  }

  int x_axis = analogRead(JOYSTICK_X_PIN); // Leer valor del eje X del joystick
  int y_axis = analogRead(JOYSTICK_Y_PIN); // Leer valor del eje Y del joystick

  // Mover la serpiente según los valores del joystick
  if (x_axis < 1000) {
    moveLeft();
  } else if (x_axis > 3000) {
    moveRight();
  }

  if (y_axis < 1000) {
    moveUp();
  } else if (y_axis > 3000) {
    moveDown();
  }

  // Actualizar el tablero y la serpiente
  updateSnake();
  drawSnake();
  drawFruit();

  delay(speed);
}


void spawnFruit() {
  // Generar posición aleatoria de la fruta
  fruit_x = random(grid_size);
  fruit_y = random(grid_size);
}

void drawSnake() {
  mx.clear();

  for (int i = 0; i < snake_length; i++) {
    setPunto(snake_x[i], snake_y[i], 1);  // Línea cambiada
  }
}

void drawFruit() {
  setPunto(fruit_x, fruit_y, 1);  // Línea cambiada
}


void setPunto(uint8_t x, uint16_t y, bool estado) {
  if (x >= (grid_size / 2)) {
    mx.setPoint(x - (grid_size / 2), y + grid_size, estado);
  }
  else {
    mx.setPoint(x, y, 1);
  }
}

void updateSnake() {
  for (int i = snake_length - 1; i > 0; i--) {
    snake_x[i] = snake_x[i - 1];
    snake_y[i] = snake_y[i - 1];
  }

  // Mover la cabeza de la serpiente en la dirección actual
  snake_x[0] += dx;
  snake_y[0] += dy;

  // Verificar colisiones con los bordes
  if (snake_x[0] >= grid_size) {
    snake_x[0] = 0;
  } else if (snake_x[0] < 0) {
    snake_x[0] = grid_size - 1;
  }

  if (snake_y[0] >= grid_size) {
    snake_y[0] = 0;
  } else if (snake_y[0] < 0) {
    snake_y[0] = grid_size - 1;
  }

  // Verificar si la serpiente come una fruta
  if (snake_x[0] == fruit_x && snake_y[0] == fruit_y) {
    snake_length++;
    score++;

    // Aumentar la velocidad cada 4 frutas comidas
    if (score % 4 == 0) {
      speed -= 10;
      if (speed < 50) {
        speed = 50; // Límite mínimo de velocidad
      }
    }

    spawnFruit();
  }
}

void moveLeft() {
  dx = -1;
  dy = 0;
}

void moveRight() {
  dx = 1;
  dy = 0;
}

void moveUp() {
  dx = 0;
  dy = -1;
}

void moveDown() {
  dx = 0;
  dy = 1;
}


bool checkSelfCollision() {
  for (int i = 1; i < snake_length; i++) {
    if (snake_x[0] == snake_x[i] && snake_y[0] == snake_y[i]) {
      return true; // Colisión con el propio cuerpo
    }
  }
  return false; // No hay colisión
}


void resetGame() {

  mx.clear();
  if (checkSelfCollision()){
    showGameOverMessage();
  }
  showScoreMessage();
  delay(3000);
  snake_length = 1;
  updateSnake();
  drawFruit();
  drawSnake();
 
}


void showSnakeMessage(){
  
  P.begin();  
  P.displayAnimate();
  P.displayText(snakeMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);
  
}

void showGameOverMessage() {
  
  P.begin();
  P.displayAnimate();
  P.displayText(gameOverMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);
}

void showScoreMessage() {

  P.begin();
  P.displayAnimate();
  P.displayText(scoreMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);
}





Este tema es continuación de Snake en matriz led 16x16 con esp32 - #14 by lulubin
Deberías haber seguido en ese hilo.
Saludos

tenes razon ahi lo publico en el hilo, error mio.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.