Affichage de score

Bonjour,

Tout d abord, une très belle année à tous.

Je suis en train de réaliser le jeux Tetris avec un arduino Uno et un écran Oled.
J aimerai afficher la variable score, qui s incrémente à chaque fois qu une rangée est pleine.

Mon problème et que j aimerai un affichage à quatre digits « 0000 » mais évidemment quand j utilise la commande display.print(score) je ne vois qu un seul digit. Je verrai les digits 2, 3 et 4 quand le score arrivera à 10, 100, 1000.
La variable score étant un int.

Connaîtriez vous un moyen de coder ça ?

Merci

Bonjour,

L'astuce est d'afficher quatre zéros à une position X puis d'afficher la variable score a cette même position.

Les zéros seront écrasés à mesure que la variable score s’incrémentera.

Ex : 0000
Ex : 0001
...
Ex : 0255
...
Ex : 0999

scrollDisplayRight()

je ne m'y connais pas trop mais je pence que cette fonction peut être utile .

bonne année

Tu peux utiliser un afficheur 4 digit externe à l'écran

Merci pour vos réponses.

Que pensez vous d'un compteur par chiffre :

void score() {
  comptDigit_1++;

  if (comptDigit_1 == 10) {
    comptDigit_2++;
    comptDigit_1 = 0;
  }
  else if (comptDigit_2 == 10) {
    comptDigit_3++;
    comptDigit_1 = 0;
    comptDigit_2 = 0;
  }
.......
}

Du coup, question subsidiaire, les variables comptDigitX ne peuvent pas être déclaré dans la fonction void score(), elles sont forcement des variables globales ?

Merci

Bonjour,

C'est possible, mais très compliqué pour simplement gérer un compteur

Pour afficher un nombre selon le format que tu souhaites tu peux utiliser sprintf

char str[5];
sprintf(str,"%04d",score);
display.print(str);

A ta place, je ne mettrais pas un else if, mais seulement un if car si les dizaines et unités sont égales à 10 comme tu le dis, il y aura un problème

kamill:
Pour afficher un nombre selon le format que tu souhaites tu peux utiliser sprintf

char str[5];

sprintf(str,"%04d",score);
display.print(str);

C'est la plus simple et la meilleure solution...

lesept:
C'est la plus simple et la meilleure solution...

la plus simple oui - la meilleure, ça dépendra de la mémoire programme nécessaire pour le reste du code...

appeler sprintf() rajoutera une grosse librairie au programme et le binaire donc augmente.. si c'est juste pour faire de "%04d", et que la mémoire est un soucis, alors ce n'est pas la meilleure solution :slight_smile:

je n'ai pas le compilo sous la main mais testez ce code:

void afficheScore(int score)
{
  char scoreTxt[5] = "0000"; // 4 chiffres et le caractère nul
  if (score > 9999) score = 9999; // dépassement
  if (score >= 1000) itoa(score, scoreTxt, 10); // http://www.cplusplus.com/reference/cstdlib/itoa/
  else if (score >= 100) itoa(score, scoreTxt + 1, 10);
  else if (score >= 10) itoa(score, scoreTxt + 2, 10);
  else scoreTxt[3] = '0' + score;

  Serial.print(F("Le Score est ["));
  Serial.print(scoreTxt);
  Serial.println(F("]"));
}


void setup() {
  Serial.begin(115200);
  unsigned long t0 = micros();
  afficheScore(1);
  afficheScore(12);
  afficheScore(123);
  afficheScore(1234);
  Serial.println(micros() - t0);
}

void loop() {}

et comparez à la taille de celui-ci

void afficheScore(int score)
{
  char scoreTxt[5] ; // 4 chiffres et le caractère nul
  if (score > 9999) score = 9999; // dépassement
  sprintf(scoreTxt, "%04d", score);
  Serial.print(F("Le Score est ["));
  Serial.print(scoreTxt);
  Serial.println(F("]"));
}


void setup() {
  Serial.begin(115200);
  unsigned long t0 = micros();
  afficheScore(1);
  afficheScore(12);
  afficheScore(123);
  afficheScore(1234);
  Serial.println(micros() - t0);
}

void loop() {}

de mémoire c'est plus de 1300 octets de différence et je parie que c'est un chouia plus lent avec sprint qui est générique